[tilemill] 02/04: Include node-bones from upstream

Ross Gammon ross-guest at moszumanska.debian.org
Fri Apr 4 18:40:53 UTC 2014


This is an automated email from the git hooks/post-receive script.

ross-guest pushed a commit to branch master
in repository tilemill.

commit f861e5d22f2467fbefd94060a5ddd4dee2f851dc
Author: Ross Gammon <rossgammon at mail.dk>
Date:   Fri Apr 4 20:32:25 2014 +0200

    Include node-bones from upstream
    
    The node-bones package in Debian is the wrong version and upstream
    recommended including their version.
---
 debian/node_modules/bones/.npmignore               |    2 +
 debian/node_modules/bones/LICENSE                  |   27 +
 debian/node_modules/bones/README.md                |   20 +
 debian/node_modules/bones/assets/debug.js          |   12 +
 debian/node_modules/bones/assets/jquery.js         |   16 +
 debian/node_modules/bones/bones.js                 |   34 +
 debian/node_modules/bones/client/backbone.js       |  135 +
 .../node_modules/bones/client/controller.prefix.js |    4 +
 .../node_modules/bones/client/controller.suffix.js |    5 +
 debian/node_modules/bones/client/model.prefix.js   |    4 +
 debian/node_modules/bones/client/model.suffix.js   |    5 +
 .../node_modules/bones/client/template.prefix.js   |    4 +
 .../node_modules/bones/client/template.suffix.js   |    5 +
 debian/node_modules/bones/client/utils.js          |   45 +
 debian/node_modules/bones/client/view.prefix.js    |    4 +
 debian/node_modules/bones/client/view.suffix.js    |    5 +
 debian/node_modules/bones/commands/start.bones     |   27 +
 .../bones/examples/simple/assets/app.css           |    0
 .../bones/examples/simple/assets/app.js            |    7 +
 .../examples/simple/controllers/Default.bones      |    3 +
 .../bones/examples/simple/controllers/Home.bones   |   16 +
 .../examples/simple/controllers/Other.server.bones |    3 +
 debian/node_modules/bones/examples/simple/index.js |    6 +
 .../bones/examples/simple/models/Foo.bones         |    5 +
 .../bones/examples/simple/models/Foo.server.bones  |    6 +
 .../bones/examples/simple/package.json             |    4 +
 .../bones/examples/simple/templates/Home._         |   19 +
 .../bones/examples/simple/views/Foo.bones          |   11 +
 .../bones/examples/simple/views/Foo.server.bones   |    6 +
 .../bones/examples/simple/views/Home.bones         |   11 +
 .../bones/examples/simple/views/home.server.bones  |    6 +
 .../node_modules/bones/node_modules/.bin/express   |    1 +
 .../bones/node_modules/backbone/.npmignore         |    1 +
 .../bones/node_modules/backbone/LICENSE            |   22 +
 .../bones/node_modules/backbone/README             |   25 +
 .../bones/node_modules/backbone/Rakefile           |   42 +
 .../bones/node_modules/backbone/backbone-min.js    |   27 +
 .../bones/node_modules/backbone/backbone.js        | 1011 +++
 .../backbone/docs/backbone-localstorage.html       |   56 +
 .../bones/node_modules/backbone/docs/backbone.html |  640 ++
 .../bones/node_modules/backbone/docs/docco.css     |  186 +
 .../node_modules/backbone/docs/images/arrows.png   |  Bin 0 -> 1235 bytes
 .../backbone/docs/images/backbone-mobile.png       |  Bin 0 -> 91367 bytes
 .../node_modules/backbone/docs/images/backbone.png |  Bin 0 -> 30207 bytes
 .../backbone/docs/images/background.png            |  Bin 0 -> 2108 bytes
 .../backbone/docs/images/dc-workspace.png          |  Bin 0 -> 103926 bytes
 .../node_modules/backbone/docs/images/todos.png    |  Bin 0 -> 41820 bytes
 .../bones/node_modules/backbone/docs/jsl.conf      |   44 +
 .../bones/node_modules/backbone/docs/todos.html    |  126 +
 .../backbone/examples/backbone-localstorage.js     |   84 +
 .../backbone/examples/todos/destroy.png            |  Bin 0 -> 555 bytes
 .../backbone/examples/todos/index.html             |   87 +
 .../node_modules/backbone/examples/todos/todos.css |  311 +
 .../node_modules/backbone/examples/todos/todos.js  |  256 +
 .../bones/node_modules/backbone/index.html         | 1945 +++++
 .../bones/node_modules/backbone/package.json       |   27 +
 .../bones/node_modules/express/.npmignore          |    7 +
 .../bones/node_modules/express/History.md          |  823 ++
 .../bones/node_modules/express/LICENSE             |   22 +
 .../bones/node_modules/express/Makefile            |   29 +
 .../bones/node_modules/express/Readme.md           |  145 +
 .../bones/node_modules/express/bin/express         |  423 +
 .../bones/node_modules/express/index.js            |    2 +
 .../bones/node_modules/express/lib/express.js      |   79 +
 .../bones/node_modules/express/lib/http.js         |  582 ++
 .../bones/node_modules/express/lib/https.js        |   52 +
 .../bones/node_modules/express/lib/request.js      |  357 +
 .../bones/node_modules/express/lib/response.js     |  459 +
 .../node_modules/express/lib/router/collection.js  |   53 +
 .../bones/node_modules/express/lib/router/index.js |  398 +
 .../node_modules/express/lib/router/methods.js     |   79 +
 .../bones/node_modules/express/lib/router/route.js |   88 +
 .../bones/node_modules/express/lib/utils.js        |  152 +
 .../bones/node_modules/express/lib/view.js         |  460 +
 .../bones/node_modules/express/lib/view/partial.js |   40 +
 .../bones/node_modules/express/lib/view/view.js    |  210 +
 .../express/node_modules/connect/.npmignore        |   11 +
 .../express/node_modules/connect/LICENSE           |   24 +
 .../express/node_modules/connect/index.js          |    2 +
 .../express/node_modules/connect/lib/cache.js      |   81 +
 .../express/node_modules/connect/lib/connect.js    |  106 +
 .../express/node_modules/connect/lib/http.js       |  218 +
 .../express/node_modules/connect/lib/https.js      |   47 +
 .../express/node_modules/connect/lib/index.js      |   46 +
 .../connect/lib/middleware/basicAuth.js            |   93 +
 .../connect/lib/middleware/bodyParser.js           |  196 +
 .../connect/lib/middleware/compiler.js             |  163 +
 .../connect/lib/middleware/compress.js             |  146 +
 .../connect/lib/middleware/cookieParser.js         |   46 +
 .../node_modules/connect/lib/middleware/csrf.js    |  105 +
 .../connect/lib/middleware/directory.js            |  222 +
 .../connect/lib/middleware/errorHandler.js         |  100 +
 .../node_modules/connect/lib/middleware/favicon.js |   76 +
 .../node_modules/connect/lib/middleware/limit.js   |   80 +
 .../node_modules/connect/lib/middleware/logger.js  |  299 +
 .../connect/lib/middleware/methodOverride.js       |   38 +
 .../connect/lib/middleware/profiler.js             |  100 +
 .../node_modules/connect/lib/middleware/query.js   |   40 +
 .../connect/lib/middleware/responseTime.js         |   34 +
 .../node_modules/connect/lib/middleware/router.js  |  379 +
 .../node_modules/connect/lib/middleware/session.js |  345 +
 .../connect/lib/middleware/session/cookie.js       |  126 +
 .../connect/lib/middleware/session/memory.js       |  131 +
 .../connect/lib/middleware/session/session.js      |  137 +
 .../connect/lib/middleware/session/store.js        |   87 +
 .../node_modules/connect/lib/middleware/static.js  |  225 +
 .../connect/lib/middleware/staticCache.js          |  175 +
 .../node_modules/connect/lib/middleware/vhost.js   |   44 +
 .../express/node_modules/connect/lib/patch.js      |   79 +
 .../node_modules/connect/lib/public/directory.html |   75 +
 .../node_modules/connect/lib/public/error.html     |   13 +
 .../node_modules/connect/lib/public/favicon.ico    |  Bin 0 -> 1406 bytes
 .../node_modules/connect/lib/public/icons/page.png |  Bin 0 -> 635 bytes
 .../connect/lib/public/icons/page_add.png          |  Bin 0 -> 739 bytes
 .../connect/lib/public/icons/page_attach.png       |  Bin 0 -> 794 bytes
 .../connect/lib/public/icons/page_code.png         |  Bin 0 -> 818 bytes
 .../connect/lib/public/icons/page_copy.png         |  Bin 0 -> 663 bytes
 .../connect/lib/public/icons/page_delete.png       |  Bin 0 -> 740 bytes
 .../connect/lib/public/icons/page_edit.png         |  Bin 0 -> 807 bytes
 .../connect/lib/public/icons/page_error.png        |  Bin 0 -> 793 bytes
 .../connect/lib/public/icons/page_excel.png        |  Bin 0 -> 817 bytes
 .../connect/lib/public/icons/page_find.png         |  Bin 0 -> 879 bytes
 .../connect/lib/public/icons/page_gear.png         |  Bin 0 -> 833 bytes
 .../connect/lib/public/icons/page_go.png           |  Bin 0 -> 779 bytes
 .../connect/lib/public/icons/page_green.png        |  Bin 0 -> 621 bytes
 .../connect/lib/public/icons/page_key.png          |  Bin 0 -> 801 bytes
 .../connect/lib/public/icons/page_lightning.png    |  Bin 0 -> 839 bytes
 .../connect/lib/public/icons/page_link.png         |  Bin 0 -> 830 bytes
 .../connect/lib/public/icons/page_paintbrush.png   |  Bin 0 -> 813 bytes
 .../connect/lib/public/icons/page_paste.png        |  Bin 0 -> 703 bytes
 .../connect/lib/public/icons/page_red.png          |  Bin 0 -> 641 bytes
 .../connect/lib/public/icons/page_refresh.png      |  Bin 0 -> 858 bytes
 .../connect/lib/public/icons/page_save.png         |  Bin 0 -> 774 bytes
 .../connect/lib/public/icons/page_white.png        |  Bin 0 -> 294 bytes
 .../lib/public/icons/page_white_acrobat.png        |  Bin 0 -> 591 bytes
 .../lib/public/icons/page_white_actionscript.png   |  Bin 0 -> 664 bytes
 .../connect/lib/public/icons/page_white_add.png    |  Bin 0 -> 512 bytes
 .../connect/lib/public/icons/page_white_c.png      |  Bin 0 -> 587 bytes
 .../connect/lib/public/icons/page_white_camera.png |  Bin 0 -> 656 bytes
 .../connect/lib/public/icons/page_white_cd.png     |  Bin 0 -> 666 bytes
 .../connect/lib/public/icons/page_white_code.png   |  Bin 0 -> 603 bytes
 .../lib/public/icons/page_white_code_red.png       |  Bin 0 -> 587 bytes
 .../lib/public/icons/page_white_coldfusion.png     |  Bin 0 -> 592 bytes
 .../lib/public/icons/page_white_compressed.png     |  Bin 0 -> 724 bytes
 .../connect/lib/public/icons/page_white_copy.png   |  Bin 0 -> 309 bytes
 .../lib/public/icons/page_white_cplusplus.png      |  Bin 0 -> 621 bytes
 .../connect/lib/public/icons/page_white_csharp.png |  Bin 0 -> 700 bytes
 .../connect/lib/public/icons/page_white_cup.png    |  Bin 0 -> 639 bytes
 .../lib/public/icons/page_white_database.png       |  Bin 0 -> 579 bytes
 .../connect/lib/public/icons/page_white_delete.png |  Bin 0 -> 536 bytes
 .../connect/lib/public/icons/page_white_dvd.png    |  Bin 0 -> 638 bytes
 .../connect/lib/public/icons/page_white_edit.png   |  Bin 0 -> 618 bytes
 .../connect/lib/public/icons/page_white_error.png  |  Bin 0 -> 623 bytes
 .../connect/lib/public/icons/page_white_excel.png  |  Bin 0 -> 663 bytes
 .../connect/lib/public/icons/page_white_find.png   |  Bin 0 -> 676 bytes
 .../connect/lib/public/icons/page_white_flash.png  |  Bin 0 -> 582 bytes
 .../lib/public/icons/page_white_freehand.png       |  Bin 0 -> 639 bytes
 .../connect/lib/public/icons/page_white_gear.png   |  Bin 0 -> 402 bytes
 .../connect/lib/public/icons/page_white_get.png    |  Bin 0 -> 516 bytes
 .../connect/lib/public/icons/page_white_go.png     |  Bin 0 -> 612 bytes
 .../connect/lib/public/icons/page_white_h.png      |  Bin 0 -> 603 bytes
 .../lib/public/icons/page_white_horizontal.png     |  Bin 0 -> 296 bytes
 .../connect/lib/public/icons/page_white_key.png    |  Bin 0 -> 616 bytes
 .../lib/public/icons/page_white_lightning.png      |  Bin 0 -> 669 bytes
 .../connect/lib/public/icons/page_white_link.png   |  Bin 0 -> 614 bytes
 .../lib/public/icons/page_white_magnify.png        |  Bin 0 -> 554 bytes
 .../connect/lib/public/icons/page_white_medal.png  |  Bin 0 -> 706 bytes
 .../connect/lib/public/icons/page_white_office.png |  Bin 0 -> 779 bytes
 .../connect/lib/public/icons/page_white_paint.png  |  Bin 0 -> 688 bytes
 .../lib/public/icons/page_white_paintbrush.png     |  Bin 0 -> 618 bytes
 .../connect/lib/public/icons/page_white_paste.png  |  Bin 0 -> 620 bytes
 .../connect/lib/public/icons/page_white_php.png    |  Bin 0 -> 538 bytes
 .../lib/public/icons/page_white_picture.png        |  Bin 0 -> 650 bytes
 .../lib/public/icons/page_white_powerpoint.png     |  Bin 0 -> 588 bytes
 .../connect/lib/public/icons/page_white_put.png    |  Bin 0 -> 523 bytes
 .../connect/lib/public/icons/page_white_ruby.png   |  Bin 0 -> 626 bytes
 .../connect/lib/public/icons/page_white_stack.png  |  Bin 0 -> 317 bytes
 .../connect/lib/public/icons/page_white_star.png   |  Bin 0 -> 565 bytes
 .../connect/lib/public/icons/page_white_swoosh.png |  Bin 0 -> 634 bytes
 .../connect/lib/public/icons/page_white_text.png   |  Bin 0 -> 342 bytes
 .../lib/public/icons/page_white_text_width.png     |  Bin 0 -> 315 bytes
 .../connect/lib/public/icons/page_white_tux.png    |  Bin 0 -> 668 bytes
 .../connect/lib/public/icons/page_white_vector.png |  Bin 0 -> 644 bytes
 .../lib/public/icons/page_white_visualstudio.png   |  Bin 0 -> 702 bytes
 .../connect/lib/public/icons/page_white_width.png  |  Bin 0 -> 309 bytes
 .../connect/lib/public/icons/page_white_word.png   |  Bin 0 -> 651 bytes
 .../connect/lib/public/icons/page_white_world.png  |  Bin 0 -> 734 bytes
 .../connect/lib/public/icons/page_white_wrench.png |  Bin 0 -> 613 bytes
 .../connect/lib/public/icons/page_white_zip.png    |  Bin 0 -> 386 bytes
 .../connect/lib/public/icons/page_word.png         |  Bin 0 -> 777 bytes
 .../connect/lib/public/icons/page_world.png        |  Bin 0 -> 903 bytes
 .../node_modules/connect/lib/public/style.css      |  141 +
 .../express/node_modules/connect/lib/utils.js      |  451 +
 .../connect/node_modules/formidable/.npmignore     |    4 +
 .../connect/node_modules/formidable/.travis.yml    |    5 +
 .../connect/node_modules/formidable/LICENSE        |    7 +
 .../connect/node_modules/formidable/Readme.md      |  419 +
 .../formidable/benchmark/bench-multipart-parser.js |   71 +
 .../node_modules/formidable/example/json.js        |   67 +
 .../node_modules/formidable/example/post.js        |   43 +
 .../node_modules/formidable/example/upload.js      |   48 +
 .../connect/node_modules/formidable/index.js       |    1 +
 .../connect/node_modules/formidable/lib/file.js    |   72 +
 .../node_modules/formidable/lib/incoming_form.js   |  535 ++
 .../connect/node_modules/formidable/lib/index.js   |    3 +
 .../node_modules/formidable/lib/json_parser.js     |   35 +
 .../formidable/lib/multipart_parser.js             |  324 +
 .../node_modules/formidable/lib/octet_parser.js    |   20 +
 .../formidable/lib/querystring_parser.js           |   27 +
 .../connect/node_modules/formidable/package.json   |   38 +
 .../connect/node_modules/formidable/tool/record.js |   47 +
 .../express/node_modules/connect/package.json      |   45 +
 .../express/node_modules/connect/test.js           |   15 +
 .../node_modules/express/node_modules/mime/LICENSE |   19 +
 .../express/node_modules/mime/README.md            |   50 +
 .../node_modules/express/node_modules/mime/mime.js |   92 +
 .../express/node_modules/mime/package.json         |   37 +
 .../node_modules/express/node_modules/mime/test.js |   79 +
 .../express/node_modules/mime/types/mime.types     | 1479 ++++
 .../express/node_modules/mime/types/node.types     |   43 +
 .../express/node_modules/mkdirp/.npmignore         |    2 +
 .../express/node_modules/mkdirp/LICENSE            |   21 +
 .../express/node_modules/mkdirp/README.markdown    |   54 +
 .../express/node_modules/mkdirp/examples/pow.js    |    6 +
 .../express/node_modules/mkdirp/index.js           |   79 +
 .../express/node_modules/mkdirp/package.json       |   36 +
 .../express/node_modules/qs/.npmignore             |    1 +
 .../express/node_modules/qs/.travis.yml            |    4 +
 .../express/node_modules/qs/History.md             |   73 +
 .../node_modules/express/node_modules/qs/Makefile  |    5 +
 .../node_modules/express/node_modules/qs/Readme.md |   54 +
 .../express/node_modules/qs/benchmark.js           |   17 +
 .../express/node_modules/qs/examples.js            |   51 +
 .../node_modules/express/node_modules/qs/index.js  |    2 +
 .../express/node_modules/qs/lib/querystring.js     |  264 +
 .../express/node_modules/qs/package.json           |   29 +
 .../bones/node_modules/express/package.json        |   71 +
 .../bones/node_modules/express/test.js             |   12 +
 .../bones/node_modules/jquery/node-jquery.js       | 9068 ++++++++++++++++++++
 .../jquery/node_modules/htmlparser/.project        |   17 +
 .../node_modules/htmlparser/.settings/.jsdtscope   |    6 +
 .../.settings/org.eclipse.core.resources.prefs     |    3 +
 .../org.eclipse.wst.jsdt.ui.superType.container    |    1 +
 .../org.eclipse.wst.jsdt.ui.superType.name         |    1 +
 .../jquery/node_modules/htmlparser/CHANGELOG       |   47 +
 .../jquery/node_modules/htmlparser/LICENSE         |   18 +
 .../jquery/node_modules/htmlparser/README.md       |  247 +
 .../node_modules/jquery/node_modules/htmlparser/a  |   20 +
 .../node_modules/jquery/node_modules/htmlparser/b  |   26 +
 .../node_modules/jquery/node_modules/htmlparser/c  |   35 +
 .../jquery/node_modules/htmlparser/json2.js        |  482 ++
 .../node_modules/htmlparser/lib/htmlparser.js      |  823 ++
 .../node_modules/htmlparser/lib/htmlparser.min.js  |   22 +
 .../node_modules/htmlparser/lib/node-htmlparser.js |    6 +
 .../htmlparser/lib/node-htmlparser.min.js          |    6 +
 .../jquery/node_modules/htmlparser/new/a           |    6 +
 .../jquery/node_modules/htmlparser/new/b           |    6 +
 .../jquery/node_modules/htmlparser/new/compat.js   |  954 ++
 .../node_modules/htmlparser/new/htmlparser.js      |  645 ++
 .../jquery/node_modules/htmlparser/new/parser.zip  |  Bin 0 -> 6706 bytes
 .../jquery/node_modules/htmlparser/new/test01.js   |  258 +
 .../jquery/node_modules/htmlparser/new/test02.js   |  856 ++
 .../jquery/node_modules/htmlparser/newparser.js    |   54 +
 .../node_modules/htmlparser/node-htmlparser.old.js |  754 ++
 .../jquery/node_modules/htmlparser/package.json    |   41 +
 .../jquery/node_modules/htmlparser/profile         |    4 +
 .../node_modules/htmlparser/profile.getelement.js  |   53 +
 .../node_modules/htmlparser/profile.getelement.txt |  199 +
 .../jquery/node_modules/htmlparser/profile.js      |   63 +
 .../node_modules/htmlparser/profileresults.txt     |  301 +
 .../htmlparser/pulls/node-htmlparser/CHANGELOG     |    9 +
 .../htmlparser/pulls/node-htmlparser/LICENSE       |   18 +
 .../htmlparser/pulls/node-htmlparser/README.md     |  186 +
 .../htmlparser/pulls/node-htmlparser/json2.js      |  482 ++
 .../pulls/node-htmlparser/lib/node-htmlparser.js   |  772 ++
 .../node-htmlparser/lib/node-htmlparser.min.js     |   22 +
 .../htmlparser/pulls/node-htmlparser/package.json  |   23 +
 .../htmlparser/pulls/node-htmlparser/profile.js    |   63 +
 .../htmlparser/pulls/node-htmlparser/runtests.html |  107 +
 .../htmlparser/pulls/node-htmlparser/runtests.js   |   75 +
 .../pulls/node-htmlparser/runtests.min.html        |  107 +
 .../pulls/node-htmlparser/runtests.min.js          |   75 +
 .../htmlparser/pulls/node-htmlparser/snippet.js    |   15 +
 .../pulls/node-htmlparser/tests/01-basic.js        |   57 +
 .../pulls/node-htmlparser/tests/02-single_tag_1.js |   35 +
 .../pulls/node-htmlparser/tests/03-single_tag_2.js |   36 +
 .../tests/04-unescaped_in_script.js                |   52 +
 .../node-htmlparser/tests/05-tags_in_comment.js    |   44 +
 .../node-htmlparser/tests/06-comment_in_script.js  |   44 +
 .../node-htmlparser/tests/07-unescaped_in_style.js |   45 +
 .../tests/08-extra_spaces_in_tag.js                |   45 +
 .../node-htmlparser/tests/09-unquoted_attrib.js    |   45 +
 .../node-htmlparser/tests/10-singular_attribute.js |   39 +
 .../node-htmlparser/tests/11-text_outside_tags.js  |   46 +
 .../pulls/node-htmlparser/tests/12-text_only.js    |   37 +
 .../node-htmlparser/tests/13-comment_in_text.js    |   45 +
 .../tests/14-comment_in_text_in_script.js          |   53 +
 .../pulls/node-htmlparser/tests/15-non-verbose.js  |   43 +
 .../node-htmlparser/tests/16-ignore_whitespace.js  |   68 +
 .../node-htmlparser/tests/17-xml_namespace.js      |   34 +
 .../node-htmlparser/tests/18-enforce_empty_tags.js |   36 +
 .../node-htmlparser/tests/19-ignore_empty_tags.js  |   38 +
 .../pulls/node-htmlparser/tests/20-rss.js          |  117 +
 .../pulls/node-htmlparser/tests/21-atom.js         |   77 +
 .../pulls/node-htmlparser/utils_example.js         |   35 +
 .../jquery/node_modules/htmlparser/rssbug.js       |   16 +
 .../jquery/node_modules/htmlparser/rssbug.rss      |    1 +
 .../jquery/node_modules/htmlparser/runtests.html   |  108 +
 .../jquery/node_modules/htmlparser/runtests.js     |   75 +
 .../node_modules/htmlparser/runtests.min.html      |  108 +
 .../jquery/node_modules/htmlparser/runtests.min.js |   75 +
 .../jquery/node_modules/htmlparser/runtests_new.js |   75 +
 .../jquery/node_modules/htmlparser/snippet.js      |   15 +
 .../jquery/node_modules/htmlparser/test01.js       |  105 +
 .../node_modules/htmlparser/testdata/api.html      | 3311 +++++++
 .../htmlparser/testdata/getelement.html            | 3460 ++++++++
 .../htmlparser/testdata/trackerchecker.html        | 2733 ++++++
 .../node_modules/htmlparser/tests/01-basic.js      |   61 +
 .../htmlparser/tests/02-single_tag_1.js            |   39 +
 .../htmlparser/tests/03-single_tag_2.js            |   40 +
 .../htmlparser/tests/04-unescaped_in_script.js     |   56 +
 .../htmlparser/tests/05-tags_in_comment.js         |   48 +
 .../htmlparser/tests/06-comment_in_script.js       |   48 +
 .../htmlparser/tests/07-unescaped_in_style.js      |   49 +
 .../htmlparser/tests/08-extra_spaces_in_tag.js     |   49 +
 .../htmlparser/tests/09-unquoted_attrib.js         |   49 +
 .../htmlparser/tests/10-singular_attribute.js      |   43 +
 .../htmlparser/tests/11-text_outside_tags.js       |   50 +
 .../node_modules/htmlparser/tests/12-text_only.js  |   41 +
 .../htmlparser/tests/13-comment_in_text.js         |   49 +
 .../tests/14-comment_in_text_in_script.js          |   57 +
 .../htmlparser/tests/15-non-verbose.js             |   46 +
 .../htmlparser/tests/16-ignore_whitespace.js       |   71 +
 .../htmlparser/tests/17-xml_namespace.js           |   38 +
 .../htmlparser/tests/18-enforce_empty_tags.js      |   40 +
 .../htmlparser/tests/19-ignore_empty_tags.js       |   41 +
 .../jquery/node_modules/htmlparser/tests/20-rss.js |  120 +
 .../node_modules/htmlparser/tests/21-atom.js       |   80 +
 .../htmlparser/tests/22-position_data.js           |  100 +
 .../jquery/node_modules/htmlparser/tmp/snippet.js  |   13 +
 .../node_modules/htmlparser/utils_example.js       |   35 +
 .../jquery/node_modules/htmlparser/v8.log          | 1956 +++++
 .../jquery/node_modules/jsdom/LICENSE.txt          |   22 +
 .../jquery/node_modules/jsdom/README.md            |  335 +
 .../jquery/node_modules/jsdom/lib/jsdom.js         |  364 +
 .../jsdom/lib/jsdom/browser/documentfeatures.js    |   52 +
 .../jsdom/lib/jsdom/browser/domtohtml.js           |  174 +
 .../jsdom/lib/jsdom/browser/history.js             |   99 +
 .../jsdom/lib/jsdom/browser/htmlencoding.js        | 1506 ++++
 .../jsdom/lib/jsdom/browser/htmltodom.js           |  194 +
 .../node_modules/jsdom/lib/jsdom/browser/index.js  |  630 ++
 .../jsdom/lib/jsdom/browser/location.js            |   98 +
 .../node_modules/jsdom/lib/jsdom/browser/utils.js  |   12 +
 .../node_modules/jsdom/lib/jsdom/level1/core.js    | 1786 ++++
 .../node_modules/jsdom/lib/jsdom/level2/core.js    |  643 ++
 .../node_modules/jsdom/lib/jsdom/level2/events.js  |  411 +
 .../node_modules/jsdom/lib/jsdom/level2/html.js    | 1966 +++++
 .../node_modules/jsdom/lib/jsdom/level2/index.js   |    7 +
 .../jsdom/lib/jsdom/level2/languages/javascript.js |   13 +
 .../node_modules/jsdom/lib/jsdom/level2/style.js   |  268 +
 .../node_modules/jsdom/lib/jsdom/level3/core.js    |  658 ++
 .../node_modules/jsdom/lib/jsdom/level3/events.js  |  299 +
 .../node_modules/jsdom/lib/jsdom/level3/html.js    |    9 +
 .../node_modules/jsdom/lib/jsdom/level3/index.js   |   10 +
 .../node_modules/jsdom/lib/jsdom/level3/ls.js      |  221 +
 .../node_modules/jsdom/lib/jsdom/level3/xpath.js   | 1858 ++++
 .../jsdom/lib/jsdom/selectors/index.js             |   31 +
 .../jquery/node_modules/jsdom/lib/jsdom/utils.js   |   41 +
 .../jsdom/node_modules/contextify/.npmignore       |   12 +
 .../jsdom/node_modules/contextify/LICENSE.txt      |   22 +
 .../jsdom/node_modules/contextify/README.md        |  106 +
 .../jsdom/node_modules/contextify/binding.gyp      |    8 +
 .../jsdom/node_modules/contextify/changelog        |   47 +
 .../node_modules/contextify/lib/contextify.js      |   48 +
 .../contextify/node_modules/bindings/README.md     |   97 +
 .../contextify/node_modules/bindings/bindings.js   |  159 +
 .../contextify/node_modules/bindings/package.json  |   31 +
 .../jsdom/node_modules/contextify/package.json     |   52 +
 .../node_modules/contextify/src/contextify.cc      |  312 +
 .../jsdom/node_modules/contextify/wscript          |   18 +
 .../jsdom/node_modules/cssom/.npmignore            |    7 +
 .../jsdom/node_modules/cssom/README.mdown          |   34 +
 .../node_modules/cssom/lib/CSSFontFaceRule.js      |   34 +
 .../jsdom/node_modules/cssom/lib/CSSImportRule.js  |  131 +
 .../node_modules/cssom/lib/CSSKeyframeRule.js      |   35 +
 .../node_modules/cssom/lib/CSSKeyframesRule.js     |   37 +
 .../jsdom/node_modules/cssom/lib/CSSMediaRule.js   |   39 +
 .../jsdom/node_modules/cssom/lib/CSSRule.js        |   39 +
 .../node_modules/cssom/lib/CSSStyleDeclaration.js  |  148 +
 .../jsdom/node_modules/cssom/lib/CSSStyleRule.js   |  189 +
 .../jsdom/node_modules/cssom/lib/CSSStyleSheet.js  |   87 +
 .../jsdom/node_modules/cssom/lib/MediaList.js      |   61 +
 .../jsdom/node_modules/cssom/lib/StyleSheet.js     |   17 +
 .../jsdom/node_modules/cssom/lib/clone.js          |   76 +
 .../jsdom/node_modules/cssom/lib/index.js          |   15 +
 .../jsdom/node_modules/cssom/lib/parse.js          |  338 +
 .../jsdom/node_modules/cssom/package.json          |   46 +
 .../jsdom/node_modules/cssstyle/.npmignore         |    1 +
 .../jsdom/node_modules/cssstyle/README.md          |    9 +
 .../cssstyle/lib/CSSStyleDeclaration.js            |  972 +++
 .../cssstyle/lib/properties/alignmentBaseline.js   |   11 +
 .../cssstyle/lib/properties/azimuth.js             |   11 +
 .../cssstyle/lib/properties/background.js          |   11 +
 .../lib/properties/backgroundAttachment.js         |   11 +
 .../cssstyle/lib/properties/backgroundClip.js      |   11 +
 .../cssstyle/lib/properties/backgroundColor.js     |   11 +
 .../cssstyle/lib/properties/backgroundImage.js     |   11 +
 .../cssstyle/lib/properties/backgroundOrigin.js    |   11 +
 .../cssstyle/lib/properties/backgroundPosition.js  |   11 +
 .../cssstyle/lib/properties/backgroundPositionX.js |   11 +
 .../cssstyle/lib/properties/backgroundPositionY.js |   11 +
 .../cssstyle/lib/properties/backgroundRepeat.js    |   11 +
 .../cssstyle/lib/properties/backgroundRepeatX.js   |   11 +
 .../cssstyle/lib/properties/backgroundRepeatY.js   |   11 +
 .../cssstyle/lib/properties/backgroundSize.js      |   11 +
 .../cssstyle/lib/properties/baselineShift.js       |   11 +
 .../node_modules/cssstyle/lib/properties/border.js |   11 +
 .../cssstyle/lib/properties/borderBottom.js        |   11 +
 .../cssstyle/lib/properties/borderBottomColor.js   |   11 +
 .../lib/properties/borderBottomLeftRadius.js       |   11 +
 .../lib/properties/borderBottomRightRadius.js      |   11 +
 .../cssstyle/lib/properties/borderBottomStyle.js   |   11 +
 .../cssstyle/lib/properties/borderBottomWidth.js   |   11 +
 .../cssstyle/lib/properties/borderCollapse.js      |   11 +
 .../cssstyle/lib/properties/borderColor.js         |   11 +
 .../cssstyle/lib/properties/borderImage.js         |   11 +
 .../cssstyle/lib/properties/borderImageOutset.js   |   11 +
 .../cssstyle/lib/properties/borderImageRepeat.js   |   11 +
 .../cssstyle/lib/properties/borderImageSlice.js    |   11 +
 .../cssstyle/lib/properties/borderImageSource.js   |   11 +
 .../cssstyle/lib/properties/borderImageWidth.js    |   11 +
 .../cssstyle/lib/properties/borderLeft.js          |   11 +
 .../cssstyle/lib/properties/borderLeftColor.js     |   11 +
 .../cssstyle/lib/properties/borderLeftStyle.js     |   11 +
 .../cssstyle/lib/properties/borderLeftWidth.js     |   11 +
 .../cssstyle/lib/properties/borderRadius.js        |   11 +
 .../cssstyle/lib/properties/borderRight.js         |   11 +
 .../cssstyle/lib/properties/borderRightColor.js    |   11 +
 .../cssstyle/lib/properties/borderRightStyle.js    |   11 +
 .../cssstyle/lib/properties/borderRightWidth.js    |   11 +
 .../cssstyle/lib/properties/borderSpacing.js       |   11 +
 .../cssstyle/lib/properties/borderStyle.js         |   11 +
 .../cssstyle/lib/properties/borderTop.js           |   11 +
 .../cssstyle/lib/properties/borderTopColor.js      |   11 +
 .../cssstyle/lib/properties/borderTopLeftRadius.js |   11 +
 .../lib/properties/borderTopRightRadius.js         |   11 +
 .../cssstyle/lib/properties/borderTopStyle.js      |   11 +
 .../cssstyle/lib/properties/borderTopWidth.js      |   11 +
 .../cssstyle/lib/properties/borderWidth.js         |   11 +
 .../node_modules/cssstyle/lib/properties/bottom.js |   11 +
 .../cssstyle/lib/properties/boxShadow.js           |   11 +
 .../cssstyle/lib/properties/boxSizing.js           |   11 +
 .../cssstyle/lib/properties/captionSide.js         |   11 +
 .../node_modules/cssstyle/lib/properties/clear.js  |   11 +
 .../node_modules/cssstyle/lib/properties/clip.js   |   11 +
 .../cssstyle/lib/properties/clipPath.js            |   11 +
 .../cssstyle/lib/properties/clipRule.js            |   11 +
 .../node_modules/cssstyle/lib/properties/color.js  |   11 +
 .../cssstyle/lib/properties/colorInterpolation.js  |   11 +
 .../lib/properties/colorInterpolationFilters.js    |   11 +
 .../cssstyle/lib/properties/colorProfile.js        |   11 +
 .../cssstyle/lib/properties/colorRendering.js      |   11 +
 .../cssstyle/lib/properties/content.js             |   11 +
 .../cssstyle/lib/properties/counterIncrement.js    |   11 +
 .../cssstyle/lib/properties/counterReset.js        |   11 +
 .../cssstyle/lib/properties/cssFloat.js            |   11 +
 .../node_modules/cssstyle/lib/properties/cue.js    |   11 +
 .../cssstyle/lib/properties/cueAfter.js            |   11 +
 .../cssstyle/lib/properties/cueBefore.js           |   11 +
 .../node_modules/cssstyle/lib/properties/cursor.js |   11 +
 .../cssstyle/lib/properties/direction.js           |   11 +
 .../cssstyle/lib/properties/display.js             |   11 +
 .../cssstyle/lib/properties/dominantBaseline.js    |   11 +
 .../cssstyle/lib/properties/elevation.js           |   11 +
 .../cssstyle/lib/properties/emptyCells.js          |   11 +
 .../cssstyle/lib/properties/enableBackground.js    |   11 +
 .../node_modules/cssstyle/lib/properties/fill.js   |   11 +
 .../cssstyle/lib/properties/fillOpacity.js         |   11 +
 .../cssstyle/lib/properties/fillRule.js            |   11 +
 .../node_modules/cssstyle/lib/properties/filter.js |   11 +
 .../cssstyle/lib/properties/floodColor.js          |   11 +
 .../cssstyle/lib/properties/floodOpacity.js        |   11 +
 .../node_modules/cssstyle/lib/properties/font.js   |   11 +
 .../cssstyle/lib/properties/fontFamily.js          |   11 +
 .../cssstyle/lib/properties/fontSize.js            |   11 +
 .../cssstyle/lib/properties/fontSizeAdjust.js      |   11 +
 .../cssstyle/lib/properties/fontStretch.js         |   11 +
 .../cssstyle/lib/properties/fontStyle.js           |   11 +
 .../cssstyle/lib/properties/fontVariant.js         |   11 +
 .../cssstyle/lib/properties/fontWeight.js          |   11 +
 .../lib/properties/glyphOrientationHorizontal.js   |   11 +
 .../lib/properties/glyphOrientationVertical.js     |   11 +
 .../node_modules/cssstyle/lib/properties/height.js |   11 +
 .../cssstyle/lib/properties/imageRendering.js      |   11 +
 .../cssstyle/lib/properties/kerning.js             |   11 +
 .../node_modules/cssstyle/lib/properties/left.js   |   11 +
 .../cssstyle/lib/properties/letterSpacing.js       |   11 +
 .../cssstyle/lib/properties/lightingColor.js       |   11 +
 .../cssstyle/lib/properties/lineHeight.js          |   11 +
 .../cssstyle/lib/properties/listStyle.js           |   11 +
 .../cssstyle/lib/properties/listStyleImage.js      |   11 +
 .../cssstyle/lib/properties/listStylePosition.js   |   11 +
 .../cssstyle/lib/properties/listStyleType.js       |   11 +
 .../node_modules/cssstyle/lib/properties/margin.js |   11 +
 .../cssstyle/lib/properties/marginBottom.js        |   11 +
 .../cssstyle/lib/properties/marginLeft.js          |   11 +
 .../cssstyle/lib/properties/marginRight.js         |   11 +
 .../cssstyle/lib/properties/marginTop.js           |   11 +
 .../node_modules/cssstyle/lib/properties/marker.js |   11 +
 .../cssstyle/lib/properties/markerEnd.js           |   11 +
 .../cssstyle/lib/properties/markerMid.js           |   11 +
 .../cssstyle/lib/properties/markerOffset.js        |   11 +
 .../cssstyle/lib/properties/markerStart.js         |   11 +
 .../node_modules/cssstyle/lib/properties/marks.js  |   11 +
 .../node_modules/cssstyle/lib/properties/mask.js   |   11 +
 .../cssstyle/lib/properties/maxHeight.js           |   11 +
 .../cssstyle/lib/properties/maxWidth.js            |   11 +
 .../cssstyle/lib/properties/minHeight.js           |   11 +
 .../cssstyle/lib/properties/minWidth.js            |   11 +
 .../cssstyle/lib/properties/opacity.js             |   11 +
 .../cssstyle/lib/properties/orphans.js             |   11 +
 .../cssstyle/lib/properties/outline.js             |   11 +
 .../cssstyle/lib/properties/outlineColor.js        |   11 +
 .../cssstyle/lib/properties/outlineOffset.js       |   11 +
 .../cssstyle/lib/properties/outlineStyle.js        |   11 +
 .../cssstyle/lib/properties/outlineWidth.js        |   11 +
 .../cssstyle/lib/properties/overflow.js            |   11 +
 .../cssstyle/lib/properties/overflowX.js           |   11 +
 .../cssstyle/lib/properties/overflowY.js           |   11 +
 .../cssstyle/lib/properties/padding.js             |   11 +
 .../cssstyle/lib/properties/paddingBottom.js       |   11 +
 .../cssstyle/lib/properties/paddingLeft.js         |   11 +
 .../cssstyle/lib/properties/paddingRight.js        |   11 +
 .../cssstyle/lib/properties/paddingTop.js          |   11 +
 .../node_modules/cssstyle/lib/properties/page.js   |   11 +
 .../cssstyle/lib/properties/pageBreakAfter.js      |   11 +
 .../cssstyle/lib/properties/pageBreakBefore.js     |   11 +
 .../cssstyle/lib/properties/pageBreakInside.js     |   11 +
 .../node_modules/cssstyle/lib/properties/pause.js  |   11 +
 .../cssstyle/lib/properties/pauseAfter.js          |   11 +
 .../cssstyle/lib/properties/pauseBefore.js         |   11 +
 .../node_modules/cssstyle/lib/properties/pitch.js  |   11 +
 .../cssstyle/lib/properties/pitchRange.js          |   11 +
 .../cssstyle/lib/properties/playDuring.js          |   11 +
 .../cssstyle/lib/properties/pointerEvents.js       |   11 +
 .../cssstyle/lib/properties/position.js            |   11 +
 .../node_modules/cssstyle/lib/properties/quotes.js |   11 +
 .../node_modules/cssstyle/lib/properties/resize.js |   11 +
 .../cssstyle/lib/properties/richness.js            |   11 +
 .../node_modules/cssstyle/lib/properties/right.js  |   11 +
 .../cssstyle/lib/properties/shapeRendering.js      |   11 +
 .../node_modules/cssstyle/lib/properties/size.js   |   11 +
 .../node_modules/cssstyle/lib/properties/speak.js  |   11 +
 .../cssstyle/lib/properties/speakHeader.js         |   11 +
 .../cssstyle/lib/properties/speakNumeral.js        |   11 +
 .../cssstyle/lib/properties/speakPunctuation.js    |   11 +
 .../cssstyle/lib/properties/speechRate.js          |   11 +
 .../node_modules/cssstyle/lib/properties/src.js    |   11 +
 .../cssstyle/lib/properties/stopColor.js           |   11 +
 .../cssstyle/lib/properties/stopOpacity.js         |   11 +
 .../node_modules/cssstyle/lib/properties/stress.js |   11 +
 .../node_modules/cssstyle/lib/properties/stroke.js |   11 +
 .../cssstyle/lib/properties/strokeDasharray.js     |   11 +
 .../cssstyle/lib/properties/strokeDashoffset.js    |   11 +
 .../cssstyle/lib/properties/strokeLinecap.js       |   11 +
 .../cssstyle/lib/properties/strokeLinejoin.js      |   11 +
 .../cssstyle/lib/properties/strokeMiterlimit.js    |   11 +
 .../cssstyle/lib/properties/strokeOpacity.js       |   11 +
 .../cssstyle/lib/properties/strokeWidth.js         |   11 +
 .../cssstyle/lib/properties/tableLayout.js         |   11 +
 .../cssstyle/lib/properties/textAlign.js           |   11 +
 .../cssstyle/lib/properties/textAnchor.js          |   11 +
 .../cssstyle/lib/properties/textDecoration.js      |   11 +
 .../cssstyle/lib/properties/textIndent.js          |   11 +
 .../cssstyle/lib/properties/textLineThrough.js     |   11 +
 .../lib/properties/textLineThroughColor.js         |   11 +
 .../cssstyle/lib/properties/textLineThroughMode.js |   11 +
 .../lib/properties/textLineThroughStyle.js         |   11 +
 .../lib/properties/textLineThroughWidth.js         |   11 +
 .../cssstyle/lib/properties/textOverflow.js        |   11 +
 .../cssstyle/lib/properties/textOverline.js        |   11 +
 .../cssstyle/lib/properties/textOverlineColor.js   |   11 +
 .../cssstyle/lib/properties/textOverlineMode.js    |   11 +
 .../cssstyle/lib/properties/textOverlineStyle.js   |   11 +
 .../cssstyle/lib/properties/textOverlineWidth.js   |   11 +
 .../cssstyle/lib/properties/textRendering.js       |   11 +
 .../cssstyle/lib/properties/textShadow.js          |   11 +
 .../cssstyle/lib/properties/textTransform.js       |   11 +
 .../cssstyle/lib/properties/textUnderline.js       |   11 +
 .../cssstyle/lib/properties/textUnderlineColor.js  |   11 +
 .../cssstyle/lib/properties/textUnderlineMode.js   |   11 +
 .../cssstyle/lib/properties/textUnderlineStyle.js  |   11 +
 .../cssstyle/lib/properties/textUnderlineWidth.js  |   11 +
 .../node_modules/cssstyle/lib/properties/top.js    |   11 +
 .../cssstyle/lib/properties/unicodeBidi.js         |   11 +
 .../cssstyle/lib/properties/unicodeRange.js        |   11 +
 .../cssstyle/lib/properties/vectorEffect.js        |   11 +
 .../cssstyle/lib/properties/verticalAlign.js       |   11 +
 .../cssstyle/lib/properties/visibility.js          |   11 +
 .../cssstyle/lib/properties/voiceFamily.js         |   11 +
 .../node_modules/cssstyle/lib/properties/volume.js |   11 +
 .../cssstyle/lib/properties/webkitAnimation.js     |   11 +
 .../lib/properties/webkitAnimationDelay.js         |   11 +
 .../lib/properties/webkitAnimationDirection.js     |   11 +
 .../lib/properties/webkitAnimationDuration.js      |   11 +
 .../lib/properties/webkitAnimationFillMode.js      |   11 +
 .../properties/webkitAnimationIterationCount.js    |   11 +
 .../cssstyle/lib/properties/webkitAnimationName.js |   11 +
 .../lib/properties/webkitAnimationPlayState.js     |   11 +
 .../properties/webkitAnimationTimingFunction.js    |   11 +
 .../cssstyle/lib/properties/webkitAppearance.js    |   11 +
 .../cssstyle/lib/properties/webkitAspectRatio.js   |   11 +
 .../lib/properties/webkitBackfaceVisibility.js     |   11 +
 .../lib/properties/webkitBackgroundClip.js         |   11 +
 .../lib/properties/webkitBackgroundComposite.js    |   11 +
 .../lib/properties/webkitBackgroundOrigin.js       |   11 +
 .../lib/properties/webkitBackgroundSize.js         |   11 +
 .../cssstyle/lib/properties/webkitBorderAfter.js   |   11 +
 .../lib/properties/webkitBorderAfterColor.js       |   11 +
 .../lib/properties/webkitBorderAfterStyle.js       |   11 +
 .../lib/properties/webkitBorderAfterWidth.js       |   11 +
 .../cssstyle/lib/properties/webkitBorderBefore.js  |   11 +
 .../lib/properties/webkitBorderBeforeColor.js      |   11 +
 .../lib/properties/webkitBorderBeforeStyle.js      |   11 +
 .../lib/properties/webkitBorderBeforeWidth.js      |   11 +
 .../cssstyle/lib/properties/webkitBorderEnd.js     |   11 +
 .../lib/properties/webkitBorderEndColor.js         |   11 +
 .../lib/properties/webkitBorderEndStyle.js         |   11 +
 .../lib/properties/webkitBorderEndWidth.js         |   11 +
 .../cssstyle/lib/properties/webkitBorderFit.js     |   11 +
 .../properties/webkitBorderHorizontalSpacing.js    |   11 +
 .../cssstyle/lib/properties/webkitBorderImage.js   |   11 +
 .../cssstyle/lib/properties/webkitBorderRadius.js  |   11 +
 .../cssstyle/lib/properties/webkitBorderStart.js   |   11 +
 .../lib/properties/webkitBorderStartColor.js       |   11 +
 .../lib/properties/webkitBorderStartStyle.js       |   11 +
 .../lib/properties/webkitBorderStartWidth.js       |   11 +
 .../lib/properties/webkitBorderVerticalSpacing.js  |   11 +
 .../cssstyle/lib/properties/webkitBoxAlign.js      |   11 +
 .../cssstyle/lib/properties/webkitBoxDirection.js  |   11 +
 .../cssstyle/lib/properties/webkitBoxFlex.js       |   11 +
 .../cssstyle/lib/properties/webkitBoxFlexGroup.js  |   11 +
 .../cssstyle/lib/properties/webkitBoxLines.js      |   11 +
 .../lib/properties/webkitBoxOrdinalGroup.js        |   11 +
 .../cssstyle/lib/properties/webkitBoxOrient.js     |   11 +
 .../cssstyle/lib/properties/webkitBoxPack.js       |   11 +
 .../cssstyle/lib/properties/webkitBoxReflect.js    |   11 +
 .../cssstyle/lib/properties/webkitBoxShadow.js     |   11 +
 .../lib/properties/webkitColorCorrection.js        |   11 +
 .../cssstyle/lib/properties/webkitColumnAxis.js    |   11 +
 .../lib/properties/webkitColumnBreakAfter.js       |   11 +
 .../lib/properties/webkitColumnBreakBefore.js      |   11 +
 .../lib/properties/webkitColumnBreakInside.js      |   11 +
 .../cssstyle/lib/properties/webkitColumnCount.js   |   11 +
 .../cssstyle/lib/properties/webkitColumnGap.js     |   11 +
 .../cssstyle/lib/properties/webkitColumnRule.js    |   11 +
 .../lib/properties/webkitColumnRuleColor.js        |   11 +
 .../lib/properties/webkitColumnRuleStyle.js        |   11 +
 .../lib/properties/webkitColumnRuleWidth.js        |   11 +
 .../cssstyle/lib/properties/webkitColumnSpan.js    |   11 +
 .../cssstyle/lib/properties/webkitColumnWidth.js   |   11 +
 .../cssstyle/lib/properties/webkitColumns.js       |   11 +
 .../cssstyle/lib/properties/webkitFilter.js        |   11 +
 .../cssstyle/lib/properties/webkitFlexAlign.js     |   11 +
 .../cssstyle/lib/properties/webkitFlexDirection.js |   11 +
 .../cssstyle/lib/properties/webkitFlexFlow.js      |   11 +
 .../cssstyle/lib/properties/webkitFlexItemAlign.js |   11 +
 .../cssstyle/lib/properties/webkitFlexLinePack.js  |   11 +
 .../cssstyle/lib/properties/webkitFlexOrder.js     |   11 +
 .../cssstyle/lib/properties/webkitFlexPack.js      |   11 +
 .../cssstyle/lib/properties/webkitFlexWrap.js      |   11 +
 .../cssstyle/lib/properties/webkitFlowFrom.js      |   11 +
 .../cssstyle/lib/properties/webkitFlowInto.js      |   11 +
 .../lib/properties/webkitFontFeatureSettings.js    |   11 +
 .../cssstyle/lib/properties/webkitFontKerning.js   |   11 +
 .../cssstyle/lib/properties/webkitFontSizeDelta.js |   11 +
 .../cssstyle/lib/properties/webkitFontSmoothing.js |   11 +
 .../lib/properties/webkitFontVariantLigatures.js   |   11 +
 .../cssstyle/lib/properties/webkitHighlight.js     |   11 +
 .../lib/properties/webkitHyphenateCharacter.js     |   11 +
 .../lib/properties/webkitHyphenateLimitAfter.js    |   11 +
 .../lib/properties/webkitHyphenateLimitBefore.js   |   11 +
 .../lib/properties/webkitHyphenateLimitLines.js    |   11 +
 .../cssstyle/lib/properties/webkitHyphens.js       |   11 +
 .../cssstyle/lib/properties/webkitLineAlign.js     |   11 +
 .../lib/properties/webkitLineBoxContain.js         |   11 +
 .../cssstyle/lib/properties/webkitLineBreak.js     |   11 +
 .../cssstyle/lib/properties/webkitLineClamp.js     |   11 +
 .../cssstyle/lib/properties/webkitLineGrid.js      |   11 +
 .../cssstyle/lib/properties/webkitLineSnap.js      |   11 +
 .../cssstyle/lib/properties/webkitLocale.js        |   11 +
 .../cssstyle/lib/properties/webkitLogicalHeight.js |   11 +
 .../cssstyle/lib/properties/webkitLogicalWidth.js  |   11 +
 .../cssstyle/lib/properties/webkitMarginAfter.js   |   11 +
 .../lib/properties/webkitMarginAfterCollapse.js    |   11 +
 .../cssstyle/lib/properties/webkitMarginBefore.js  |   11 +
 .../lib/properties/webkitMarginBeforeCollapse.js   |   11 +
 .../lib/properties/webkitMarginBottomCollapse.js   |   11 +
 .../lib/properties/webkitMarginCollapse.js         |   11 +
 .../cssstyle/lib/properties/webkitMarginEnd.js     |   11 +
 .../cssstyle/lib/properties/webkitMarginStart.js   |   11 +
 .../lib/properties/webkitMarginTopCollapse.js      |   11 +
 .../cssstyle/lib/properties/webkitMarquee.js       |   11 +
 .../lib/properties/webkitMarqueeDirection.js       |   11 +
 .../lib/properties/webkitMarqueeIncrement.js       |   11 +
 .../lib/properties/webkitMarqueeRepetition.js      |   11 +
 .../cssstyle/lib/properties/webkitMarqueeSpeed.js  |   11 +
 .../cssstyle/lib/properties/webkitMarqueeStyle.js  |   11 +
 .../cssstyle/lib/properties/webkitMask.js          |   11 +
 .../lib/properties/webkitMaskAttachment.js         |   11 +
 .../cssstyle/lib/properties/webkitMaskBoxImage.js  |   11 +
 .../lib/properties/webkitMaskBoxImageOutset.js     |   11 +
 .../lib/properties/webkitMaskBoxImageRepeat.js     |   11 +
 .../lib/properties/webkitMaskBoxImageSlice.js      |   11 +
 .../lib/properties/webkitMaskBoxImageSource.js     |   11 +
 .../lib/properties/webkitMaskBoxImageWidth.js      |   11 +
 .../cssstyle/lib/properties/webkitMaskClip.js      |   11 +
 .../cssstyle/lib/properties/webkitMaskComposite.js |   11 +
 .../cssstyle/lib/properties/webkitMaskImage.js     |   11 +
 .../cssstyle/lib/properties/webkitMaskOrigin.js    |   11 +
 .../cssstyle/lib/properties/webkitMaskPosition.js  |   11 +
 .../cssstyle/lib/properties/webkitMaskPositionX.js |   11 +
 .../cssstyle/lib/properties/webkitMaskPositionY.js |   11 +
 .../cssstyle/lib/properties/webkitMaskRepeat.js    |   11 +
 .../cssstyle/lib/properties/webkitMaskRepeatX.js   |   11 +
 .../cssstyle/lib/properties/webkitMaskRepeatY.js   |   11 +
 .../cssstyle/lib/properties/webkitMaskSize.js      |   11 +
 .../webkitMatchNearestMailBlockquoteColor.js       |   11 +
 .../lib/properties/webkitMaxLogicalHeight.js       |   11 +
 .../lib/properties/webkitMaxLogicalWidth.js        |   11 +
 .../lib/properties/webkitMinLogicalHeight.js       |   11 +
 .../lib/properties/webkitMinLogicalWidth.js        |   11 +
 .../cssstyle/lib/properties/webkitNbspMode.js      |   11 +
 .../lib/properties/webkitOverflowScrolling.js      |   11 +
 .../cssstyle/lib/properties/webkitPaddingAfter.js  |   11 +
 .../cssstyle/lib/properties/webkitPaddingBefore.js |   11 +
 .../cssstyle/lib/properties/webkitPaddingEnd.js    |   11 +
 .../cssstyle/lib/properties/webkitPaddingStart.js  |   11 +
 .../cssstyle/lib/properties/webkitPerspective.js   |   11 +
 .../lib/properties/webkitPerspectiveOrigin.js      |   11 +
 .../lib/properties/webkitPerspectiveOriginX.js     |   11 +
 .../lib/properties/webkitPerspectiveOriginY.js     |   11 +
 .../lib/properties/webkitPrintColorAdjust.js       |   11 +
 .../lib/properties/webkitRegionBreakAfter.js       |   11 +
 .../lib/properties/webkitRegionBreakBefore.js      |   11 +
 .../lib/properties/webkitRegionBreakInside.js      |   11 +
 .../lib/properties/webkitRegionOverflow.js         |   11 +
 .../cssstyle/lib/properties/webkitRtlOrdering.js   |   11 +
 .../cssstyle/lib/properties/webkitSvgShadow.js     |   11 +
 .../lib/properties/webkitTapHighlightColor.js      |   11 +
 .../cssstyle/lib/properties/webkitTextCombine.js   |   11 +
 .../properties/webkitTextDecorationsInEffect.js    |   11 +
 .../cssstyle/lib/properties/webkitTextEmphasis.js  |   11 +
 .../lib/properties/webkitTextEmphasisColor.js      |   11 +
 .../lib/properties/webkitTextEmphasisPosition.js   |   11 +
 .../lib/properties/webkitTextEmphasisStyle.js      |   11 +
 .../cssstyle/lib/properties/webkitTextFillColor.js |   11 +
 .../lib/properties/webkitTextOrientation.js        |   11 +
 .../cssstyle/lib/properties/webkitTextSecurity.js  |   11 +
 .../lib/properties/webkitTextSizeAdjust.js         |   11 +
 .../cssstyle/lib/properties/webkitTextStroke.js    |   11 +
 .../lib/properties/webkitTextStrokeColor.js        |   11 +
 .../lib/properties/webkitTextStrokeWidth.js        |   11 +
 .../cssstyle/lib/properties/webkitTransform.js     |   11 +
 .../lib/properties/webkitTransformOrigin.js        |   11 +
 .../lib/properties/webkitTransformOriginX.js       |   11 +
 .../lib/properties/webkitTransformOriginY.js       |   11 +
 .../lib/properties/webkitTransformOriginZ.js       |   11 +
 .../lib/properties/webkitTransformStyle.js         |   11 +
 .../cssstyle/lib/properties/webkitTransition.js    |   11 +
 .../lib/properties/webkitTransitionDelay.js        |   11 +
 .../lib/properties/webkitTransitionDuration.js     |   11 +
 .../lib/properties/webkitTransitionProperty.js     |   11 +
 .../properties/webkitTransitionTimingFunction.js   |   11 +
 .../cssstyle/lib/properties/webkitUserDrag.js      |   11 +
 .../cssstyle/lib/properties/webkitUserModify.js    |   11 +
 .../cssstyle/lib/properties/webkitUserSelect.js    |   11 +
 .../cssstyle/lib/properties/webkitWrap.js          |   11 +
 .../cssstyle/lib/properties/webkitWrapFlow.js      |   11 +
 .../cssstyle/lib/properties/webkitWrapMargin.js    |   11 +
 .../cssstyle/lib/properties/webkitWrapPadding.js   |   11 +
 .../lib/properties/webkitWrapShapeInside.js        |   11 +
 .../lib/properties/webkitWrapShapeOutside.js       |   11 +
 .../cssstyle/lib/properties/webkitWrapThrough.js   |   11 +
 .../cssstyle/lib/properties/webkitWritingMode.js   |   11 +
 .../cssstyle/lib/properties/whiteSpace.js          |   11 +
 .../node_modules/cssstyle/lib/properties/widows.js |   11 +
 .../node_modules/cssstyle/lib/properties/width.js  |   11 +
 .../cssstyle/lib/properties/wordBreak.js           |   11 +
 .../cssstyle/lib/properties/wordSpacing.js         |   11 +
 .../cssstyle/lib/properties/wordWrap.js            |   11 +
 .../cssstyle/lib/properties/writingMode.js         |   11 +
 .../node_modules/cssstyle/lib/properties/zIndex.js |   11 +
 .../node_modules/cssstyle/lib/properties/zoom.js   |   11 +
 .../jsdom/node_modules/cssstyle/lib/props          |  788 ++
 .../jsdom/node_modules/cssstyle/make_properties.pl |   26 +
 .../jsdom/node_modules/cssstyle/package.json       |   48 +
 .../jsdom/node_modules/cssstyle/tests/tests.js     |   76 +
 .../jsdom/node_modules/htmlparser2/.npmignore      |    2 +
 .../jsdom/node_modules/htmlparser2/.travis.yml     |    5 +
 .../jsdom/node_modules/htmlparser2/LICENSE         |   18 +
 .../jsdom/node_modules/htmlparser2/README.md       |   81 +
 .../htmlparser2/lib/CollectingHandler.js           |   55 +
 .../node_modules/htmlparser2/lib/FeedHandler.js    |   95 +
 .../jsdom/node_modules/htmlparser2/lib/Parser.js   |  314 +
 .../node_modules/htmlparser2/lib/ProxyHandler.js   |   27 +
 .../jsdom/node_modules/htmlparser2/lib/Stream.js   |   35 +
 .../node_modules/htmlparser2/lib/Tokenizer.js      |  876 ++
 .../node_modules/htmlparser2/lib/WritableStream.js |   21 +
 .../htmlparser2/lib/entities/decode.json           |    1 +
 .../htmlparser2/lib/entities/entities.json         |    1 +
 .../htmlparser2/lib/entities/legacy.json           |    1 +
 .../node_modules/htmlparser2/lib/entities/xml.json |    1 +
 .../jsdom/node_modules/htmlparser2/lib/index.js    |   70 +
 .../node_modules/domelementtype/LICENSE            |   11 +
 .../node_modules/domelementtype/index.js           |   14 +
 .../node_modules/domelementtype/package.json       |   25 +
 .../node_modules/domelementtype/readme.md          |    1 +
 .../node_modules/domhandler/.travis.yml            |    6 +
 .../htmlparser2/node_modules/domhandler/LICENSE    |   11 +
 .../htmlparser2/node_modules/domhandler/index.js   |  174 +
 .../node_modules/domhandler/package.json           |   38 +
 .../htmlparser2/node_modules/domhandler/readme.md  |   99 +
 .../htmlparser2/node_modules/domutils/LICENSE      |   11 +
 .../htmlparser2/node_modules/domutils/index.js     |  318 +
 .../htmlparser2/node_modules/domutils/package.json |   38 +
 .../htmlparser2/node_modules/domutils/readme.md    |    1 +
 .../node_modules/domutils/tests/00-runtests.js     |   64 +
 .../node_modules/domutils/tests/02-dom_utils.js    |   15 +
 .../domutils/tests/DomUtils/01-by_id.js            |   56 +
 .../domutils/tests/DomUtils/02-by_tagname.js       |   23 +
 .../domutils/tests/DomUtils/03-by_type.js          |   23 +
 .../domutils/tests/DomUtils/04-outer_html.js       |   10 +
 .../domutils/tests/DomUtils/05-inner_html.js       |   10 +
 .../node_modules/readable-stream/LICENSE           |   27 +
 .../node_modules/readable-stream/README.md         |  768 ++
 .../node_modules/readable-stream/duplex.js         |    1 +
 .../readable-stream/examples/CAPSLOCKTYPER.JS      |   32 +
 .../readable-stream/examples/typer-fsr.js          |   15 +
 .../node_modules/readable-stream/examples/typer.js |   17 +
 .../node_modules/readable-stream/float.patch       |   68 +
 .../htmlparser2/node_modules/readable-stream/fs.js | 1705 ++++
 .../readable-stream/lib/_stream_duplex.js          |   69 +
 .../readable-stream/lib/_stream_passthrough.js     |   41 +
 .../readable-stream/lib/_stream_readable.js        |  927 ++
 .../readable-stream/lib/_stream_transform.js       |  205 +
 .../readable-stream/lib/_stream_writable.js        |  367 +
 .../node_modules/readable-stream/package.json      |   35 +
 .../node_modules/readable-stream/passthrough.js    |    1 +
 .../node_modules/readable-stream/readable.js       |    6 +
 .../node_modules/readable-stream/transform.js      |    1 +
 .../node_modules/readable-stream/writable.js       |    1 +
 .../node_modules/readable-stream/zlib.js           |  452 +
 .../jsdom/node_modules/htmlparser2/package.json    |   58 +
 .../jsdom/node_modules/nwmatcher/.npmignore        |    8 +
 .../jsdom/node_modules/nwmatcher/LICENSE           |   22 +
 .../jsdom/node_modules/nwmatcher/README            |    0
 .../jsdom/node_modules/nwmatcher/README.md         |   91 +
 .../jsdom/node_modules/nwmatcher/dist/lint.log     |    0
 .../node_modules/nwmatcher/lib/ender/bridge.js     |  105 +
 .../nwmatcher/lib/prototype/selector_engine.js     |   23 +
 .../jsdom/node_modules/nwmatcher/package.json      |   43 +
 .../nwmatcher/src/modules/nwmatcher-cache.js       |  184 +
 .../nwmatcher/src/modules/nwmatcher-jquery.js      |  119 +
 .../nwmatcher/src/modules/nwmatcher-pseudos.js     |  275 +
 .../nwmatcher/src/modules/nwmatcher-shortcuts.js   |   35 +
 .../nwmatcher/src/modules/nwmatcher-traversal.js   |   90 +
 .../nwmatcher/src/modules/nwmatcher-webforms.js    |  100 +
 .../node_modules/nwmatcher/src/nwmatcher-base.js   |  683 ++
 .../node_modules/nwmatcher/src/nwmatcher-noqsa.js  |  841 ++
 .../jsdom/node_modules/nwmatcher/src/nwmatcher.js  | 1658 ++++
 .../jsdom/node_modules/xmlhttprequest/LICENSE      |   22 +
 .../jsdom/node_modules/xmlhttprequest/README.md    |   57 +
 .../node_modules/xmlhttprequest/autotest.watchr    |    8 +
 .../node_modules/xmlhttprequest/example/demo.js    |   16 +
 .../xmlhttprequest/lib/XMLHttpRequest.js           |  599 ++
 .../jsdom/node_modules/xmlhttprequest/package.json |   38 +
 .../xmlhttprequest/tests/test-constants.js         |   13 +
 .../xmlhttprequest/tests/test-events.js            |   50 +
 .../xmlhttprequest/tests/test-exceptions.js        |   62 +
 .../xmlhttprequest/tests/test-headers.js           |   76 +
 .../xmlhttprequest/tests/test-redirect-302.js      |   41 +
 .../xmlhttprequest/tests/test-redirect-303.js      |   41 +
 .../xmlhttprequest/tests/test-redirect-307.js      |   43 +
 .../xmlhttprequest/tests/test-request-methods.js   |   62 +
 .../xmlhttprequest/tests/test-request-protocols.js |   34 +
 .../node_modules/xmlhttprequest/tests/testdata.txt |    1 +
 .../jquery/node_modules/jsdom/package.json         |  210 +
 .../bones/node_modules/jquery/package.json         |   25 +
 .../bones/node_modules/mirror/LICENSE.md           |   25 +
 .../bones/node_modules/mirror/README.md            |   54 +
 .../bones/node_modules/mirror/mirror.js            |  165 +
 .../node_modules/mirror/node_modules/.bin/uglifyjs |    1 +
 .../mirror/node_modules/uglify-js/.npmignore       |    4 +
 .../mirror/node_modules/uglify-js/README.html      |  825 ++
 .../mirror/node_modules/uglify-js/README.org       |  431 +
 .../mirror/node_modules/uglify-js/bin/uglifyjs     |  305 +
 .../mirror/node_modules/uglify-js/docstyle.css     |   75 +
 .../mirror/node_modules/uglify-js/lib/parse-js.js  | 1315 +++
 .../mirror/node_modules/uglify-js/lib/process.js   | 1667 ++++
 .../node_modules/uglify-js/lib/squeeze-more.js     |   22 +
 .../mirror/node_modules/uglify-js/package.json     |   25 +
 .../node_modules/uglify-js/tmp/instrument.js       |   97 +
 .../node_modules/uglify-js/tmp/instrument2.js      |  138 +
 .../mirror/node_modules/uglify-js/uglify-js.js     |   17 +
 .../bones/node_modules/mirror/package.json         |   22 +
 .../bones/node_modules/optimist/.travis.yml        |    4 +
 .../bones/node_modules/optimist/LICENSE            |   21 +
 .../bones/node_modules/optimist/example/bool.js    |   10 +
 .../optimist/example/boolean_double.js             |    7 +
 .../optimist/example/boolean_single.js             |    7 +
 .../node_modules/optimist/example/default_hash.js  |    8 +
 .../optimist/example/default_singles.js            |    7 +
 .../bones/node_modules/optimist/example/divide.js  |    8 +
 .../node_modules/optimist/example/line_count.js    |   20 +
 .../optimist/example/line_count_options.js         |   29 +
 .../optimist/example/line_count_wrap.js            |   29 +
 .../bones/node_modules/optimist/example/nonopt.js  |    4 +
 .../bones/node_modules/optimist/example/reflect.js |    2 +
 .../bones/node_modules/optimist/example/short.js   |    3 +
 .../bones/node_modules/optimist/example/string.js  |   11 +
 .../node_modules/optimist/example/usage-options.js |   19 +
 .../bones/node_modules/optimist/example/xup.js     |   10 +
 .../bones/node_modules/optimist/index.js           |  485 ++
 .../optimist/node_modules/wordwrap/.npmignore      |    1 +
 .../optimist/node_modules/wordwrap/README.markdown |   70 +
 .../node_modules/wordwrap/example/center.js        |   10 +
 .../optimist/node_modules/wordwrap/example/meat.js |    3 +
 .../optimist/node_modules/wordwrap/index.js        |   76 +
 .../optimist/node_modules/wordwrap/package.json    |   44 +
 .../bones/node_modules/optimist/package.json       |   45 +
 .../bones/node_modules/optimist/readme.markdown    |  500 ++
 .../bones/node_modules/underscore/.npmignore       |    3 +
 .../bones/node_modules/underscore/LICENSE          |   22 +
 .../bones/node_modules/underscore/README           |   19 +
 .../bones/node_modules/underscore/index.html       | 1608 ++++
 .../bones/node_modules/underscore/index.js         |    1 +
 .../bones/node_modules/underscore/package.json     |   31 +
 .../node_modules/underscore/underscore-min.js      |   27 +
 .../bones/node_modules/underscore/underscore.js    |  839 ++
 debian/node_modules/bones/package.json             |   30 +
 debian/node_modules/bones/server/backbone.js       |    5 +
 debian/node_modules/bones/server/collection.js     |   23 +
 debian/node_modules/bones/server/command.js        |   40 +
 debian/node_modules/bones/server/command.prefix.js |   14 +
 debian/node_modules/bones/server/command.suffix.js |    5 +
 debian/node_modules/bones/server/controller.js     |   62 +
 .../node_modules/bones/server/controller.prefix.js |   11 +
 .../node_modules/bones/server/controller.suffix.js |    1 +
 debian/node_modules/bones/server/middleware.js     |  101 +
 debian/node_modules/bones/server/model.js          |   24 +
 debian/node_modules/bones/server/model.prefix.js   |    9 +
 debian/node_modules/bones/server/model.suffix.js   |    1 +
 debian/node_modules/bones/server/plugin.js         |  293 +
 debian/node_modules/bones/server/server.js         |   51 +
 debian/node_modules/bones/server/server.prefix.js  |   15 +
 debian/node_modules/bones/server/server.suffix.js  |    1 +
 debian/node_modules/bones/server/utils.js          |  102 +
 debian/node_modules/bones/server/view.js           |   38 +
 debian/node_modules/bones/server/view.prefix.js    |   11 +
 debian/node_modules/bones/server/view.suffix.js    |    1 +
 debian/node_modules/bones/servers/Asset.bones      |   16 +
 debian/node_modules/bones/servers/Core.bones       |   27 +
 debian/node_modules/bones/servers/Debug.bones      |   16 +
 debian/node_modules/bones/servers/Middleware.bones |   11 +
 debian/node_modules/bones/servers/Route.bones      |  155 +
 debian/node_modules/bones/shared/backbone.js       |   38 +
 debian/node_modules/bones/shared/utils.js          |  118 +
 968 files changed, 93861 insertions(+)

diff --git a/debian/node_modules/bones/.npmignore b/debian/node_modules/bones/.npmignore
new file mode 100644
index 0000000..91dfed8
--- /dev/null
+++ b/debian/node_modules/bones/.npmignore
@@ -0,0 +1,2 @@
+.DS_Store
+node_modules
\ No newline at end of file
diff --git a/debian/node_modules/bones/LICENSE b/debian/node_modules/bones/LICENSE
new file mode 100644
index 0000000..21dba02
--- /dev/null
+++ b/debian/node_modules/bones/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c), Development Seed
+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 "Development Seed" 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 HOLDER 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.
diff --git a/debian/node_modules/bones/README.md b/debian/node_modules/bones/README.md
new file mode 100644
index 0000000..75ea2a0
--- /dev/null
+++ b/debian/node_modules/bones/README.md
@@ -0,0 +1,20 @@
+# Bones
+
+Bones provides conventions for [Backbone](http://documentcloud.github.com/backbone/) applications. It allows most code to be shared on the server and the client. Bones exposes your Backbone controller routes as regular paths on the server so they can be accessed by non-JavaScript agents, while capable clients can enjoy the normal client-side Backbone experience.
+
+## Getting started
+
+The [wiki](https://github.com/developmentseed/bones/wiki) contains more information on [**Getting Started**](https://github.com/developmentseed/bones/wiki/Getting-Started) and on the [concepts](https://github.com/developmentseed/bones/wiki/Plugin-Architecture) in Bones.
+
+## Testing
+
+To run the test suite, type `npm test`. **Note**: bones has to be in a folder named `node_modules` for tests to work correctly.
+
+This can be done like:
+
+    ln -s `pwd` `pwd`/node_modules/bones
+
+## License
+
+Bones is [BSD licensed](https://github.com/developmentseed/bones/raw/master/LICENSE).
+
diff --git a/debian/node_modules/bones/assets/debug.js b/debian/node_modules/bones/assets/debug.js
new file mode 100644
index 0000000..0b78be3
--- /dev/null
+++ b/debian/node_modules/bones/assets/debug.js
@@ -0,0 +1,12 @@
+window.onerror = function(message, url, line) {
+    // Don't attempt to handle non-standard errors (e.g. failed
+    // HTTP request via jQuery).
+    if (typeof message !== 'string') return;
+    $.ajax('/api/Error', {
+        data: {
+            message: message,
+            url: url,
+            line: line
+        }
+    });
+};
diff --git a/debian/node_modules/bones/assets/jquery.js b/debian/node_modules/bones/assets/jquery.js
new file mode 100644
index 0000000..f78f96a
--- /dev/null
+++ b/debian/node_modules/bones/assets/jquery.js
@@ -0,0 +1,16 @@
+/*!
+ * jQuery JavaScript Library v1.5.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 Mar 31 15:28:23 2011 -0400
+ */
+(function(a,b){function ci(a){return d.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cf(a){if(!b_[a]){var b=d("<"+a+">").appendTo("body"),c=b.css("display");b.remove();if(c==="none"||c==="")c="block";b_[a]=c}return b_[a]}function ce(a,b){var c={};d.each(cd.concat.apply([],cd.slice(0,b)),function(){c[this]=a});return c}function b$(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function bZ(){try{return new a.XMLHttpRequest}catch(b){}}function bY() [...]
\ No newline at end of file
diff --git a/debian/node_modules/bones/bones.js b/debian/node_modules/bones/bones.js
new file mode 100644
index 0000000..53a5552
--- /dev/null
+++ b/debian/node_modules/bones/bones.js
@@ -0,0 +1,34 @@
+if (global.__BonesPlugin__) {
+    console.trace("\033[0;31mMultiple instances of bones are not supported.\033[0m");
+    process.exit(4);
+}
+
+exports.$ = require('jquery');
+exports._ = require('underscore');
+exports.mirror = require('mirror');
+
+exports.utils = require('bones/server/utils');
+exports.middleware = require('bones/server/middleware');
+
+exports.server = true;
+
+exports.Backbone = require('bones/server/backbone');
+exports.Controller = require('bones/server/controller');
+exports.Model = require('bones/server/model');
+exports.Collection = require('bones/server/collection');
+exports.View = require('bones/server/view');
+exports.Server = require('bones/server/server');
+exports.Command = require('bones/server/command');
+
+exports.load = function(dir) {
+    return exports.plugin.load(dir);
+};
+
+exports.start = function(callback) {
+    return exports.plugin.start(callback);
+};
+
+var Plugin = require('./server/plugin');
+global.__BonesPath__ = require.resolve('bones');
+exports.plugin = global.__BonesPlugin__ = new Plugin();
+exports.plugin.load(__dirname);
diff --git a/debian/node_modules/bones/client/backbone.js b/debian/node_modules/bones/client/backbone.js
new file mode 100644
index 0000000..4a4fd64
--- /dev/null
+++ b/debian/node_modules/bones/client/backbone.js
@@ -0,0 +1,135 @@
+Backbone.Controller.prototype.route = function(route, name, callback) {
+    Backbone.history || (Backbone.history = new Backbone.History);
+    if (!_.isRegExp(route)) route = this._routeToRegExp(route);
+    Backbone.history.route(route, _.bind(function(fragment) {
+        var args = this._extractParameters(route, fragment);
+        callback.apply(this, args);
+        this.trigger.apply(this, ['route:' + name].concat(args));
+    }, this));
+};
+
+// Client-side `Backbone.View` overrides. Adds an `attach()` method that can be
+// triggered after `render()` to allow client-side specific JS event handlers,
+// UI libraries to be attached or inited. `template()` and `html()` are mirrors
+// of their server-side counterparts for templating and easy generation of a
+// View's HTML contents.
+Backbone.View.augment({
+    attach: function() {},
+    _configure: function(parent, options) {
+        parent.call(this, options);
+        this.bind('attach', this.attach);
+    }
+});
+
+// Fix for Backbone.History.start with 0.3.3 and IE7.
+// See https://github.com/documentcloud/backbone/issues/228
+Backbone.History.prototype.start = function() {
+    var docMode = document.documentMode;
+    var oldIE = ($.browser.msie && (!docMode || docMode <= 7));
+    if (oldIE) {
+        this.iframe = $('<iframe src="javascript:0" tabindex="-1" />').hide().appendTo('body')[0].contentWindow;
+        this.iframe.document.open().close();
+        this.iframe.location.hash = window.location.hash;
+    }
+    if ('onhashchange' in window && !oldIE) {
+        $(window).bind('hashchange', this.checkUrl);
+    } else {
+        setInterval(this.checkUrl, this.interval);
+    }
+    return this.loadUrl();
+};
+
+Backbone.History.prototype._saveLocation = Backbone.History.prototype.saveLocation;
+Backbone.History.prototype.saveLocation = function(fragment) {
+    // Override: Ensure ! so browser behaves correctly when using back button.
+    Backbone.History.prototype._saveLocation.call(this, '!' + fragment.replace(/^!*/, ''));
+};
+
+Backbone.History.prototype.checkUrl = function() {
+    var current = this.getFragment();
+    if (current == this.fragment && this.iframe) {
+        current = this.getFragment(this.iframe.location);
+    }
+    if (current == this.fragment ||
+        current == decodeURIComponent(this.fragment)) return false;
+    if (this.iframe) {
+      // Override: Keep IE happy.
+      this.iframe.location.hash = current;
+      window.location.hash = '!' + current;
+    }
+    this.loadUrl();
+};
+
+Backbone.History.prototype.loadUrl = function() {
+  this.fragment = this.getFragment();
+  // Override: Remove ! to look up route.
+  var fragment = this.fragment.replace(/^!*/, '');
+  var matched = _.any(this.handlers, function(handler) {
+    if (handler.route.test(fragment)) {
+      handler.callback(fragment);
+      return true;
+    }
+  });
+  return matched;
+};
+
+// Generate CSRF protection token that is valid for the specified amount of
+// msec. The default is 1 second. Callers should provide the request path to
+// ensure the cookie is not pervasive across requests.
+Backbone.csrf = function(path, timeout) {
+    var chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY0123456789';
+    var token = '';
+    while (token.length < 32) {
+        token += chars.charAt(Math.floor(Math.random() * chars.length));
+    }
+
+    // Remove hashes, query strings from cookie path.
+    path = path || '/';
+    path = path.split('#')[0].split('?')[0];
+
+    var expires = new Date(+new Date + (timeout || 2000)).toGMTString();
+    document.cookie = 'bones.token=' + token
+        + ';expires=' + expires
+        + ';path=' + path + ';';
+    return token;
+};
+
+// Client-side override of `Backbone.sync`. Adds CSRF double-cookie
+// confirmation protection to all PUT/POST/DELETE requests. The csrf middleware
+// must be used server-side to invalidate requests without this CSRF
+// protection. The original `Backbone.sync` cannot be reused because it does
+// not send a request body for DELETE requests.
+Backbone.sync = function(method, model, success, error) {
+    function getUrl(object) {
+        if (!(object && object.url)) throw new Error("A 'url' property or function must be specified");
+        return _.isFunction(object.url) ? object.url() : object.url;
+    };
+
+    var type = {
+        'create': 'POST',
+        'update': 'PUT',
+        'delete': 'DELETE',
+        'read'  : 'GET'
+    }[method];
+
+    if (method !== 'read') {
+        var modelJSON = model.toJSON ? model.toJSON() : model;
+        modelJSON['bones.token'] = Backbone.csrf(getUrl(model));
+        modelJSON = JSON.stringify(modelJSON);
+    }
+
+    // Default JSON-request options.
+    var params = {
+        url:          getUrl(model),
+        type:         type,
+        contentType:  'application/json',
+        data:         (modelJSON || null),
+        dataType:     'json',
+        processData:  false,
+        success:      success,
+        error:        error
+    };
+
+    // Make the request.
+    $.ajax(params);
+};
diff --git a/debian/node_modules/bones/client/controller.prefix.js b/debian/node_modules/bones/client/controller.prefix.js
new file mode 100644
index 0000000..a9527b6
--- /dev/null
+++ b/debian/node_modules/bones/client/controller.prefix.js
@@ -0,0 +1,4 @@
+// ---- start __FILE__ ----
+
+Bones.initialize('controller', function(models, views, controllers) {
+var controller;
diff --git a/debian/node_modules/bones/client/controller.suffix.js b/debian/node_modules/bones/client/controller.suffix.js
new file mode 100644
index 0000000..9e8d9c3
--- /dev/null
+++ b/debian/node_modules/bones/client/controller.suffix.js
@@ -0,0 +1,5 @@
+if (controller && !controller.title) controller.title = '__NAME__';
+return controller;
+});
+
+// ---- end __FILE__ ----
\ No newline at end of file
diff --git a/debian/node_modules/bones/client/model.prefix.js b/debian/node_modules/bones/client/model.prefix.js
new file mode 100644
index 0000000..220bae8
--- /dev/null
+++ b/debian/node_modules/bones/client/model.prefix.js
@@ -0,0 +1,4 @@
+// ---- start __FILE__ ----
+
+Bones.initialize('model', function(models) {
+var model;
diff --git a/debian/node_modules/bones/client/model.suffix.js b/debian/node_modules/bones/client/model.suffix.js
new file mode 100644
index 0000000..5ede068
--- /dev/null
+++ b/debian/node_modules/bones/client/model.suffix.js
@@ -0,0 +1,5 @@
+if (model && !model.title) model.title = '__NAME__';
+return model;
+});
+
+// ---- end __FILE__ ----
\ No newline at end of file
diff --git a/debian/node_modules/bones/client/template.prefix.js b/debian/node_modules/bones/client/template.prefix.js
new file mode 100644
index 0000000..c354110
--- /dev/null
+++ b/debian/node_modules/bones/client/template.prefix.js
@@ -0,0 +1,4 @@
+// ---- start __FILE__ ----
+
+Bones.initialize('template', function(templates) {
+var template;
diff --git a/debian/node_modules/bones/client/template.suffix.js b/debian/node_modules/bones/client/template.suffix.js
new file mode 100644
index 0000000..5d741f0
--- /dev/null
+++ b/debian/node_modules/bones/client/template.suffix.js
@@ -0,0 +1,5 @@
+if (template && !template.title) template.title = '__NAME__';
+return template;
+});
+
+// ---- end __FILE__ ----
\ No newline at end of file
diff --git a/debian/node_modules/bones/client/utils.js b/debian/node_modules/bones/client/utils.js
new file mode 100644
index 0000000..8e41a19
--- /dev/null
+++ b/debian/node_modules/bones/client/utils.js
@@ -0,0 +1,45 @@
+$(function() {
+    // Fix for [IE8 AJAX payload caching][1].
+    // [1]: http://stackoverflow.com/questions/1013637/unexpected-caching-of-ajax-results-in-ie8
+    $.browser.msie && $.ajaxSetup({ cache: false });
+});
+
+(function() {
+    // Closure for models/views/controllers.
+    var models = {}, views = {}, controllers = {}, templates = {};
+
+    Bones.server = false;
+
+    Bones.initialize = function(kind, callback) {
+        if (kind === 'model') {
+            var model = callback(models);
+            if (model) models[model.title] = model;
+        } else if (kind === 'view') {
+            var view = callback(models, views, templates);
+            if (view) views[view.title] = view;
+        } else if (kind === 'controller') {
+            var controller = callback(models, views, controllers);
+            if (controller) controllers[controller.title] = controller;
+        } else if (kind === 'template') {
+            var template = callback(templates);
+            if (template) templates[template.title] = template;
+        } else if (_.isFunction(kind)) {
+            kind(models, views, controllers, templates);
+        }
+    };
+
+    Bones.start = function() {
+        for (var k in controllers) {
+            new controllers[k];
+        }
+
+        Backbone.history.start();
+    };
+
+    Bones.DEBUG = {
+        models: models,
+        views: views,
+        controllers: controllers,
+        templates: templates
+    };
+})();
diff --git a/debian/node_modules/bones/client/view.prefix.js b/debian/node_modules/bones/client/view.prefix.js
new file mode 100644
index 0000000..676e354
--- /dev/null
+++ b/debian/node_modules/bones/client/view.prefix.js
@@ -0,0 +1,4 @@
+// ---- start __FILE__ ----
+
+Bones.initialize('view', function(models, views, templates) {
+var view;
diff --git a/debian/node_modules/bones/client/view.suffix.js b/debian/node_modules/bones/client/view.suffix.js
new file mode 100644
index 0000000..6a22443
--- /dev/null
+++ b/debian/node_modules/bones/client/view.suffix.js
@@ -0,0 +1,5 @@
+if (view && !view.title) view.title = '__NAME__';
+return view;
+});
+
+// ---- end __FILE__ ----
\ No newline at end of file
diff --git a/debian/node_modules/bones/commands/start.bones b/debian/node_modules/bones/commands/start.bones
new file mode 100644
index 0000000..6fe61ee
--- /dev/null
+++ b/debian/node_modules/bones/commands/start.bones
@@ -0,0 +1,27 @@
+command = Bones.Command.extend();
+
+command.description = 'start application';
+
+command.prototype.initialize = function(plugin, callback) {
+    if (!Object.keys(plugin.servers).length) {
+        console.warn(Bones.utils.colorize('No servers defined.', 'red'));
+        return;
+    }
+
+    this.servers = {};
+    var queue = _(plugin.servers)
+        .filter(function(server) { return !!server.prototype.port })
+        .length;
+    _(plugin.servers)
+        .chain()
+        .filter(function(server) { return !!server.prototype.port })
+        .each(function(server) {
+            this.servers[server.title] = new server(plugin);
+            this.servers[server.title].start(function() {
+                console.warn('Started %s.', Bones.utils.colorize(this, 'green'));
+                this.emit('start');
+                queue--;
+                queue === 0 && callback && callback();
+            }.bind(this.servers[server.title]));
+        }.bind(this));
+};
diff --git a/debian/node_modules/bones/examples/simple/assets/app.css b/debian/node_modules/bones/examples/simple/assets/app.css
new file mode 100644
index 0000000..e69de29
diff --git a/debian/node_modules/bones/examples/simple/assets/app.js b/debian/node_modules/bones/examples/simple/assets/app.js
new file mode 100644
index 0000000..03fbb54
--- /dev/null
+++ b/debian/node_modules/bones/examples/simple/assets/app.js
@@ -0,0 +1,7 @@
+$(function() {
+    Bones.start();
+
+    if (!location.hash) {
+        location.hash = '/';
+    }
+});
diff --git a/debian/node_modules/bones/examples/simple/controllers/Default.bones b/debian/node_modules/bones/examples/simple/controllers/Default.bones
new file mode 100644
index 0000000..973ee4b
--- /dev/null
+++ b/debian/node_modules/bones/examples/simple/controllers/Default.bones
@@ -0,0 +1,3 @@
+controller = Backbone.Controller.extend({
+
+});
diff --git a/debian/node_modules/bones/examples/simple/controllers/Home.bones b/debian/node_modules/bones/examples/simple/controllers/Home.bones
new file mode 100644
index 0000000..2b2cfb8
--- /dev/null
+++ b/debian/node_modules/bones/examples/simple/controllers/Home.bones
@@ -0,0 +1,16 @@
+controller = Backbone.Controller.extend({
+    routes: {
+        '/': 'home',
+        '/foo': 'foo'
+    },
+
+    home: function() {
+        var view = new views['Home'];
+        if (this.res) this.res.send(view.el);
+    },
+
+    foo: function() {
+        var view = new views['Foo'];
+        if (this.res) this.res.send(view.el);
+    }
+});
diff --git a/debian/node_modules/bones/examples/simple/controllers/Other.server.bones b/debian/node_modules/bones/examples/simple/controllers/Other.server.bones
new file mode 100644
index 0000000..973ee4b
--- /dev/null
+++ b/debian/node_modules/bones/examples/simple/controllers/Other.server.bones
@@ -0,0 +1,3 @@
+controller = Backbone.Controller.extend({
+
+});
diff --git a/debian/node_modules/bones/examples/simple/index.js b/debian/node_modules/bones/examples/simple/index.js
new file mode 100644
index 0000000..fa798a2
--- /dev/null
+++ b/debian/node_modules/bones/examples/simple/index.js
@@ -0,0 +1,6 @@
+#!/usr/bin/env node
+require('bones').load(__dirname);
+
+if (!module.parent) {
+    require('bones').start();
+}
diff --git a/debian/node_modules/bones/examples/simple/models/Foo.bones b/debian/node_modules/bones/examples/simple/models/Foo.bones
new file mode 100644
index 0000000..8a374bd
--- /dev/null
+++ b/debian/node_modules/bones/examples/simple/models/Foo.bones
@@ -0,0 +1,5 @@
+model = Backbone.Model.extend({
+    sync: function(method, model, success, error) {
+        // client side sync method
+    }
+});
diff --git a/debian/node_modules/bones/examples/simple/models/Foo.server.bones b/debian/node_modules/bones/examples/simple/models/Foo.server.bones
new file mode 100644
index 0000000..3727302
--- /dev/null
+++ b/debian/node_modules/bones/examples/simple/models/Foo.server.bones
@@ -0,0 +1,6 @@
+model = models['Foo'].augment({
+    sync: function(method, model, success, error) {
+        model.set({ method: method });
+        success(model);
+    }
+});
diff --git a/debian/node_modules/bones/examples/simple/package.json b/debian/node_modules/bones/examples/simple/package.json
new file mode 100644
index 0000000..c5da6b1
--- /dev/null
+++ b/debian/node_modules/bones/examples/simple/package.json
@@ -0,0 +1,4 @@
+{
+    "name": "simple",
+    "version": "1.0.0"
+}
\ No newline at end of file
diff --git a/debian/node_modules/bones/examples/simple/templates/Home._ b/debian/node_modules/bones/examples/simple/templates/Home._
new file mode 100644
index 0000000..51ed66b
--- /dev/null
+++ b/debian/node_modules/bones/examples/simple/templates/Home._
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset='utf-8'>
+    <script src="/assets/bones/vendor.js" type="text/javascript" charset="utf-8"></script>
+    <script src="/assets/bones/core.js" type="text/javascript" charset="utf-8"></script>
+    <script src="/assets/bones/views.js" type="text/javascript" charset="utf-8"></script>
+    <script src="/assets/bones/controllers.js" type="text/javascript" charset="utf-8"></script>
+    <script src="/assets/bones/models.js" type="text/javascript" charset="utf-8"></script>
+    <script src="/assets/simple/app.js" type="text/javascript" charset="utf-8"></script>
+  </head>
+  <body>
+    <div id="view">
+      home
+      <a href="/">go to home</a>
+      <a href="/foo">go to foo</a>
+    </div>
+  </body>
+</html>
diff --git a/debian/node_modules/bones/examples/simple/views/Foo.bones b/debian/node_modules/bones/examples/simple/views/Foo.bones
new file mode 100644
index 0000000..e113a21
--- /dev/null
+++ b/debian/node_modules/bones/examples/simple/views/Foo.bones
@@ -0,0 +1,11 @@
+view = Backbone.View.extend({
+    initialize: function(options) {
+        _.bindAll(this, 'render');
+        this.render();
+        this.trigger('attach');
+    },
+    render: function() {
+        console.log('home view');
+        return this;
+    }
+});
diff --git a/debian/node_modules/bones/examples/simple/views/Foo.server.bones b/debian/node_modules/bones/examples/simple/views/Foo.server.bones
new file mode 100644
index 0000000..ce42c94
--- /dev/null
+++ b/debian/node_modules/bones/examples/simple/views/Foo.server.bones
@@ -0,0 +1,6 @@
+views['Foo'].augment({
+    render: function(parent) {
+        this.el = templates['Home']();
+        return this;
+    }
+});
diff --git a/debian/node_modules/bones/examples/simple/views/Home.bones b/debian/node_modules/bones/examples/simple/views/Home.bones
new file mode 100644
index 0000000..e113a21
--- /dev/null
+++ b/debian/node_modules/bones/examples/simple/views/Home.bones
@@ -0,0 +1,11 @@
+view = Backbone.View.extend({
+    initialize: function(options) {
+        _.bindAll(this, 'render');
+        this.render();
+        this.trigger('attach');
+    },
+    render: function() {
+        console.log('home view');
+        return this;
+    }
+});
diff --git a/debian/node_modules/bones/examples/simple/views/home.server.bones b/debian/node_modules/bones/examples/simple/views/home.server.bones
new file mode 100644
index 0000000..eddce15
--- /dev/null
+++ b/debian/node_modules/bones/examples/simple/views/home.server.bones
@@ -0,0 +1,6 @@
+views['Home'].augment({
+    render: function(parent) {
+        this.el = templates['Home']();
+        return this;
+    }
+});
diff --git a/debian/node_modules/bones/node_modules/.bin/express b/debian/node_modules/bones/node_modules/.bin/express
new file mode 120000
index 0000000..6848d3a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/.bin/express
@@ -0,0 +1 @@
+tilemill-0.10.1/../express/bin/express
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/backbone/.npmignore b/debian/node_modules/bones/node_modules/backbone/.npmignore
new file mode 100644
index 0000000..48ecc30
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/backbone/.npmignore
@@ -0,0 +1 @@
+raw
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/backbone/LICENSE b/debian/node_modules/bones/node_modules/backbone/LICENSE
new file mode 100644
index 0000000..d8cef48
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/backbone/LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) 2010 Jeremy Ashkenas, DocumentCloud
+
+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/debian/node_modules/bones/node_modules/backbone/README b/debian/node_modules/bones/node_modules/backbone/README
new file mode 100644
index 0000000..0723e1a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/backbone/README
@@ -0,0 +1,25 @@
+  ____             _     _                        _     
+ |  _ \           | |   | |                      (_)    
+ | |_) | __ _  ___| | __| |__   ___  _ __   ___   _ ___ 
+ |  _ < / _` |/ __| |/ /| '_ \ / _ \| '_ \ / _ \ | / __|
+ | |_) | (_| | (__|   < | |_) | (_) | | | |  __/_| \__ \
+ |____/ \__,_|\___|_|\_\|_.__/ \___/|_| |_|\___(_) |___/
+                                                _/ |    
+                                               |__/
+(_'___________________________________________________'_)
+(_.———————————————————————————————————————————————————._)
+                                               
+                                              
+Backbone supplies structure to JavaScript-heavy applications by providing models key-value binding and custom events, collections with a rich API of enumerable functions, views with declarative event handling, and connects it all to your existing application over a RESTful JSON interface.
+
+For Docs, License, Tests, and pre-packed downloads, see:
+http://documentcloud.github.com/backbone/
+
+To suggest a feature, report a bug, or general discussion:
+http://github.com/documentcloud/backbone/issues/
+
+All contributors are listed here:
+http://github.com/documentcloud/backbone/contributors
+
+Special thanks to Robert Kieffer for the original philosophy behind Backbone.
+http://github.com/broofa
diff --git a/debian/node_modules/bones/node_modules/backbone/Rakefile b/debian/node_modules/bones/node_modules/backbone/Rakefile
new file mode 100644
index 0000000..f0b0cf6
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/backbone/Rakefile
@@ -0,0 +1,42 @@
+require 'rubygems'
+
+HEADER = /((^\s*\/\/.*\n)+)/
+
+desc "rebuild the backbone-min.js files for distribution"
+task :build do
+  begin
+    require 'closure-compiler'
+  rescue LoadError
+    puts "closure-compiler not found.\nInstall it by running 'gem install closure-compiler"
+    exit
+  end
+  source = File.read 'backbone.js'
+  header = source.match(HEADER)
+  File.open('backbone-min.js', 'w+') do |file|
+    file.write header[1].squeeze(' ') + Closure::Compiler.new.compress(source)
+  end
+end
+
+desc "build the docco documentation"
+task :doc do
+  check 'docco', 'docco', 'https://github.com/jashkenas/docco'
+  system 'docco backbone.js && docco examples/todos/todos.js examples/backbone-localstorage.js'
+end
+
+desc "run JavaScriptLint on the source"
+task :lint do
+  system "jsl -nofilelisting -nologo -conf docs/jsl.conf -process backbone.js"
+end
+
+desc "test the CoffeeScript integration"
+task :test do
+  check 'coffee', 'CoffeeScript', 'https://github.com/jashkenas/coffee-script.git'
+  system "coffee test/*.coffee"
+end
+
+# Check for the existence of an executable.
+def check(exec, name, url)
+  return unless `which #{exec}`.empty?
+  puts "#{name} not found.\nInstall it from #{url}"
+  exit
+end
diff --git a/debian/node_modules/bones/node_modules/backbone/backbone-min.js b/debian/node_modules/bones/node_modules/backbone/backbone-min.js
new file mode 100644
index 0000000..161b401
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/backbone/backbone-min.js
@@ -0,0 +1,27 @@
+// Backbone.js 0.3.3
+// (c) 2010 Jeremy Ashkenas, DocumentCloud Inc.
+// Backbone may be freely distributed under the MIT license.
+// For all details and documentation:
+// http://documentcloud.github.com/backbone
+(function(){var e;e=typeof exports!=="undefined"?exports:this.Backbone={};e.VERSION="0.3.3";var f=this._;if(!f&&typeof require!=="undefined")f=require("underscore")._;var h=this.jQuery||this.Zepto;e.emulateHTTP=false;e.emulateJSON=false;e.Events={bind:function(a,b){this._callbacks||(this._callbacks={});(this._callbacks[a]||(this._callbacks[a]=[])).push(b);return this},unbind:function(a,b){var c;if(a){if(c=this._callbacks)if(b){c=c[a];if(!c)return this;for(var d=0,g=c.length;d<g;d++)if(b= [...]
+1);break}}else c[a]=[]}else this._callbacks={};return this},trigger:function(a){var b,c,d,g;if(!(c=this._callbacks))return this;if(b=c[a]){d=0;for(g=b.length;d<g;d++)b[d].apply(this,Array.prototype.slice.call(arguments,1))}if(b=c.all){d=0;for(g=b.length;d<g;d++)b[d].apply(this,arguments)}return this}};e.Model=function(a,b){a||(a={});if(this.defaults)a=f.extend({},this.defaults,a);this.attributes={};this._escapedAttributes={};this.cid=f.uniqueId("c");this.set(a,{silent:true});this._previo [...]
+f.clone(this.attributes);if(b&&b.collection)this.collection=b.collection;this.initialize(a,b)};f.extend(e.Model.prototype,e.Events,{_previousAttributes:null,_changed:false,initialize:function(){},toJSON:function(){return f.clone(this.attributes)},get:function(a){return this.attributes[a]},escape:function(a){var b;if(b=this._escapedAttributes[a])return b;b=this.attributes[a];return this._escapedAttributes[a]=(b==null?"":b).replace(/&(?!\w+;)/g,"&").replace(/</g,"<").replace(/>/g,"& [...]
+""")},set:function(a,b){b||(b={});if(!a)return this;if(a.attributes)a=a.attributes;var c=this.attributes,d=this._escapedAttributes;if(!b.silent&&this.validate&&!this._performValidation(a,b))return false;if("id"in a)this.id=a.id;for(var g in a){var i=a[g];if(!f.isEqual(c[g],i)){c[g]=i;delete d[g];if(!b.silent){this._changed=true;this.trigger("change:"+g,this,i,b)}}}!b.silent&&this._changed&&this.change(b);return this},unset:function(a,b){b||(b={});var c={};c[a]=void 0;if(!b.silent&&t [...]
+!this._performValidation(c,b))return false;delete this.attributes[a];delete this._escapedAttributes[a];if(!b.silent){this._changed=true;this.trigger("change:"+a,this,void 0,b);this.change(b)}return this},clear:function(a){a||(a={});var b=this.attributes,c={};for(attr in b)c[attr]=void 0;if(!a.silent&&this.validate&&!this._performValidation(c,a))return false;this.attributes={};this._escapedAttributes={};if(!a.silent){this._changed=true;for(attr in b)this.trigger("change:"+attr,this,void 0 [...]
+fetch:function(a){a||(a={});var b=this,c=j(a.error,b,a);(this.sync||e.sync)("read",this,function(d){if(!b.set(b.parse(d),a))return false;a.success&&a.success(b,d)},c);return this},save:function(a,b){b||(b={});if(a&&!this.set(a,b))return false;var c=this,d=j(b.error,c,b),g=this.isNew()?"create":"update";(this.sync||e.sync)(g,this,function(i){if(!c.set(c.parse(i),b))return false;b.success&&b.success(c,i)},d);return this},destroy:function(a){a||(a={});var b=this,c=j(a.error,b,a);(this.sync| [...]
+this,function(d){b.collection&&b.collection.remove(b);a.success&&a.success(b,d)},c);return this},url:function(){var a=k(this.collection);if(this.isNew())return a;return a+(a.charAt(a.length-1)=="/"?"":"/")+this.id},parse:function(a){return a},clone:function(){return new this.constructor(this)},isNew:function(){return!this.id},change:function(a){this.trigger("change",this,a);this._previousAttributes=f.clone(this.attributes);this._changed=false},hasChanged:function(a){if(a)return this._pre [...]
+this.attributes[a];return this._changed},changedAttributes:function(a){a||(a=this.attributes);var b=this._previousAttributes,c=false,d;for(d in a)if(!f.isEqual(b[d],a[d])){c=c||{};c[d]=a[d]}return c},previous:function(a){if(!a||!this._previousAttributes)return null;return this._previousAttributes[a]},previousAttributes:function(){return f.clone(this._previousAttributes)},_performValidation:function(a,b){var c=this.validate(a);if(c){b.error?b.error(this,c):this.trigger("error",this,c,b);r [...]
+e.Collection=function(a,b){b||(b={});if(b.comparator){this.comparator=b.comparator;delete b.comparator}this._boundOnModelEvent=f.bind(this._onModelEvent,this);this._reset();a&&this.refresh(a,{silent:true});this.initialize(a,b)};f.extend(e.Collection.prototype,e.Events,{model:e.Model,initialize:function(){},toJSON:function(){return this.map(function(a){return a.toJSON()})},add:function(a,b){if(f.isArray(a))for(var c=0,d=a.length;c<d;c++)this._add(a[c],b);else this._add(a,b);return this},r [...]
+b){if(f.isArray(a))for(var c=0,d=a.length;c<d;c++)this._remove(a[c],b);else this._remove(a,b);return this},get:function(a){if(a==null)return null;return this._byId[a.id!=null?a.id:a]},getByCid:function(a){return a&&this._byCid[a.cid||a]},at:function(a){return this.models[a]},sort:function(a){a||(a={});if(!this.comparator)throw Error("Cannot sort a set without a comparator");this.models=this.sortBy(this.comparator);a.silent||this.trigger("refresh",this,a);return this},pluck:function(a){re [...]
+function(b){return b.get(a)})},refresh:function(a,b){a||(a=[]);b||(b={});this._reset();this.add(a,{silent:true});b.silent||this.trigger("refresh",this,b);return this},fetch:function(a){a||(a={});var b=this,c=j(a.error,b,a);(this.sync||e.sync)("read",this,function(d){b.refresh(b.parse(d));a.success&&a.success(b,d)},c);return this},create:function(a,b){var c=this;b||(b={});if(a instanceof e.Model)a.collection=c;else a=new this.model(a,{collection:c});return a.save(null,{success:function(d, [...]
+b.success&&b.success(d,g)},error:b.error})},parse:function(a){return a},chain:function(){return f(this.models).chain()},_reset:function(){this.length=0;this.models=[];this._byId={};this._byCid={}},_add:function(a,b){b||(b={});a instanceof e.Model||(a=new this.model(a,{collection:this}));var c=this.getByCid(a);if(c)throw Error(["Can't add the same model to a set twice",c.id]);this._byId[a.id]=a;this._byCid[a.cid]=a;a.collection=this;this.models.splice(this.comparator?this.sortedIndex(a,th [...]
+this.length,0,a);a.bind("all",this._boundOnModelEvent);this.length++;b.silent||a.trigger("add",a,this,b);return a},_remove:function(a,b){b||(b={});a=this.getByCid(a)||this.get(a);if(!a)return null;delete this._byId[a.id];delete this._byCid[a.cid];delete a.collection;this.models.splice(this.indexOf(a),1);this.length--;b.silent||a.trigger("remove",a,this,b);a.unbind("all",this._boundOnModelEvent);return a},_onModelEvent:function(a,b){if(a==="change:id"){delete this._byId[b.previous("id")]; [...]
+b}this.trigger.apply(this,arguments)}});f.each(["forEach","each","map","reduce","reduceRight","find","detect","filter","select","reject","every","all","some","any","include","invoke","max","min","sortBy","sortedIndex","toArray","size","first","rest","last","without","indexOf","lastIndexOf","isEmpty"],function(a){e.Collection.prototype[a]=function(){return f[a].apply(f,[this.models].concat(f.toArray(arguments)))}});e.Controller=function(a){a||(a={});if(a.routes)this.routes=a.routes;this._ [...]
+this.initialize(a)};var o=/:([\w\d]+)/g,p=/\*([\w\d]+)/g;f.extend(e.Controller.prototype,e.Events,{initialize:function(){},route:function(a,b,c){e.history||(e.history=new e.History);f.isRegExp(a)||(a=this._routeToRegExp(a));e.history.route(a,f.bind(function(d){d=this._extractParameters(a,d);c.apply(this,d);this.trigger.apply(this,["route:"+b].concat(d))},this))},saveLocation:function(a){e.history.saveLocation(a)},_bindRoutes:function(){if(this.routes)for(var a in this.routes){var b=this. [...]
+this.route(a,b,this[b])}},_routeToRegExp:function(a){a=a.replace(o,"([^/]*)").replace(p,"(.*?)");return RegExp("^"+a+"$")},_extractParameters:function(a,b){return a.exec(b).slice(1)}});e.History=function(){this.handlers=[];this.fragment=this.getFragment();f.bindAll(this,"checkUrl")};var l=/^#*/;f.extend(e.History.prototype,{interval:50,getFragment:function(a){return(a||window.location).hash.replace(l,"")},start:function(){var a=document.documentMode;if(a=h.browser.msie&&(!a||a<=7))this.i [...]
+"onhashchange"in window&&!a?h(window).bind("hashchange",this.checkUrl):setInterval(this.checkUrl,this.interval);return this.loadUrl()},route:function(a,b){this.handlers.push({route:a,callback:b})},checkUrl:function(){var a=this.getFragment();if(a==this.fragment&&this.iframe)a=this.getFragment(this.iframe.location);if(a==this.fragment||a==decodeURIComponent(this.fragment))return false;if(this.iframe)window.location.hash=this.iframe.location.hash=a;this.loadUrl()},loadUrl:function(){var a= [...]
+this.getFragment();return f.any(this.handlers,function(b){if(b.route.test(a)){b.callback(a);return true}})},saveLocation:function(a){a=(a||"").replace(l,"");if(this.fragment!=a){window.location.hash=this.fragment=a;if(this.iframe&&a!=this.getFragment(this.iframe.location)){this.iframe.document.open().close();this.iframe.location.hash=a}}}});e.View=function(a){this._configure(a||{});this._ensureElement();this.delegateEvents();this.initialize(a)};var q=/^(\w+)\s*(.*)$/;f.extend(e.View.prot [...]
+{tagName:"div",$:function(a){return h(a,this.el)},initialize:function(){},render:function(){return this},remove:function(){h(this.el).remove();return this},make:function(a,b,c){a=document.createElement(a);b&&h(a).attr(b);c&&h(a).html(c);return a},delegateEvents:function(a){if(a||(a=this.events)){h(this.el).unbind();for(var b in a){var c=a[b],d=b.match(q),g=d[1];d=d[2];c=f.bind(this[c],this);d===""?h(this.el).bind(g,c):h(this.el).delegate(d,g,c)}}},_configure:function(a){if(this.options)a [...]
+this.options,a);if(a.model)this.model=a.model;if(a.collection)this.collection=a.collection;if(a.el)this.el=a.el;if(a.id)this.id=a.id;if(a.className)this.className=a.className;if(a.tagName)this.tagName=a.tagName;this.options=a},_ensureElement:function(){if(!this.el){var a={};if(this.id)a.id=this.id;if(this.className)a["class"]=this.className;this.el=this.make(this.tagName,a)}}});var m=function(a,b){var c=r(this,a,b);c.extend=m;return c};e.Model.extend=e.Collection.extend=e.Controller.exte [...]
+m;var s={create:"POST",update:"PUT","delete":"DELETE",read:"GET"};e.sync=function(a,b,c,d){var g=s[a];a=a==="create"||a==="update"?JSON.stringify(b.toJSON()):null;b={url:k(b),type:g,contentType:"application/json",data:a,dataType:"json",processData:false,success:c,error:d};if(e.emulateJSON){b.contentType="application/x-www-form-urlencoded";b.processData=true;b.data=a?{model:a}:{}}if(e.emulateHTTP)if(g==="PUT"||g==="DELETE"){if(e.emulateJSON)b.data._method=g;b.type="POST";b.beforeSend=func [...]
+g)}}h.ajax(b)};var n=function(){},r=function(a,b,c){var d;d=b&&b.hasOwnProperty("constructor")?b.constructor:function(){return a.apply(this,arguments)};n.prototype=a.prototype;d.prototype=new n;b&&f.extend(d.prototype,b);c&&f.extend(d,c);d.prototype.constructor=d;d.__super__=a.prototype;return d},k=function(a){if(!(a&&a.url))throw Error("A 'url' property or function must be specified");return f.isFunction(a.url)?a.url():a.url},j=function(a,b,c){return function(d){a?a(b,d):b.trigger("erro [...]
diff --git a/debian/node_modules/bones/node_modules/backbone/backbone.js b/debian/node_modules/bones/node_modules/backbone/backbone.js
new file mode 100644
index 0000000..04fe46e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/backbone/backbone.js
@@ -0,0 +1,1011 @@
+//     Backbone.js 0.3.3
+//     (c) 2010 Jeremy Ashkenas, DocumentCloud Inc.
+//     Backbone may be freely distributed under the MIT license.
+//     For all details and documentation:
+//     http://documentcloud.github.com/backbone
+
+(function(){
+
+  // Initial Setup
+  // -------------
+
+  // The top-level namespace. All public Backbone classes and modules will
+  // be attached to this. Exported for both CommonJS and the browser.
+  var Backbone;
+  if (typeof exports !== 'undefined') {
+    Backbone = exports;
+  } else {
+    Backbone = this.Backbone = {};
+  }
+
+  // Current version of the library. Keep in sync with `package.json`.
+  Backbone.VERSION = '0.3.3';
+
+  // Require Underscore, if we're on the server, and it's not already present.
+  var _ = this._;
+  if (!_ && (typeof require !== 'undefined')) _ = require("underscore")._;
+
+  // For Backbone's purposes, either jQuery or Zepto owns the `$` variable.
+  var $ = this.jQuery || this.Zepto;
+
+  // Turn on `emulateHTTP` to use support legacy HTTP servers. Setting this option will
+  // fake `"PUT"` and `"DELETE"` requests via the `_method` parameter and set a
+  // `X-Http-Method-Override` header.
+  Backbone.emulateHTTP = false;
+
+  // Turn on `emulateJSON` to support legacy servers that can't deal with direct
+  // `application/json` requests ... will encode the body as
+  // `application/x-www-form-urlencoded` instead and will send the model in a
+  // form param named `model`.
+  Backbone.emulateJSON = false;
+
+  // Backbone.Events
+  // -----------------
+
+  // A module that can be mixed in to *any object* in order to provide it with
+  // custom events. You may `bind` or `unbind` a callback function to an event;
+  // `trigger`-ing an event fires all callbacks in succession.
+  //
+  //     var object = {};
+  //     _.extend(object, Backbone.Events);
+  //     object.bind('expand', function(){ alert('expanded'); });
+  //     object.trigger('expand');
+  //
+  Backbone.Events = {
+
+    // Bind an event, specified by a string name, `ev`, to a `callback` function.
+    // Passing `"all"` will bind the callback to all events fired.
+    bind : function(ev, callback) {
+      var calls = this._callbacks || (this._callbacks = {});
+      var list  = this._callbacks[ev] || (this._callbacks[ev] = []);
+      list.push(callback);
+      return this;
+    },
+
+    // Remove one or many callbacks. If `callback` is null, removes all
+    // callbacks for the event. If `ev` is null, removes all bound callbacks
+    // for all events.
+    unbind : function(ev, callback) {
+      var calls;
+      if (!ev) {
+        this._callbacks = {};
+      } else if (calls = this._callbacks) {
+        if (!callback) {
+          calls[ev] = [];
+        } else {
+          var list = calls[ev];
+          if (!list) return this;
+          for (var i = 0, l = list.length; i < l; i++) {
+            if (callback === list[i]) {
+              list.splice(i, 1);
+              break;
+            }
+          }
+        }
+      }
+      return this;
+    },
+
+    // Trigger an event, firing all bound callbacks. Callbacks are passed the
+    // same arguments as `trigger` is, apart from the event name.
+    // Listening for `"all"` passes the true event name as the first argument.
+    trigger : function(ev) {
+      var list, calls, i, l;
+      if (!(calls = this._callbacks)) return this;
+      if (list = calls[ev]) {
+        for (i = 0, l = list.length; i < l; i++) {
+          list[i].apply(this, Array.prototype.slice.call(arguments, 1));
+        }
+      }
+      if (list = calls['all']) {
+        for (i = 0, l = list.length; i < l; i++) {
+          list[i].apply(this, arguments);
+        }
+      }
+      return this;
+    }
+
+  };
+
+  // Backbone.Model
+  // --------------
+
+  // Create a new model, with defined attributes. A client id (`cid`)
+  // is automatically generated and assigned for you.
+  Backbone.Model = function(attributes, options) {
+    attributes || (attributes = {});
+    if (this.defaults) attributes = _.extend({}, this.defaults, attributes);
+    this.attributes = {};
+    this._escapedAttributes = {};
+    this.cid = _.uniqueId('c');
+    this.set(attributes, {silent : true});
+    this._previousAttributes = _.clone(this.attributes);
+    if (options && options.collection) this.collection = options.collection;
+    this.initialize(attributes, options);
+  };
+
+  // Attach all inheritable methods to the Model prototype.
+  _.extend(Backbone.Model.prototype, Backbone.Events, {
+
+    // A snapshot of the model's previous attributes, taken immediately
+    // after the last `"change"` event was fired.
+    _previousAttributes : null,
+
+    // Has the item been changed since the last `"change"` event?
+    _changed : false,
+
+    // Initialize is an empty function by default. Override it with your own
+    // initialization logic.
+    initialize : function(){},
+
+    // Return a copy of the model's `attributes` object.
+    toJSON : function() {
+      return _.clone(this.attributes);
+    },
+
+    // Get the value of an attribute.
+    get : function(attr) {
+      return this.attributes[attr];
+    },
+
+    // Get the HTML-escaped value of an attribute.
+    escape : function(attr) {
+      var html;
+      if (html = this._escapedAttributes[attr]) return html;
+      var val = this.attributes[attr];
+      return this._escapedAttributes[attr] = escapeHTML(val == null ? '' : val);
+    },
+
+    // Set a hash of model attributes on the object, firing `"change"` unless you
+    // choose to silence it.
+    set : function(attrs, options) {
+
+      // Extract attributes and options.
+      options || (options = {});
+      if (!attrs) return this;
+      if (attrs.attributes) attrs = attrs.attributes;
+      var now = this.attributes, escaped = this._escapedAttributes;
+
+      // Run validation.
+      if (!options.silent && this.validate && !this._performValidation(attrs, options)) return false;
+
+      // Check for changes of `id`.
+      if ('id' in attrs) this.id = attrs.id;
+
+      // Update attributes.
+      for (var attr in attrs) {
+        var val = attrs[attr];
+        if (!_.isEqual(now[attr], val)) {
+          now[attr] = val;
+          delete escaped[attr];
+          if (!options.silent) {
+            this._changed = true;
+            this.trigger('change:' + attr, this, val, options);
+          }
+        }
+      }
+
+      // Fire the `"change"` event, if the model has been changed.
+      if (!options.silent && this._changed) this.change(options);
+      return this;
+    },
+
+    // Remove an attribute from the model, firing `"change"` unless you choose
+    // to silence it.
+    unset : function(attr, options) {
+      options || (options = {});
+      var value = this.attributes[attr];
+
+      // Run validation.
+      var validObj = {};
+      validObj[attr] = void 0;
+      if (!options.silent && this.validate && !this._performValidation(validObj, options)) return false;
+
+      // Remove the attribute.
+      delete this.attributes[attr];
+      delete this._escapedAttributes[attr];
+      if (!options.silent) {
+        this._changed = true;
+        this.trigger('change:' + attr, this, void 0, options);
+        this.change(options);
+      }
+      return this;
+    },
+
+    // Clear all attributes on the model, firing `"change"` unless you choose
+    // to silence it.
+    clear : function(options) {
+      options || (options = {});
+      var old = this.attributes;
+
+      // Run validation.
+      var validObj = {};
+      for (attr in old) validObj[attr] = void 0;
+      if (!options.silent && this.validate && !this._performValidation(validObj, options)) return false;
+
+      this.attributes = {};
+      this._escapedAttributes = {};
+      if (!options.silent) {
+        this._changed = true;
+        for (attr in old) {
+          this.trigger('change:' + attr, this, void 0, options);
+        }
+        this.change(options);
+      }
+      return this;
+    },
+
+    // Fetch the model from the server. If the server's representation of the
+    // model differs from its current attributes, they will be overriden,
+    // triggering a `"change"` event.
+    fetch : function(options) {
+      options || (options = {});
+      var model = this;
+      var success = function(resp) {
+        if (!model.set(model.parse(resp), options)) return false;
+        if (options.success) options.success(model, resp);
+      };
+      var error = wrapError(options.error, model, options);
+      (this.sync || Backbone.sync)('read', this, success, error);
+      return this;
+    },
+
+    // Set a hash of model attributes, and sync the model to the server.
+    // If the server returns an attributes hash that differs, the model's
+    // state will be `set` again.
+    save : function(attrs, options) {
+      options || (options = {});
+      if (attrs && !this.set(attrs, options)) return false;
+      var model = this;
+      var success = function(resp) {
+        if (!model.set(model.parse(resp), options)) return false;
+        if (options.success) options.success(model, resp);
+      };
+      var error = wrapError(options.error, model, options);
+      var method = this.isNew() ? 'create' : 'update';
+      (this.sync || Backbone.sync)(method, this, success, error);
+      return this;
+    },
+
+    // Destroy this model on the server. Upon success, the model is removed
+    // from its collection, if it has one.
+    destroy : function(options) {
+      options || (options = {});
+      var model = this;
+      var success = function(resp) {
+        if (model.collection) model.collection.remove(model);
+        if (options.success) options.success(model, resp);
+      };
+      var error = wrapError(options.error, model, options);
+      (this.sync || Backbone.sync)('delete', this, success, error);
+      return this;
+    },
+
+    // Default URL for the model's representation on the server -- if you're
+    // using Backbone's restful methods, override this to change the endpoint
+    // that will be called.
+    url : function() {
+      var base = getUrl(this.collection);
+      if (this.isNew()) return base;
+      return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + this.id;
+    },
+
+    // **parse** converts a response into the hash of attributes to be `set` on
+    // the model. The default implementation is just to pass the response along.
+    parse : function(resp) {
+      return resp;
+    },
+
+    // Create a new model with identical attributes to this one.
+    clone : function() {
+      return new this.constructor(this);
+    },
+
+    // A model is new if it has never been saved to the server, and has a negative
+    // ID.
+    isNew : function() {
+      return !this.id;
+    },
+
+    // Call this method to manually fire a `change` event for this model.
+    // Calling this will cause all objects observing the model to update.
+    change : function(options) {
+      this.trigger('change', this, options);
+      this._previousAttributes = _.clone(this.attributes);
+      this._changed = false;
+    },
+
+    // Determine if the model has changed since the last `"change"` event.
+    // If you specify an attribute name, determine if that attribute has changed.
+    hasChanged : function(attr) {
+      if (attr) return this._previousAttributes[attr] != this.attributes[attr];
+      return this._changed;
+    },
+
+    // Return an object containing all the attributes that have changed, or false
+    // if there are no changed attributes. Useful for determining what parts of a
+    // view need to be updated and/or what attributes need to be persisted to
+    // the server.
+    changedAttributes : function(now) {
+      now || (now = this.attributes);
+      var old = this._previousAttributes;
+      var changed = false;
+      for (var attr in now) {
+        if (!_.isEqual(old[attr], now[attr])) {
+          changed = changed || {};
+          changed[attr] = now[attr];
+        }
+      }
+      return changed;
+    },
+
+    // Get the previous value of an attribute, recorded at the time the last
+    // `"change"` event was fired.
+    previous : function(attr) {
+      if (!attr || !this._previousAttributes) return null;
+      return this._previousAttributes[attr];
+    },
+
+    // Get all of the attributes of the model at the time of the previous
+    // `"change"` event.
+    previousAttributes : function() {
+      return _.clone(this._previousAttributes);
+    },
+
+    // Run validation against a set of incoming attributes, returning `true`
+    // if all is well. If a specific `error` callback has been passed,
+    // call that instead of firing the general `"error"` event.
+    _performValidation : function(attrs, options) {
+      var error = this.validate(attrs);
+      if (error) {
+        if (options.error) {
+          options.error(this, error);
+        } else {
+          this.trigger('error', this, error, options);
+        }
+        return false;
+      }
+      return true;
+    }
+
+  });
+
+  // Backbone.Collection
+  // -------------------
+
+  // Provides a standard collection class for our sets of models, ordered
+  // or unordered. If a `comparator` is specified, the Collection will maintain
+  // its models in sort order, as they're added and removed.
+  Backbone.Collection = function(models, options) {
+    options || (options = {});
+    if (options.comparator) {
+      this.comparator = options.comparator;
+      delete options.comparator;
+    }
+    this._boundOnModelEvent = _.bind(this._onModelEvent, this);
+    this._reset();
+    if (models) this.refresh(models, {silent: true});
+    this.initialize(models, options);
+  };
+
+  // Define the Collection's inheritable methods.
+  _.extend(Backbone.Collection.prototype, Backbone.Events, {
+
+    // The default model for a collection is just a **Backbone.Model**.
+    // This should be overridden in most cases.
+    model : Backbone.Model,
+
+    // Initialize is an empty function by default. Override it with your own
+    // initialization logic.
+    initialize : function(){},
+
+    // The JSON representation of a Collection is an array of the
+    // models' attributes.
+    toJSON : function() {
+      return this.map(function(model){ return model.toJSON(); });
+    },
+
+    // Add a model, or list of models to the set. Pass **silent** to avoid
+    // firing the `added` event for every new model.
+    add : function(models, options) {
+      if (_.isArray(models)) {
+        for (var i = 0, l = models.length; i < l; i++) {
+          this._add(models[i], options);
+        }
+      } else {
+        this._add(models, options);
+      }
+      return this;
+    },
+
+    // Remove a model, or a list of models from the set. Pass silent to avoid
+    // firing the `removed` event for every model removed.
+    remove : function(models, options) {
+      if (_.isArray(models)) {
+        for (var i = 0, l = models.length; i < l; i++) {
+          this._remove(models[i], options);
+        }
+      } else {
+        this._remove(models, options);
+      }
+      return this;
+    },
+
+    // Get a model from the set by id.
+    get : function(id) {
+      if (id == null) return null;
+      return this._byId[id.id != null ? id.id : id];
+    },
+
+    // Get a model from the set by client id.
+    getByCid : function(cid) {
+      return cid && this._byCid[cid.cid || cid];
+    },
+
+    // Get the model at the given index.
+    at: function(index) {
+      return this.models[index];
+    },
+
+    // Force the collection to re-sort itself. You don't need to call this under normal
+    // circumstances, as the set will maintain sort order as each item is added.
+    sort : function(options) {
+      options || (options = {});
+      if (!this.comparator) throw new Error('Cannot sort a set without a comparator');
+      this.models = this.sortBy(this.comparator);
+      if (!options.silent) this.trigger('refresh', this, options);
+      return this;
+    },
+
+    // Pluck an attribute from each model in the collection.
+    pluck : function(attr) {
+      return _.map(this.models, function(model){ return model.get(attr); });
+    },
+
+    // When you have more items than you want to add or remove individually,
+    // you can refresh the entire set with a new list of models, without firing
+    // any `added` or `removed` events. Fires `refresh` when finished.
+    refresh : function(models, options) {
+      models  || (models = []);
+      options || (options = {});
+      this._reset();
+      this.add(models, {silent: true});
+      if (!options.silent) this.trigger('refresh', this, options);
+      return this;
+    },
+
+    // Fetch the default set of models for this collection, refreshing the
+    // collection when they arrive.
+    fetch : function(options) {
+      options || (options = {});
+      var collection = this;
+      var success = function(resp) {
+        collection.refresh(collection.parse(resp));
+        if (options.success) options.success(collection, resp);
+      };
+      var error = wrapError(options.error, collection, options);
+      (this.sync || Backbone.sync)('read', this, success, error);
+      return this;
+    },
+
+    // Create a new instance of a model in this collection. After the model
+    // has been created on the server, it will be added to the collection.
+    create : function(model, options) {
+      var coll = this;
+      options || (options = {});
+      if (!(model instanceof Backbone.Model)) {
+        model = new this.model(model, {collection: coll});
+      } else {
+        model.collection = coll;
+      }
+      var success = function(nextModel, resp) {
+        coll.add(nextModel);
+        if (options.success) options.success(nextModel, resp);
+      };
+      return model.save(null, {success : success, error : options.error});
+    },
+
+    // **parse** converts a response into a list of models to be added to the
+    // collection. The default implementation is just to pass it through.
+    parse : function(resp) {
+      return resp;
+    },
+
+    // Proxy to _'s chain. Can't be proxied the same way the rest of the
+    // underscore methods are proxied because it relies on the underscore
+    // constructor.
+    chain: function () {
+      return _(this.models).chain();
+    },
+
+    // Reset all internal state. Called when the collection is refreshed.
+    _reset : function(options) {
+      this.length = 0;
+      this.models = [];
+      this._byId  = {};
+      this._byCid = {};
+    },
+
+    // Internal implementation of adding a single model to the set, updating
+    // hash indexes for `id` and `cid` lookups.
+    _add : function(model, options) {
+      options || (options = {});
+      if (!(model instanceof Backbone.Model)) {
+        model = new this.model(model, {collection: this});
+      }
+      var already = this.getByCid(model);
+      if (already) throw new Error(["Can't add the same model to a set twice", already.id]);
+      this._byId[model.id] = model;
+      this._byCid[model.cid] = model;
+      model.collection = this;
+      var index = this.comparator ? this.sortedIndex(model, this.comparator) : this.length;
+      this.models.splice(index, 0, model);
+      model.bind('all', this._boundOnModelEvent);
+      this.length++;
+      if (!options.silent) model.trigger('add', model, this, options);
+      return model;
+    },
+
+    // Internal implementation of removing a single model from the set, updating
+    // hash indexes for `id` and `cid` lookups.
+    _remove : function(model, options) {
+      options || (options = {});
+      model = this.getByCid(model) || this.get(model);
+      if (!model) return null;
+      delete this._byId[model.id];
+      delete this._byCid[model.cid];
+      delete model.collection;
+      this.models.splice(this.indexOf(model), 1);
+      this.length--;
+      if (!options.silent) model.trigger('remove', model, this, options);
+      model.unbind('all', this._boundOnModelEvent);
+      return model;
+    },
+
+    // Internal method called every time a model in the set fires an event.
+    // Sets need to update their indexes when models change ids. All other
+    // events simply proxy through.
+    _onModelEvent : function(ev, model) {
+      if (ev === 'change:id') {
+        delete this._byId[model.previous('id')];
+        this._byId[model.id] = model;
+      }
+      this.trigger.apply(this, arguments);
+    }
+
+  });
+
+  // Underscore methods that we want to implement on the Collection.
+  var methods = ['forEach', 'each', 'map', 'reduce', 'reduceRight', 'find', 'detect',
+    'filter', 'select', 'reject', 'every', 'all', 'some', 'any', 'include',
+    'invoke', 'max', 'min', 'sortBy', 'sortedIndex', 'toArray', 'size',
+    'first', 'rest', 'last', 'without', 'indexOf', 'lastIndexOf', 'isEmpty'];
+
+  // Mix in each Underscore method as a proxy to `Collection#models`.
+  _.each(methods, function(method) {
+    Backbone.Collection.prototype[method] = function() {
+      return _[method].apply(_, [this.models].concat(_.toArray(arguments)));
+    };
+  });
+
+  // Backbone.Controller
+  // -------------------
+
+  // Controllers map faux-URLs to actions, and fire events when routes are
+  // matched. Creating a new one sets its `routes` hash, if not set statically.
+  Backbone.Controller = function(options) {
+    options || (options = {});
+    if (options.routes) this.routes = options.routes;
+    this._bindRoutes();
+    this.initialize(options);
+  };
+
+  // Cached regular expressions for matching named param parts and splatted
+  // parts of route strings.
+  var namedParam = /:([\w\d]+)/g;
+  var splatParam = /\*([\w\d]+)/g;
+
+  // Set up all inheritable **Backbone.Controller** properties and methods.
+  _.extend(Backbone.Controller.prototype, Backbone.Events, {
+
+    // Initialize is an empty function by default. Override it with your own
+    // initialization logic.
+    initialize : function(){},
+
+    // Manually bind a single named route to a callback. For example:
+    //
+    //     this.route('search/:query/p:num', 'search', function(query, num) {
+    //       ...
+    //     });
+    //
+    route : function(route, name, callback) {
+      Backbone.history || (Backbone.history = new Backbone.History);
+      if (!_.isRegExp(route)) route = this._routeToRegExp(route);
+      Backbone.history.route(route, _.bind(function(fragment) {
+        var args = this._extractParameters(route, fragment);
+        callback.apply(this, args);
+        this.trigger.apply(this, ['route:' + name].concat(args));
+      }, this));
+    },
+
+    // Simple proxy to `Backbone.history` to save a fragment into the history,
+    // without triggering routes.
+    saveLocation : function(fragment) {
+      Backbone.history.saveLocation(fragment);
+    },
+
+    // Bind all defined routes to `Backbone.history`.
+    _bindRoutes : function() {
+      if (!this.routes) return;
+      for (var route in this.routes) {
+        var name = this.routes[route];
+        this.route(route, name, this[name]);
+      }
+    },
+
+    // Convert a route string into a regular expression, suitable for matching
+    // against the current location fragment.
+    _routeToRegExp : function(route) {
+      route = route.replace(namedParam, "([^\/]*)").replace(splatParam, "(.*?)");
+      return new RegExp('^' + route + '$');
+    },
+
+    // Given a route, and a URL fragment that it matches, return the array of
+    // extracted parameters.
+    _extractParameters : function(route, fragment) {
+      return route.exec(fragment).slice(1);
+    }
+
+  });
+
+  // Backbone.History
+  // ----------------
+
+  // Handles cross-browser history management, based on URL hashes. If the
+  // browser does not support `onhashchange`, falls back to polling.
+  Backbone.History = function() {
+    this.handlers = [];
+    this.fragment = this.getFragment();
+    _.bindAll(this, 'checkUrl');
+  };
+
+  // Cached regex for cleaning hashes.
+  var hashStrip = /^#*/;
+
+  // Set up all inheritable **Backbone.History** properties and methods.
+  _.extend(Backbone.History.prototype, {
+
+    // The default interval to poll for hash changes, if necessary, is
+    // twenty times a second.
+    interval: 50,
+
+    // Get the cross-browser normalized URL fragment.
+    getFragment : function(loc) {
+      return (loc || window.location).hash.replace(hashStrip, '');
+    },
+
+    // Start the hash change handling, returning `true` if the current URL matches
+    // an existing route, and `false` otherwise.
+    start : function() {
+      var docMode = document.documentMode;
+      var oldIE = ($.browser.msie && (!docMode || docMode <= 7));
+      if (oldIE) {
+        this.iframe = $('<iframe src="javascript:0" tabindex="-1" />').hide().appendTo('body')[0].contentWindow;
+      }
+      if ('onhashchange' in window && !oldIE) {
+        $(window).bind('hashchange', this.checkUrl);
+      } else {
+        setInterval(this.checkUrl, this.interval);
+      }
+      return this.loadUrl();
+    },
+
+    // Add a route to be tested when the hash changes. Routes are matched in the
+    // order they are added.
+    route : function(route, callback) {
+      this.handlers.push({route : route, callback : callback});
+    },
+
+    // Checks the current URL to see if it has changed, and if it has,
+    // calls `loadUrl`, normalizing across the hidden iframe.
+    checkUrl : function() {
+      var current = this.getFragment();
+      if (current == this.fragment && this.iframe) {
+        current = this.getFragment(this.iframe.location);
+      }
+      if (current == this.fragment ||
+          current == decodeURIComponent(this.fragment)) return false;
+      if (this.iframe) {
+        window.location.hash = this.iframe.location.hash = current;
+      }
+      this.loadUrl();
+    },
+
+    // Attempt to load the current URL fragment. If a route succeeds with a
+    // match, returns `true`. If no defined routes matches the fragment,
+    // returns `false`.
+    loadUrl : function() {
+      var fragment = this.fragment = this.getFragment();
+      var matched = _.any(this.handlers, function(handler) {
+        if (handler.route.test(fragment)) {
+          handler.callback(fragment);
+          return true;
+        }
+      });
+      return matched;
+    },
+
+    // Save a fragment into the hash history. You are responsible for properly
+    // URL-encoding the fragment in advance. This does not trigger
+    // a `hashchange` event.
+    saveLocation : function(fragment) {
+      fragment = (fragment || '').replace(hashStrip, '');
+      if (this.fragment == fragment) return;
+      window.location.hash = this.fragment = fragment;
+      if (this.iframe && (fragment != this.getFragment(this.iframe.location))) {
+        this.iframe.document.open().close();
+        this.iframe.location.hash = fragment;
+      }
+    }
+
+  });
+
+  // Backbone.View
+  // -------------
+
+  // Creating a Backbone.View creates its initial element outside of the DOM,
+  // if an existing element is not provided...
+  Backbone.View = function(options) {
+    this._configure(options || {});
+    this._ensureElement();
+    this.delegateEvents();
+    this.initialize(options);
+  };
+
+  // Element lookup, scoped to DOM elements within the current view.
+  // This should be prefered to global lookups, if you're dealing with
+  // a specific view.
+  var selectorDelegate = function(selector) {
+    return $(selector, this.el);
+  };
+
+  // Cached regex to split keys for `delegate`.
+  var eventSplitter = /^(\w+)\s*(.*)$/;
+
+  // Set up all inheritable **Backbone.View** properties and methods.
+  _.extend(Backbone.View.prototype, Backbone.Events, {
+
+    // The default `tagName` of a View's element is `"div"`.
+    tagName : 'div',
+
+    // Attach the `selectorDelegate` function as the `$` property.
+    $       : selectorDelegate,
+
+    // Initialize is an empty function by default. Override it with your own
+    // initialization logic.
+    initialize : function(){},
+
+    // **render** is the core function that your view should override, in order
+    // to populate its element (`this.el`), with the appropriate HTML. The
+    // convention is for **render** to always return `this`.
+    render : function() {
+      return this;
+    },
+
+    // Remove this view from the DOM. Note that the view isn't present in the
+    // DOM by default, so calling this method may be a no-op.
+    remove : function() {
+      $(this.el).remove();
+      return this;
+    },
+
+    // For small amounts of DOM Elements, where a full-blown template isn't
+    // needed, use **make** to manufacture elements, one at a time.
+    //
+    //     var el = this.make('li', {'class': 'row'}, this.model.get('title'));
+    //
+    make : function(tagName, attributes, content) {
+      var el = document.createElement(tagName);
+      if (attributes) $(el).attr(attributes);
+      if (content) $(el).html(content);
+      return el;
+    },
+
+    // Set callbacks, where `this.callbacks` is a hash of
+    //
+    // *{"event selector": "callback"}*
+    //
+    //     {
+    //       'mousedown .title':  'edit',
+    //       'click .button':     'save'
+    //     }
+    //
+    // pairs. Callbacks will be bound to the view, with `this` set properly.
+    // Uses event delegation for efficiency.
+    // Omitting the selector binds the event to `this.el`.
+    // This only works for delegate-able events: not `focus`, `blur`, and
+    // not `change`, `submit`, and `reset` in Internet Explorer.
+    delegateEvents : function(events) {
+      if (!(events || (events = this.events))) return;
+      $(this.el).unbind();
+      for (var key in events) {
+        var methodName = events[key];
+        var match = key.match(eventSplitter);
+        var eventName = match[1], selector = match[2];
+        var method = _.bind(this[methodName], this);
+        if (selector === '') {
+          $(this.el).bind(eventName, method);
+        } else {
+          $(this.el).delegate(selector, eventName, method);
+        }
+      }
+    },
+
+    // Performs the initial configuration of a View with a set of options.
+    // Keys with special meaning *(model, collection, id, className)*, are
+    // attached directly to the view.
+    _configure : function(options) {
+      if (this.options) options = _.extend({}, this.options, options);
+      if (options.model)      this.model      = options.model;
+      if (options.collection) this.collection = options.collection;
+      if (options.el)         this.el         = options.el;
+      if (options.id)         this.id         = options.id;
+      if (options.className)  this.className  = options.className;
+      if (options.tagName)    this.tagName    = options.tagName;
+      this.options = options;
+    },
+
+    // Ensure that the View has a DOM element to render into.
+    _ensureElement : function() {
+      if (this.el) return;
+      var attrs = {};
+      if (this.id) attrs.id = this.id;
+      if (this.className) attrs["class"] = this.className;
+      this.el = this.make(this.tagName, attrs);
+    }
+
+  });
+
+  // The self-propagating extend function that Backbone classes use.
+  var extend = function (protoProps, classProps) {
+    var child = inherits(this, protoProps, classProps);
+    child.extend = extend;
+    return child;
+  };
+
+  // Set up inheritance for the model, collection, and view.
+  Backbone.Model.extend = Backbone.Collection.extend =
+    Backbone.Controller.extend = Backbone.View.extend = extend;
+
+  // Map from CRUD to HTTP for our default `Backbone.sync` implementation.
+  var methodMap = {
+    'create': 'POST',
+    'update': 'PUT',
+    'delete': 'DELETE',
+    'read'  : 'GET'
+  };
+
+  // Backbone.sync
+  // -------------
+
+  // Override this function to change the manner in which Backbone persists
+  // models to the server. You will be passed the type of request, and the
+  // model in question. By default, uses makes a RESTful Ajax request
+  // to the model's `url()`. Some possible customizations could be:
+  //
+  // * Use `setTimeout` to batch rapid-fire updates into a single request.
+  // * Send up the models as XML instead of JSON.
+  // * Persist models via WebSockets instead of Ajax.
+  //
+  // Turn on `Backbone.emulateHTTP` in order to send `PUT` and `DELETE` requests
+  // as `POST`, with a `_method` parameter containing the true HTTP method,
+  // as well as all requests with the body as `application/x-www-form-urlencoded` instead of
+  // `application/json` with the model in a param named `model`.
+  // Useful when interfacing with server-side languages like **PHP** that make
+  // it difficult to read the body of `PUT` requests.
+  Backbone.sync = function(method, model, success, error) {
+    var type = methodMap[method];
+    var modelJSON = (method === 'create' || method === 'update') ?
+                    JSON.stringify(model.toJSON()) : null;
+
+    // Default JSON-request options.
+    var params = {
+      url:          getUrl(model),
+      type:         type,
+      contentType:  'application/json',
+      data:         modelJSON,
+      dataType:     'json',
+      processData:  false,
+      success:      success,
+      error:        error
+    };
+
+    // For older servers, emulate JSON by encoding the request into an HTML-form.
+    if (Backbone.emulateJSON) {
+      params.contentType = 'application/x-www-form-urlencoded';
+      params.processData = true;
+      params.data        = modelJSON ? {model : modelJSON} : {};
+    }
+
+    // For older servers, emulate HTTP by mimicking the HTTP method with `_method`
+    // And an `X-HTTP-Method-Override` header.
+    if (Backbone.emulateHTTP) {
+      if (type === 'PUT' || type === 'DELETE') {
+        if (Backbone.emulateJSON) params.data._method = type;
+        params.type = 'POST';
+        params.beforeSend = function(xhr) {
+          xhr.setRequestHeader("X-HTTP-Method-Override", type);
+        };
+      }
+    }
+
+    // Make the request.
+    $.ajax(params);
+  };
+
+  // Helpers
+  // -------
+
+  // Shared empty constructor function to aid in prototype-chain creation.
+  var ctor = function(){};
+
+  // Helper function to correctly set up the prototype chain, for subclasses.
+  // Similar to `goog.inherits`, but uses a hash of prototype properties and
+  // class properties to be extended.
+  var inherits = function(parent, protoProps, staticProps) {
+    var child;
+
+    // The constructor function for the new subclass is either defined by you
+    // (the "constructor" property in your `extend` definition), or defaulted
+    // by us to simply call `super()`.
+    if (protoProps && protoProps.hasOwnProperty('constructor')) {
+      child = protoProps.constructor;
+    } else {
+      child = function(){ return parent.apply(this, arguments); };
+    }
+
+    // Set the prototype chain to inherit from `parent`, without calling
+    // `parent`'s constructor function.
+    ctor.prototype = parent.prototype;
+    child.prototype = new ctor();
+
+    // Add prototype properties (instance properties) to the subclass,
+    // if supplied.
+    if (protoProps) _.extend(child.prototype, protoProps);
+
+    // Add static properties to the constructor function, if supplied.
+    if (staticProps) _.extend(child, staticProps);
+
+    // Correctly set child's `prototype.constructor`, for `instanceof`.
+    child.prototype.constructor = child;
+
+    // Set a convenience property in case the parent's prototype is needed later.
+    child.__super__ = parent.prototype;
+
+    return child;
+  };
+
+  // Helper function to get a URL from a Model or Collection as a property
+  // or as a function.
+  var getUrl = function(object) {
+    if (!(object && object.url)) throw new Error("A 'url' property or function must be specified");
+    return _.isFunction(object.url) ? object.url() : object.url;
+  };
+
+  // Wrap an optional error callback with a fallback error event.
+  var wrapError = function(onError, model, options) {
+    return function(resp) {
+      if (onError) {
+        onError(model, resp);
+      } else {
+        model.trigger('error', model, resp, options);
+      }
+    };
+  };
+
+  // Helper function to escape a string for HTML rendering.
+  var escapeHTML = function(string) {
+    return string.replace(/&(?!\w+;)/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
+  };
+
+})();
diff --git a/debian/node_modules/bones/node_modules/backbone/docs/backbone-localstorage.html b/debian/node_modules/bones/node_modules/backbone/docs/backbone-localstorage.html
new file mode 100644
index 0000000..ba1e9e9
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/backbone/docs/backbone-localstorage.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>  <html> <head>   <title>backbone-localstorage.js</title>   <meta http-equiv="content-type" content="text/html; charset=UTF-8">   <link rel="stylesheet" media="all" href="docco.css" /> </head> <body>   <div id="container">     <div id="background"></div>            <div id="jump_to">         Jump To …         <div id="jump_wrapper">           <div id="jump_page">                                           <a class="source" href="backbone-localstorage.html">           [...]
+persistence. Models are given GUIDS, and saved into a JSON object. Simple
+as that.</p>             </td>             <td class="code">               <div class="highlight"><pre></pre></div>             </td>           </tr>                               <tr id="section-2">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-2">¶</a>               </div>               <p>Generate four random hex digits.</p>             </td>             <td class="code">               <div class="highlight"><p [...]
+   <span class="k">return</span> <span class="p">(((</span><span class="mi">1</span><span class="o">+</span><span class="nb">Math</span><span class="p">.</span><span class="nx">random</span><span class="p">())</span><span class="o">*</span><span class="mh">0x10000</span><span class="p">)</span><span class="o">|</span><span class="mi">0</span><span class="p">).</span><span class="nx">toString</span><span class="p">(</span><span class="mi">16</span><span class="p">).</span><span class="nx" [...]
+<span class="p">};</span></pre></div>             </td>           </tr>                               <tr id="section-3">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-3">¶</a>               </div>               <p>Generate a pseudo-GUID by concatenating random hexadecimal.</p>             </td>             <td class="code">               <div class="highlight"><pre><span class="kd">function</span> <span class="nx [...]
+   <span class="k">return</span> <span class="p">(</span><span class="nx">S4</span><span class="p">()</span><span class="o">+</span><span class="nx">S4</span><span class="p">()</span><span class="o">+</span><span class="s2">"-"</span><span class="o">+</span><span class="nx">S4</span><span class="p">()</span><span class="o">+</span><span class="s2">"-"</span><span class="o">+</span><span class="nx">S4</span><span class="p">()</span><span class="o">+</span><span class=" [...]
+<span class="p">};</span></pre></div>             </td>           </tr>                               <tr id="section-4">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-4">¶</a>               </div>               <p>Our Store is represented by a single JS object in <em>localStorage</em>. Create it
+with a meaningful name, like the name you'd give a table.</p>             </td>             <td class="code">               <div class="highlight"><pre><span class="kd">var</span> <span class="nx">Store</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
+  <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="nx">name</span><span class="p">;</span>
+  <span class="kd">var</span> <span class="nx">store</span> <span class="o">=</span> <span class="nx">localStorage</span><span class="p">.</span><span class="nx">getItem</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span>
+  <span class="k">this</span><span class="p">.</span><span class="nx">data</span> <span class="o">=</span> <span class="p">(</span><span class="nx">store</span> <span class="o">&&</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">store</span><span class="p">))</span> <span class="o">||</span> <span class="p">{};</span>
+<span class="p">};</span>
+
+<span class="nx">_</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span><span class="nx">Store</span><span class="p">.</span><span class="nx">prototype</span><span class="p">,</span> <span class="p">{</span></pre></div>             </td>           </tr>                               <tr id="section-5">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-5">¶</a>               </div>        [...]
+    <span class="nx">localStorage</span><span class="p">.</span><span class="nx">setItem</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">name</span><span class="p">,</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">data</span><span class="p">));</span>
+  <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-6">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-6">¶</a>               </div>               <p>Add a model, giving it a (hopefully)-unique GUID, if it doesn't already
+have an id of it's own.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nx">create</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">model</span><span class="p">)</span> <span class="p">{</span>
+    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">model</span><span class="p">.</span><span class="nx">id</span><span class="p">)</span> <span class="nx">model</span><span class="p">.</span><span class="nx">id</span> <span class="o">=</span> <span class="nx">model</span><span class="p">.</span><span class="nx">attributes</span><span class="p">.</span><span class="nx">id</span> <span class="o">=</span> <span class="nx">guid</span><span class="p [...]
+    <span class="k">this</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nx">model</span><span class="p">.</span><span class="nx">id</span><span class="p">]</span> <span class="o">=</span> <span class="nx">model</span><span class="p">;</span>
+    <span class="k">this</span><span class="p">.</span><span class="nx">save</span><span class="p">();</span>
+    <span class="k">return</span> <span class="nx">model</span><span class="p">;</span>
+  <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-7">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-7">¶</a>               </div>               <p>Update a model by replacing its copy in <code>this.data</code>.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nx">update</span><span clas [...]
+    <span class="k">this</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nx">model</span><span class="p">.</span><span class="nx">id</span><span class="p">]</span> <span class="o">=</span> <span class="nx">model</span><span class="p">;</span>
+    <span class="k">this</span><span class="p">.</span><span class="nx">save</span><span class="p">();</span>
+    <span class="k">return</span> <span class="nx">model</span><span class="p">;</span>
+  <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-8">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-8">¶</a>               </div>               <p>Retrieve a model from <code>this.data</code> by id.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nx">find</span><span class="o">:</span> [...]
+    <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nx">model</span><span class="p">.</span><span class="nx">id</span><span class="p">];</span>
+  <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-9">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-9">¶</a>               </div>               <p>Return the array of all models currently in storage.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nx">findAll</span><span class="o">:</s [...]
+    <span class="k">return</span> <span class="nx">_</span><span class="p">.</span><span class="nx">values</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">data</span><span class="p">);</span>
+  <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-10">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-10">¶</a>               </div>               <p>Delete a model from <code>this.data</code>, returning it.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nx">destroy</span><span class=" [...]
+    <span class="k">delete</span> <span class="k">this</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nx">model</span><span class="p">.</span><span class="nx">id</span><span class="p">];</span>
+    <span class="k">this</span><span class="p">.</span><span class="nx">save</span><span class="p">();</span>
+    <span class="k">return</span> <span class="nx">model</span><span class="p">;</span>
+  <span class="p">}</span>
+
+<span class="p">});</span></pre></div>             </td>           </tr>                               <tr id="section-11">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-11">¶</a>               </div>               <p>Override <code>Backbone.sync</code> to use delegate to the model or collection's
+<em>localStorage</em> property, which should be an instance of <code>Store</code>.</p>             </td>             <td class="code">               <div class="highlight"><pre><span class="nx">Backbone</span><span class="p">.</span><span class="nx">sync</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">method</span><span class="p">,</span> <span class="nx">model</span><span class="p">,</span> <span class="nx">success</span><span cla [...]
+
+  <span class="kd">var</span> <span class="nx">resp</span><span class="p">;</span>
+  <span class="kd">var</span> <span class="nx">store</span> <span class="o">=</span> <span class="nx">model</span><span class="p">.</span><span class="nx">localStorage</span> <span class="o">||</span> <span class="nx">model</span><span class="p">.</span><span class="nx">collection</span><span class="p">.</span><span class="nx">localStorage</span><span class="p">;</span>
+
+  <span class="k">switch</span> <span class="p">(</span><span class="nx">method</span><span class="p">)</span> <span class="p">{</span>
+    <span class="k">case</span> <span class="s2">"read"</span><span class="o">:</span>    <span class="nx">resp</span> <span class="o">=</span> <span class="nx">model</span><span class="p">.</span><span class="nx">id</span> <span class="o">?</span> <span class="nx">store</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="nx">model</span><span class="p">)</span> <span class="o">:</span> <span class="nx">store</span><span class="p">.</s [...]
+    <span class="k">case</span> <span class="s2">"create"</span><span class="o">:</span>  <span class="nx">resp</span> <span class="o">=</span> <span class="nx">store</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="nx">model</span><span class="p">);</span>                            <span class="k">break</span><span class="p">;</span>
+    <span class="k">case</span> <span class="s2">"update"</span><span class="o">:</span>  <span class="nx">resp</span> <span class="o">=</span> <span class="nx">store</span><span class="p">.</span><span class="nx">update</span><span class="p">(</span><span class="nx">model</span><span class="p">);</span>                            <span class="k">break</span><span class="p">;</span>
+    <span class="k">case</span> <span class="s2">"delete"</span><span class="o">:</span>  <span class="nx">resp</span> <span class="o">=</span> <span class="nx">store</span><span class="p">.</span><span class="nx">destroy</span><span class="p">(</span><span class="nx">model</span><span class="p">);</span>                           <span class="k">break</span><span class="p">;</span>
+  <span class="p">}</span>
+
+  <span class="k">if</span> <span class="p">(</span><span class="nx">resp</span><span class="p">)</span> <span class="p">{</span>
+    <span class="nx">success</span><span class="p">(</span><span class="nx">resp</span><span class="p">);</span>
+  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
+    <span class="nx">error</span><span class="p">(</span><span class="s2">"Record not found"</span><span class="p">);</span>
+  <span class="p">}</span>
+<span class="p">};</span>
+
+</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> 
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/backbone/docs/backbone.html b/debian/node_modules/bones/node_modules/backbone/docs/backbone.html
new file mode 100644
index 0000000..f6c7901
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/backbone/docs/backbone.html
@@ -0,0 +1,640 @@
+<!DOCTYPE html>  <html> <head>   <title>backbone.js</title>   <meta http-equiv="content-type" content="text/html; charset=UTF-8">   <link rel="stylesheet" media="all" href="docco.css" /> </head> <body>   <div id="container">     <div id="background"></div>          <table cellpadding="0" cellspacing="0">       <thead>         <tr>           <th class="docs">             <h1>               backbone.js             </h1>           </th>           <th class="code">           </th>         </ [...]
+(c) 2010 Jeremy Ashkenas, DocumentCloud Inc.
+Backbone may be freely distributed under the MIT license.
+For all details and documentation:
+http://documentcloud.github.com/backbone
+</code></pre>             </td>             <td class="code">               <div class="highlight"><pre><span class="p">(</span><span class="kd">function</span><span class="p">(){</span></pre></div>             </td>           </tr>                               <tr id="section-2">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-2">¶</a>               </div>               <h2>Initial Setup</h2>             </td>     [...]
+be attached to this. Exported for both CommonJS and the browser.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="kd">var</span> <span class="nx">Backbone</span><span class="p">;</span>
+  <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">exports</span> <span class="o">!==</span> <span class="s1">'undefined'</span><span class="p">)</span> <span class="p">{</span>
+    <span class="nx">Backbone</span> <span class="o">=</span> <span class="nx">exports</span><span class="p">;</span>
+  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
+    <span class="nx">Backbone</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">Backbone</span> <span class="o">=</span> <span class="p">{};</span>
+  <span class="p">}</span></pre></div>             </td>           </tr>                               <tr id="section-4">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-4">¶</a>               </div>               <p>Current version of the library. Keep in sync with <code>package.json</code>.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nx">Backbone</s [...]
+  <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">_</span> <span class="o">&&</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">require</span> <span class="o">!==</span> <span class="s1">'undefined'</span><span class="p">))</span> <span class="nx">_</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">"underscore"</span><span class="p">).</sp [...]
+fake <code>"PUT"</code> and <code>"DELETE"</code> requests via the <code>_method</code> parameter and set a
+<code>X-Http-Method-Override</code> header.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nx">Backbone</span><span class="p">.</span><span class="nx">emulateHTTP</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span></pre></div>             </td>           </tr>                               <tr id="section-8">             <td class="docs">               <div class="pilwrap">                 <a  [...]
+<code>application/json</code> requests ... will encode the body as
+<code>application/x-www-form-urlencoded</code> instead and will send the model in a
+form param named <code>model</code>.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nx">Backbone</span><span class="p">.</span><span class="nx">emulateJSON</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span></pre></div>             </td>           </tr>                               <tr id="section-9">             <td class="docs">               <div class="pilwrap">                 <a class=" [...]
+custom events. You may <code>bind</code> or <code>unbind</code> a callback function to an event;
+<code>trigger</code>-ing an event fires all callbacks in succession.</p>
+
+<pre><code>var object = {};
+_.extend(object, Backbone.Events);
+object.bind('expand', function(){ alert('expanded'); });
+object.trigger('expand');
+</code></pre>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Events</span> <span class="o">=</span> <span class="p">{</span></pre></div>             </td>           </tr>                               <tr id="section-11">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-11">¶</a>               </div>  [...]
+Passing <code>"all"</code> will bind the callback to all events fired.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">bind</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">ev</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
+      <span class="kd">var</span> <span class="nx">calls</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_callbacks</span> <span class="o">||</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">_callbacks</span> <span class="o">=</span> <span class="p">{});</span>
+      <span class="kd">var</span> <span class="nx">list</span>  <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_callbacks</span><span class="p">[</span><span class="nx">ev</span><span class="p">]</span> <span class="o">||</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">_callbacks</span><span class="p">[</span><span class="nx">ev</span><span class="p">]</span> <span class="o">=</span> <span cl [...]
+      <span class="nx">list</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">callback</span><span class="p">);</span>
+      <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-12">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-12">¶</a>               </div>               <p>Remove one or many callbacks. If <code>callback</code> is null, removes all
+callbacks for the event. If <code>ev</code> is null, removes all bound callbacks
+for all events.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">unbind</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">ev</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
+      <span class="kd">var</span> <span class="nx">calls</span><span class="p">;</span>
+      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">ev</span><span class="p">)</span> <span class="p">{</span>
+        <span class="k">this</span><span class="p">.</span><span class="nx">_callbacks</span> <span class="o">=</span> <span class="p">{};</span>
+      <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">calls</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_callbacks</span><span class="p">)</span> <span class="p">{</span>
+        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
+          <span class="nx">calls</span><span class="p">[</span><span class="nx">ev</span><span class="p">]</span> <span class="o">=</span> <span class="p">[];</span>
+        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
+          <span class="kd">var</span> <span class="nx">list</span> <span class="o">=</span> <span class="nx">calls</span><span class="p">[</span><span class="nx">ev</span><span class="p">];</span>
+          <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">list</span><span class="p">)</span> <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
+          <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">list</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o" [...]
+            <span class="k">if</span> <span class="p">(</span><span class="nx">callback</span> <span class="o">===</span> <span class="nx">list</span><span class="p">[</span><span class="nx">i</span><span class="p">])</span> <span class="p">{</span>
+              <span class="nx">list</span><span class="p">.</span><span class="nx">splice</span><span class="p">(</span><span class="nx">i</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
+              <span class="k">break</span><span class="p">;</span>
+            <span class="p">}</span>
+          <span class="p">}</span>
+        <span class="p">}</span>
+      <span class="p">}</span>
+      <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-13">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-13">¶</a>               </div>               <p>Trigger an event, firing all bound callbacks. Callbacks are passed the
+same arguments as <code>trigger</code> is, apart from the event name.
+Listening for <code>"all"</code> passes the true event name as the first argument.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">trigger</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">ev</span><span class="p">)</span> <span class="p">{</span>
+      <span class="kd">var</span> <span class="nx">list</span><span class="p">,</span> <span class="nx">calls</span><span class="p">,</span> <span class="nx">i</span><span class="p">,</span> <span class="nx">l</span><span class="p">;</span>
+      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="nx">calls</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_callbacks</span><span class="p">))</span> <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">list</span> <span class="o">=</span> <span class="nx">calls</span><span class="p">[</span><span class="nx">ev</span><span class="p">])</span> <span class="p">{</span>
+        <span class="k">for</span> <span class="p">(</span><span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">list</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</s [...]
+          <span class="nx">list</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nb">Array</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">slice</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">arguments</span><span class="p">,</span> <s [...]
+        <span class="p">}</span>
+      <span class="p">}</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">list</span> <span class="o">=</span> <span class="nx">calls</span><span class="p">[</span><span class="s1">'all'</span><span class="p">])</span> <span class="p">{</span>
+        <span class="k">for</span> <span class="p">(</span><span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">list</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</s [...]
+          <span class="nx">list</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span>
+        <span class="p">}</span>
+      <span class="p">}</span>
+      <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
+    <span class="p">}</span>
+
+  <span class="p">};</span></pre></div>             </td>           </tr>                               <tr id="section-14">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-14">¶</a>               </div>               <h2>Backbone.Model</h2>             </td>             <td class="code">               <div class="highlight"><pre></pre></div>             </td>           </tr>                               <tr id="se [...]
+is automatically generated and assigned for you.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Model</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">attributes</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
+    <span class="nx">attributes</span> <span class="o">||</span> <span class="p">(</span><span class="nx">attributes</span> <span class="o">=</span> <span class="p">{});</span>
+    <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">defaults</span><span class="p">)</span> <span class="nx">attributes</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">extend</span><span class="p">({},</span> <span class="k">this</span><span class="p">.</span><span class="nx">defaults</span><span class="p">,</span> <span class="nx">attributes</span><span class="p">);</span>
+    <span class="k">this</span><span class="p">.</span><span class="nx">attributes</span> <span class="o">=</span> <span class="p">{};</span>
+    <span class="k">this</span><span class="p">.</span><span class="nx">_escapedAttributes</span> <span class="o">=</span> <span class="p">{};</span>
+    <span class="k">this</span><span class="p">.</span><span class="nx">cid</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">uniqueId</span><span class="p">(</span><span class="s1">'c'</span><span class="p">);</span>
+    <span class="k">this</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="nx">attributes</span><span class="p">,</span> <span class="p">{</span><span class="nx">silent</span> <span class="o">:</span> <span class="kc">true</span><span class="p">});</span>
+    <span class="k">this</span><span class="p">.</span><span class="nx">_previousAttributes</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">clone</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">attributes</span><span class="p">);</span>
+    <span class="k">if</span> <span class="p">(</span><span class="nx">options</span> <span class="o">&&</span> <span class="nx">options</span><span class="p">.</span><span class="nx">collection</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">collection</span> <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">collection</span><span class="p">;</span>
+    <span class="k">this</span><span class="p">.</span><span class="nx">initialize</span><span class="p">(</span><span class="nx">attributes</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
+  <span class="p">};</span></pre></div>             </td>           </tr>                               <tr id="section-16">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-16">¶</a>               </div>               <p>Attach all inheritable methods to the Model prototype.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nx">_</span><span class="p">.</spa [...]
+after the last <code>"change"</code> event was fired.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">_previousAttributes</span> <span class="o">:</span> <span class="kc">null</span><span class="p">,</span></pre></div>             </td>           </tr>                               <tr id="section-18">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-18">& [...]
+initialization logic.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">initialize</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(){},</span></pre></div>             </td>           </tr>                               <tr id="section-20">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-20">¶</a>               </div>    [...]
+      <span class="k">return</span> <span class="nx">_</span><span class="p">.</span><span class="nx">clone</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">attributes</span><span class="p">);</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-21">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-21">¶</a>               </div>               <p>Get the value of an attribute.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">get</span> <span class="o">:</span> <span class="k [...]
+      <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">attributes</span><span class="p">[</span><span class="nx">attr</span><span class="p">];</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-22">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-22">¶</a>               </div>               <p>Get the HTML-escaped value of an attribute.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">escape</span> <span class="o">:</span [...]
+      <span class="kd">var</span> <span class="nx">html</span><span class="p">;</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">html</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_escapedAttributes</span><span class="p">[</span><span class="nx">attr</span><span class="p">])</span> <span class="k">return</span> <span class="nx">html</span><span class="p">;</span>
+      <span class="kd">var</span> <span class="nx">val</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">attributes</span><span class="p">[</span><span class="nx">attr</span><span class="p">];</span>
+      <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">_escapedAttributes</span><span class="p">[</span><span class="nx">attr</span><span class="p">]</span> <span class="o">=</span> <span class="nx">escapeHTML</span><span class="p">(</span><span class="nx">val</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">?</span> <span class="s1">''</span> <span class="o">:</span> <span class="nx">val</span><span cl [...]
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-23">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-23">¶</a>               </div>               <p>Set a hash of model attributes on the object, firing <code>"change"</code> unless you
+choose to silence it.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">set</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">attrs</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span></pre></div>             </td>           </tr>                               <tr id="section-24">             <td class="docs">   [...]
+      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">attrs</span><span class="p">)</span> <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">attrs</span><span class="p">.</span><span class="nx">attributes</span><span class="p">)</span> <span class="nx">attrs</span> <span class="o">=</span> <span class="nx">attrs</span><span class="p">.</span><span class="nx">attributes</span><span class="p">;</span>
+      <span class="kd">var</span> <span class="nx">now</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">attributes</span><span class="p">,</span> <span class="nx">escaped</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_escapedAttributes</span><span class="p">;</span></pre></div>             </td>           </tr>                               <tr id="section-25">             <td class=" [...]
+        <span class="kd">var</span> <span class="nx">val</span> <span class="o">=</span> <span class="nx">attrs</span><span class="p">[</span><span class="nx">attr</span><span class="p">];</span>
+        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">_</span><span class="p">.</span><span class="nx">isEqual</span><span class="p">(</span><span class="nx">now</span><span class="p">[</span><span class="nx">attr</span><span class="p">],</span> <span class="nx">val</span><span class="p">))</span> <span class="p">{</span>
+          <span class="nx">now</span><span class="p">[</span><span class="nx">attr</span><span class="p">]</span> <span class="o">=</span> <span class="nx">val</span><span class="p">;</span>
+          <span class="k">delete</span> <span class="nx">escaped</span><span class="p">[</span><span class="nx">attr</span><span class="p">];</span>
+          <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">options</span><span class="p">.</span><span class="nx">silent</span><span class="p">)</span> <span class="p">{</span>
+            <span class="k">this</span><span class="p">.</span><span class="nx">_changed</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
+            <span class="k">this</span><span class="p">.</span><span class="nx">trigger</span><span class="p">(</span><span class="s1">'change:'</span> <span class="o">+</span> <span class="nx">attr</span><span class="p">,</span> <span class="k">this</span><span class="p">,</span> <span class="nx">val</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
+          <span class="p">}</span>
+        <span class="p">}</span>
+      <span class="p">}</span></pre></div>             </td>           </tr>                               <tr id="section-28">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-28">¶</a>               </div>               <p>Fire the <code>"change"</code> event, if the model has been changed.</p>             </td>             <td class="code">               <div class="highlight"><pre>      <span class="k">if</span>  [...]
+      <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-29">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-29">¶</a>               </div>               <p>Remove an attribute from the model, firing <code>"change"</code> unless you choose
+to silence it.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">unset</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">attr</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
+      <span class="nx">options</span> <span class="o">||</span> <span class="p">(</span><span class="nx">options</span> <span class="o">=</span> <span class="p">{});</span>
+      <span class="kd">var</span> <span class="nx">value</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">attributes</span><span class="p">[</span><span class="nx">attr</span><span class="p">];</span></pre></div>             </td>           </tr>                               <tr id="section-30">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-30">¶</a>              [...]
+      <span class="nx">validObj</span><span class="p">[</span><span class="nx">attr</span><span class="p">]</span> <span class="o">=</span> <span class="k">void</span> <span class="mi">0</span><span class="p">;</span>
+      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">options</span><span class="p">.</span><span class="nx">silent</span> <span class="o">&&</span> <span class="k">this</span><span class="p">.</span><span class="nx">validate</span> <span class="o">&&</span> <span class="o">!</span><span class="k">this</span><span class="p">.</span><span class="nx">_performValidation</span><span class="p">(</span><span class="nx">validObj</span>< [...]
+      <span class="k">delete</span> <span class="k">this</span><span class="p">.</span><span class="nx">_escapedAttributes</span><span class="p">[</span><span class="nx">attr</span><span class="p">];</span>
+      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">options</span><span class="p">.</span><span class="nx">silent</span><span class="p">)</span> <span class="p">{</span>
+        <span class="k">this</span><span class="p">.</span><span class="nx">_changed</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
+        <span class="k">this</span><span class="p">.</span><span class="nx">trigger</span><span class="p">(</span><span class="s1">'change:'</span> <span class="o">+</span> <span class="nx">attr</span><span class="p">,</span> <span class="k">this</span><span class="p">,</span> <span class="k">void</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
+        <span class="k">this</span><span class="p">.</span><span class="nx">change</span><span class="p">(</span><span class="nx">options</span><span class="p">);</span>
+      <span class="p">}</span>
+      <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-32">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-32">¶</a>               </div>               <p>Clear all attributes on the model, firing <code>"change"</code> unless you choose
+to silence it.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">clear</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
+      <span class="nx">options</span> <span class="o">||</span> <span class="p">(</span><span class="nx">options</span> <span class="o">=</span> <span class="p">{});</span>
+      <span class="kd">var</span> <span class="nx">old</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">attributes</span><span class="p">;</span></pre></div>             </td>           </tr>                               <tr id="section-33">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-33">¶</a>               </div>               <p>Run validation.</p>           [...]
+      <span class="k">for</span> <span class="p">(</span><span class="nx">attr</span> <span class="k">in</span> <span class="nx">old</span><span class="p">)</span> <span class="nx">validObj</span><span class="p">[</span><span class="nx">attr</span><span class="p">]</span> <span class="o">=</span> <span class="k">void</span> <span class="mi">0</span><span class="p">;</span>
+      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">options</span><span class="p">.</span><span class="nx">silent</span> <span class="o">&&</span> <span class="k">this</span><span class="p">.</span><span class="nx">validate</span> <span class="o">&&</span> <span class="o">!</span><span class="k">this</span><span class="p">.</span><span class="nx">_performValidation</span><span class="p">(</span><span class="nx">validObj</span>< [...]
+
+      <span class="k">this</span><span class="p">.</span><span class="nx">attributes</span> <span class="o">=</span> <span class="p">{};</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">_escapedAttributes</span> <span class="o">=</span> <span class="p">{};</span>
+      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">options</span><span class="p">.</span><span class="nx">silent</span><span class="p">)</span> <span class="p">{</span>
+        <span class="k">this</span><span class="p">.</span><span class="nx">_changed</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
+        <span class="k">for</span> <span class="p">(</span><span class="nx">attr</span> <span class="k">in</span> <span class="nx">old</span><span class="p">)</span> <span class="p">{</span>
+          <span class="k">this</span><span class="p">.</span><span class="nx">trigger</span><span class="p">(</span><span class="s1">'change:'</span> <span class="o">+</span> <span class="nx">attr</span><span class="p">,</span> <span class="k">this</span><span class="p">,</span> <span class="k">void</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
+        <span class="p">}</span>
+        <span class="k">this</span><span class="p">.</span><span class="nx">change</span><span class="p">(</span><span class="nx">options</span><span class="p">);</span>
+      <span class="p">}</span>
+      <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-34">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-34">¶</a>               </div>               <p>Fetch the model from the server. If the server's representation of the
+model differs from its current attributes, they will be overriden,
+triggering a <code>"change"</code> event.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">fetch</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
+      <span class="nx">options</span> <span class="o">||</span> <span class="p">(</span><span class="nx">options</span> <span class="o">=</span> <span class="p">{});</span>
+      <span class="kd">var</span> <span class="nx">model</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
+      <span class="kd">var</span> <span class="nx">success</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">resp</span><span class="p">)</span> <span class="p">{</span>
+        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">model</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="nx">model</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">resp</span><span class="p">),</span> <span class="nx">options</span><span class="p">))</span> <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
+        <span class="k">if</span> <span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">success</span><span class="p">)</span> <span class="nx">options</span><span class="p">.</span><span class="nx">success</span><span class="p">(</span><span class="nx">model</span><span class="p">,</span> <span class="nx">resp</span><span class="p">);</span>
+      <span class="p">};</span>
+      <span class="kd">var</span> <span class="nx">error</span> <span class="o">=</span> <span class="nx">wrapError</span><span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">error</span><span class="p">,</span> <span class="nx">model</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
+      <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">sync</span> <span class="o">||</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">sync</span><span class="p">)(</span><span class="s1">'read'</span><span class="p">,</span> <span class="k">this</span><span class="p">,</span> <span class="nx">success</span><span class="p">,</span> <span class="nx">error</span><span class="p">);</span>
+      <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-35">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-35">¶</a>               </div>               <p>Set a hash of model attributes, and sync the model to the server.
+If the server returns an attributes hash that differs, the model's
+state will be <code>set</code> again.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">save</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">attrs</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
+      <span class="nx">options</span> <span class="o">||</span> <span class="p">(</span><span class="nx">options</span> <span class="o">=</span> <span class="p">{});</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">attrs</span> <span class="o">&&</span> <span class="o">!</span><span class="k">this</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="nx">attrs</span><span class="p">,</span> <span class="nx">options</span><span class="p">))</span> <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
+      <span class="kd">var</span> <span class="nx">model</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
+      <span class="kd">var</span> <span class="nx">success</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">resp</span><span class="p">)</span> <span class="p">{</span>
+        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">model</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="nx">model</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">resp</span><span class="p">),</span> <span class="nx">options</span><span class="p">))</span> <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
+        <span class="k">if</span> <span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">success</span><span class="p">)</span> <span class="nx">options</span><span class="p">.</span><span class="nx">success</span><span class="p">(</span><span class="nx">model</span><span class="p">,</span> <span class="nx">resp</span><span class="p">);</span>
+      <span class="p">};</span>
+      <span class="kd">var</span> <span class="nx">error</span> <span class="o">=</span> <span class="nx">wrapError</span><span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">error</span><span class="p">,</span> <span class="nx">model</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
+      <span class="kd">var</span> <span class="nx">method</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">isNew</span><span class="p">()</span> <span class="o">?</span> <span class="s1">'create'</span> <span class="o">:</span> <span class="s1">'update'</span><span class="p">;</span>
+      <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">sync</span> <span class="o">||</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">sync</span><span class="p">)(</span><span class="nx">method</span><span class="p">,</span> <span class="k">this</span><span class="p">,</span> <span class="nx">success</span><span class="p">,</span> <span class="nx">error</span><span class="p">);</span>
+      <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-36">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-36">¶</a>               </div>               <p>Destroy this model on the server. Upon success, the model is removed
+from its collection, if it has one.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">destroy</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
+      <span class="nx">options</span> <span class="o">||</span> <span class="p">(</span><span class="nx">options</span> <span class="o">=</span> <span class="p">{});</span>
+      <span class="kd">var</span> <span class="nx">model</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
+      <span class="kd">var</span> <span class="nx">success</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">resp</span><span class="p">)</span> <span class="p">{</span>
+        <span class="k">if</span> <span class="p">(</span><span class="nx">model</span><span class="p">.</span><span class="nx">collection</span><span class="p">)</span> <span class="nx">model</span><span class="p">.</span><span class="nx">collection</span><span class="p">.</span><span class="nx">remove</span><span class="p">(</span><span class="nx">model</span><span class="p">);</span>
+        <span class="k">if</span> <span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">success</span><span class="p">)</span> <span class="nx">options</span><span class="p">.</span><span class="nx">success</span><span class="p">(</span><span class="nx">model</span><span class="p">,</span> <span class="nx">resp</span><span class="p">);</span>
+      <span class="p">};</span>
+      <span class="kd">var</span> <span class="nx">error</span> <span class="o">=</span> <span class="nx">wrapError</span><span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">error</span><span class="p">,</span> <span class="nx">model</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
+      <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">sync</span> <span class="o">||</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">sync</span><span class="p">)(</span><span class="s1">'delete'</span><span class="p">,</span> <span class="k">this</span><span class="p">,</span> <span class="nx">success</span><span class="p">,</span> <span class="nx">error</span><span class="p">);</span>
+      <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-37">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-37">¶</a>               </div>               <p>Default URL for the model's representation on the server -- if you're
+using Backbone's restful methods, override this to change the endpoint
+that will be called.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">url</span> <span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
+      <span class="kd">var</span> <span class="nx">base</span> <span class="o">=</span> <span class="nx">getUrl</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">collection</span><span class="p">);</span>
+      <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">isNew</span><span class="p">())</span> <span class="k">return</span> <span class="nx">base</span><span class="p">;</span>
+      <span class="k">return</span> <span class="nx">base</span> <span class="o">+</span> <span class="p">(</span><span class="nx">base</span><span class="p">.</span><span class="nx">charAt</span><span class="p">(</span><span class="nx">base</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'/'</span> <span class="o">?</span> <span class="s1">'' [...]
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-38">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-38">¶</a>               </div>               <p><strong>parse</strong> converts a response into the hash of attributes to be <code>set</code> on
+the model. The default implementation is just to pass the response along.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">parse</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">resp</span><span class="p">)</span> <span class="p">{</span>
+      <span class="k">return</span> <span class="nx">resp</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-39">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-39">¶</a>               </div>               <p>Create a new model with identical attributes to this one.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">clone</span> <span clas [...]
+      <span class="k">return</span> <span class="k">new</span> <span class="k">this</span><span class="p">.</span><span class="nx">constructor</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-40">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-40">¶</a>               </div>               <p>A model is new if it has never been saved to the server, and has a negative
+ID.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">isNew</span> <span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
+      <span class="k">return</span> <span class="o">!</span><span class="k">this</span><span class="p">.</span><span class="nx">id</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-41">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-41">¶</a>               </div>               <p>Call this method to manually fire a <code>change</code> event for this model.
+Calling this will cause all objects observing the model to update.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">change</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">trigger</span><span class="p">(</span><span class="s1">'change'</span><span class="p">,</span> <span class="k">this</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">_previousAttributes</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">clone</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">attributes</span><span class="p">);</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">_changed</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-42">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-42">¶</a>               </div>               <p>Determine if the model has changed since the last <code>"change"</code> event.
+If you specify an attribute name, determine if that attribute has changed.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">hasChanged</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">attr</span><span class="p">)</span> <span class="p">{</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">attr</span><span class="p">)</span> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">_previousAttributes</span><span class="p">[</span><span class="nx">attr</span><span class="p">]</span> <span class="o">!=</span> <span class="k">this</span><span class="p">.</span><span class="nx">attributes</span><span class="p">[</span><span class="nx">attr</span><span class="p">];</span>
+      <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">_changed</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-43">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-43">¶</a>               </div>               <p>Return an object containing all the attributes that have changed, or false
+if there are no changed attributes. Useful for determining what parts of a
+view need to be updated and/or what attributes need to be persisted to
+the server.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">changedAttributes</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">now</span><span class="p">)</span> <span class="p">{</span>
+      <span class="nx">now</span> <span class="o">||</span> <span class="p">(</span><span class="nx">now</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">attributes</span><span class="p">);</span>
+      <span class="kd">var</span> <span class="nx">old</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_previousAttributes</span><span class="p">;</span>
+      <span class="kd">var</span> <span class="nx">changed</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
+      <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">attr</span> <span class="k">in</span> <span class="nx">now</span><span class="p">)</span> <span class="p">{</span>
+        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">_</span><span class="p">.</span><span class="nx">isEqual</span><span class="p">(</span><span class="nx">old</span><span class="p">[</span><span class="nx">attr</span><span class="p">],</span> <span class="nx">now</span><span class="p">[</span><span class="nx">attr</span><span class="p">]))</span> <span class="p">{</span>
+          <span class="nx">changed</span> <span class="o">=</span> <span class="nx">changed</span> <span class="o">||</span> <span class="p">{};</span>
+          <span class="nx">changed</span><span class="p">[</span><span class="nx">attr</span><span class="p">]</span> <span class="o">=</span> <span class="nx">now</span><span class="p">[</span><span class="nx">attr</span><span class="p">];</span>
+        <span class="p">}</span>
+      <span class="p">}</span>
+      <span class="k">return</span> <span class="nx">changed</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-44">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-44">¶</a>               </div>               <p>Get the previous value of an attribute, recorded at the time the last
+<code>"change"</code> event was fired.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">previous</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">attr</span><span class="p">)</span> <span class="p">{</span>
+      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">attr</span> <span class="o">||</span> <span class="o">!</span><span class="k">this</span><span class="p">.</span><span class="nx">_previousAttributes</span><span class="p">)</span> <span class="k">return</span> <span class="kc">null</span><span class="p">;</span>
+      <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">_previousAttributes</span><span class="p">[</span><span class="nx">attr</span><span class="p">];</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-45">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-45">¶</a>               </div>               <p>Get all of the attributes of the model at the time of the previous
+<code>"change"</code> event.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">previousAttributes</span> <span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
+      <span class="k">return</span> <span class="nx">_</span><span class="p">.</span><span class="nx">clone</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">_previousAttributes</span><span class="p">);</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-46">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-46">¶</a>               </div>               <p>Run validation against a set of incoming attributes, returning <code>true</code>
+if all is well. If a specific <code>error</code> callback has been passed,
+call that instead of firing the general <code>"error"</code> event.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">_performValidation</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">attrs</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
+      <span class="kd">var</span> <span class="nx">error</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">validate</span><span class="p">(</span><span class="nx">attrs</span><span class="p">);</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
+        <span class="k">if</span> <span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
+          <span class="nx">options</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">error</span><span class="p">);</span>
+        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
+          <span class="k">this</span><span class="p">.</span><span class="nx">trigger</span><span class="p">(</span><span class="s1">'error'</span><span class="p">,</span> <span class="k">this</span><span class="p">,</span> <span class="nx">error</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
+        <span class="p">}</span>
+        <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
+      <span class="p">}</span>
+      <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
+    <span class="p">}</span>
+
+  <span class="p">});</span></pre></div>             </td>           </tr>                               <tr id="section-47">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-47">¶</a>               </div>               <h2>Backbone.Collection</h2>             </td>             <td class="code">               <div class="highlight"><pre></pre></div>             </td>           </tr>                               <tr  [...]
+or unordered. If a <code>comparator</code> is specified, the Collection will maintain
+its models in sort order, as they're added and removed.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Collection</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">models</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
+    <span class="nx">options</span> <span class="o">||</span> <span class="p">(</span><span class="nx">options</span> <span class="o">=</span> <span class="p">{});</span>
+    <span class="k">if</span> <span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">comparator</span><span class="p">)</span> <span class="p">{</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">comparator</span> <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">comparator</span><span class="p">;</span>
+      <span class="k">delete</span> <span class="nx">options</span><span class="p">.</span><span class="nx">comparator</span><span class="p">;</span>
+    <span class="p">}</span>
+    <span class="k">this</span><span class="p">.</span><span class="nx">_boundOnModelEvent</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">_onModelEvent</span><span class="p">,</span> <span class="k">this</span><span class="p">);</span>
+    <span class="k">this</span><span class="p">.</span><span class="nx">_reset</span><span class="p">();</span>
+    <span class="k">if</span> <span class="p">(</span><span class="nx">models</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">refresh</span><span class="p">(</span><span class="nx">models</span><span class="p">,</span> <span class="p">{</span><span class="nx">silent</span><span class="o">:</span> <span class="kc">true</span><span class="p">});</span>
+    <span class="k">this</span><span class="p">.</span><span class="nx">initialize</span><span class="p">(</span><span class="nx">models</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
+  <span class="p">};</span></pre></div>             </td>           </tr>                               <tr id="section-49">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-49">¶</a>               </div>               <p>Define the Collection's inheritable methods.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nx">_</span><span class="p">.</span><span cl [...]
+This should be overridden in most cases.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">model</span> <span class="o">:</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Model</span><span class="p">,</span></pre></div>             </td>           </tr>                               <tr id="section-51">             <td class="docs">               <div class="pilwrap">                 <a class= [...]
+initialization logic.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">initialize</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(){},</span></pre></div>             </td>           </tr>                               <tr id="section-52">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-52">¶</a>               </div>    [...]
+models' attributes.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">toJSON</span> <span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
+      <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">model</span><span class="p">){</span> <span class="k">return</span> <span class="nx">model</span><span class="p">.</span><span class="nx">toJSON</span><span class="p">();</span> <span class="p">});</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-53">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-53">¶</a>               </div>               <p>Add a model, or list of models to the set. Pass <strong>silent</strong> to avoid
+firing the <code>added</code> event for every new model.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">add</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">models</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">_</span><span class="p">.</span><span class="nx">isArray</span><span class="p">(</span><span class="nx">models</span><span class="p">))</span> <span class="p">{</span>
+        <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">models</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o" [...]
+          <span class="k">this</span><span class="p">.</span><span class="nx">_add</span><span class="p">(</span><span class="nx">models</span><span class="p">[</span><span class="nx">i</span><span class="p">],</span> <span class="nx">options</span><span class="p">);</span>
+        <span class="p">}</span>
+      <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
+        <span class="k">this</span><span class="p">.</span><span class="nx">_add</span><span class="p">(</span><span class="nx">models</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
+      <span class="p">}</span>
+      <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-54">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-54">¶</a>               </div>               <p>Remove a model, or a list of models from the set. Pass silent to avoid
+firing the <code>removed</code> event for every model removed.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">remove</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">models</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">_</span><span class="p">.</span><span class="nx">isArray</span><span class="p">(</span><span class="nx">models</span><span class="p">))</span> <span class="p">{</span>
+        <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">models</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o" [...]
+          <span class="k">this</span><span class="p">.</span><span class="nx">_remove</span><span class="p">(</span><span class="nx">models</span><span class="p">[</span><span class="nx">i</span><span class="p">],</span> <span class="nx">options</span><span class="p">);</span>
+        <span class="p">}</span>
+      <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
+        <span class="k">this</span><span class="p">.</span><span class="nx">_remove</span><span class="p">(</span><span class="nx">models</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
+      <span class="p">}</span>
+      <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-55">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-55">¶</a>               </div>               <p>Get a model from the set by id.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">get</span> <span class="o">:</span> <span class=" [...]
+      <span class="k">if</span> <span class="p">(</span><span class="nx">id</span> <span class="o">==</span> <span class="kc">null</span><span class="p">)</span> <span class="k">return</span> <span class="kc">null</span><span class="p">;</span>
+      <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">_byId</span><span class="p">[</span><span class="nx">id</span><span class="p">.</span><span class="nx">id</span> <span class="o">!=</span> <span class="kc">null</span> <span class="o">?</span> <span class="nx">id</span><span class="p">.</span><span class="nx">id</span> <span class="o">:</span> <span class="nx">id</span><span class="p">];</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-56">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-56">¶</a>               </div>               <p>Get a model from the set by client id.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">getByCid</span> <span class="o">:</span> < [...]
+      <span class="k">return</span> <span class="nx">cid</span> <span class="o">&&</span> <span class="k">this</span><span class="p">.</span><span class="nx">_byCid</span><span class="p">[</span><span class="nx">cid</span><span class="p">.</span><span class="nx">cid</span> <span class="o">||</span> <span class="nx">cid</span><span class="p">];</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-57">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-57">¶</a>               </div>               <p>Get the model at the given index.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">at</span><span class="o">:</span> <span class=" [...]
+      <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">models</span><span class="p">[</span><span class="nx">index</span><span class="p">];</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-58">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-58">¶</a>               </div>               <p>Force the collection to re-sort itself. You don't need to call this under normal
+circumstances, as the set will maintain sort order as each item is added.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">sort</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
+      <span class="nx">options</span> <span class="o">||</span> <span class="p">(</span><span class="nx">options</span> <span class="o">=</span> <span class="p">{});</span>
+      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="k">this</span><span class="p">.</span><span class="nx">comparator</span><span class="p">)</span> <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s1">'Cannot sort a set without a comparator'</span><span class="p">);</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">models</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">sortBy</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">comparator</span><span class="p">);</span>
+      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">options</span><span class="p">.</span><span class="nx">silent</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">trigger</span><span class="p">(</span><span class="s1">'refresh'</span><span class="p">,</span> <span class="k">this</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
+      <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-59">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-59">¶</a>               </div>               <p>Pluck an attribute from each model in the collection.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">pluck</span> <span class="o [...]
+      <span class="k">return</span> <span class="nx">_</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">models</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">model</span><span class="p">){</span> <span class="k">return</span> <span class="nx">model</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span [...]
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-60">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-60">¶</a>               </div>               <p>When you have more items than you want to add or remove individually,
+you can refresh the entire set with a new list of models, without firing
+any <code>added</code> or <code>removed</code> events. Fires <code>refresh</code> when finished.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">refresh</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">models</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
+      <span class="nx">models</span>  <span class="o">||</span> <span class="p">(</span><span class="nx">models</span> <span class="o">=</span> <span class="p">[]);</span>
+      <span class="nx">options</span> <span class="o">||</span> <span class="p">(</span><span class="nx">options</span> <span class="o">=</span> <span class="p">{});</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">_reset</span><span class="p">();</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">models</span><span class="p">,</span> <span class="p">{</span><span class="nx">silent</span><span class="o">:</span> <span class="kc">true</span><span class="p">});</span>
+      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">options</span><span class="p">.</span><span class="nx">silent</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">trigger</span><span class="p">(</span><span class="s1">'refresh'</span><span class="p">,</span> <span class="k">this</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
+      <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-61">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-61">¶</a>               </div>               <p>Fetch the default set of models for this collection, refreshing the
+collection when they arrive.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">fetch</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
+      <span class="nx">options</span> <span class="o">||</span> <span class="p">(</span><span class="nx">options</span> <span class="o">=</span> <span class="p">{});</span>
+      <span class="kd">var</span> <span class="nx">collection</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
+      <span class="kd">var</span> <span class="nx">success</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">resp</span><span class="p">)</span> <span class="p">{</span>
+        <span class="nx">collection</span><span class="p">.</span><span class="nx">refresh</span><span class="p">(</span><span class="nx">collection</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">resp</span><span class="p">));</span>
+        <span class="k">if</span> <span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">success</span><span class="p">)</span> <span class="nx">options</span><span class="p">.</span><span class="nx">success</span><span class="p">(</span><span class="nx">collection</span><span class="p">,</span> <span class="nx">resp</span><span class="p">);</span>
+      <span class="p">};</span>
+      <span class="kd">var</span> <span class="nx">error</span> <span class="o">=</span> <span class="nx">wrapError</span><span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">error</span><span class="p">,</span> <span class="nx">collection</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
+      <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">sync</span> <span class="o">||</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">sync</span><span class="p">)(</span><span class="s1">'read'</span><span class="p">,</span> <span class="k">this</span><span class="p">,</span> <span class="nx">success</span><span class="p">,</span> <span class="nx">error</span><span class="p">);</span>
+      <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-62">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-62">¶</a>               </div>               <p>Create a new instance of a model in this collection. After the model
+has been created on the server, it will be added to the collection.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">create</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">model</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
+      <span class="kd">var</span> <span class="nx">coll</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
+      <span class="nx">options</span> <span class="o">||</span> <span class="p">(</span><span class="nx">options</span> <span class="o">=</span> <span class="p">{});</span>
+      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="nx">model</span> <span class="k">instanceof</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Model</span><span class="p">))</span> <span class="p">{</span>
+        <span class="nx">model</span> <span class="o">=</span> <span class="k">new</span> <span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">(</span><span class="nx">model</span><span class="p">,</span> <span class="p">{</span><span class="nx">collection</span><span class="o">:</span> <span class="nx">coll</span><span class="p">});</span>
+      <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
+        <span class="nx">model</span><span class="p">.</span><span class="nx">collection</span> <span class="o">=</span> <span class="nx">coll</span><span class="p">;</span>
+      <span class="p">}</span>
+      <span class="kd">var</span> <span class="nx">success</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">nextModel</span><span class="p">,</span> <span class="nx">resp</span><span class="p">)</span> <span class="p">{</span>
+        <span class="nx">coll</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">nextModel</span><span class="p">);</span>
+        <span class="k">if</span> <span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">success</span><span class="p">)</span> <span class="nx">options</span><span class="p">.</span><span class="nx">success</span><span class="p">(</span><span class="nx">nextModel</span><span class="p">,</span> <span class="nx">resp</span><span class="p">);</span>
+      <span class="p">};</span>
+      <span class="k">return</span> <span class="nx">model</span><span class="p">.</span><span class="nx">save</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="p">{</span><span class="nx">success</span> <span class="o">:</span> <span class="nx">success</span><span class="p">,</span> <span class="nx">error</span> <span class="o">:</span> <span class="nx">options</span><span class="p">.</span><span class="nx">error</span><span class="p">});</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-63">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-63">¶</a>               </div>               <p><strong>parse</strong> converts a response into a list of models to be added to the
+collection. The default implementation is just to pass it through.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">parse</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">resp</span><span class="p">)</span> <span class="p">{</span>
+      <span class="k">return</span> <span class="nx">resp</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-64">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-64">¶</a>               </div>               <p>Proxy to _'s chain. Can't be proxied the same way the rest of the
+underscore methods are proxied because it relies on the underscore
+constructor.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">chain</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
+      <span class="k">return</span> <span class="nx">_</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">models</span><span class="p">).</span><span class="nx">chain</span><span class="p">();</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-65">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-65">¶</a>               </div>               <p>Reset all internal state. Called when the collection is refreshed.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">_reset</span>  [...]
+      <span class="k">this</span><span class="p">.</span><span class="nx">length</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">models</span> <span class="o">=</span> <span class="p">[];</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">_byId</span>  <span class="o">=</span> <span class="p">{};</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">_byCid</span> <span class="o">=</span> <span class="p">{};</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-66">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-66">¶</a>               </div>               <p>Internal implementation of adding a single model to the set, updating
+hash indexes for <code>id</code> and <code>cid</code> lookups.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">_add</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">model</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
+      <span class="nx">options</span> <span class="o">||</span> <span class="p">(</span><span class="nx">options</span> <span class="o">=</span> <span class="p">{});</span>
+      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="nx">model</span> <span class="k">instanceof</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Model</span><span class="p">))</span> <span class="p">{</span>
+        <span class="nx">model</span> <span class="o">=</span> <span class="k">new</span> <span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">(</span><span class="nx">model</span><span class="p">,</span> <span class="p">{</span><span class="nx">collection</span><span class="o">:</span> <span class="k">this</span><span class="p">});</span>
+      <span class="p">}</span>
+      <span class="kd">var</span> <span class="nx">already</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">getByCid</span><span class="p">(</span><span class="nx">model</span><span class="p">);</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">already</span><span class="p">)</span> <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">([</span><span class="s2">"Can't add the same model to a set twice"</span><span class="p">,</span> <span class="nx">already</span><span class="p">.</span><span class="nx">id</span><span class="p">]);</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">_byId</span><span class="p">[</span><span class="nx">model</span><span class="p">.</span><span class="nx">id</span><span class="p">]</span> <span class="o">=</span> <span class="nx">model</span><span class="p">;</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">_byCid</span><span class="p">[</span><span class="nx">model</span><span class="p">.</span><span class="nx">cid</span><span class="p">]</span> <span class="o">=</span> <span class="nx">model</span><span class="p">;</span>
+      <span class="nx">model</span><span class="p">.</span><span class="nx">collection</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
+      <span class="kd">var</span> <span class="nx">index</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">comparator</span> <span class="o">?</span> <span class="k">this</span><span class="p">.</span><span class="nx">sortedIndex</span><span class="p">(</span><span class="nx">model</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">comparator</span><span class="p">)</span> <span class="o">:< [...]
+      <span class="k">this</span><span class="p">.</span><span class="nx">models</span><span class="p">.</span><span class="nx">splice</span><span class="p">(</span><span class="nx">index</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">model</span><span class="p">);</span>
+      <span class="nx">model</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="s1">'all'</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">_boundOnModelEvent</span><span class="p">);</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">length</span><span class="o">++</span><span class="p">;</span>
+      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">options</span><span class="p">.</span><span class="nx">silent</span><span class="p">)</span> <span class="nx">model</span><span class="p">.</span><span class="nx">trigger</span><span class="p">(</span><span class="s1">'add'</span><span class="p">,</span> <span class="nx">model</span><span class="p">,</span> <span class="k">this</span><span class="p">,</span> <span class="nx">options</ [...]
+      <span class="k">return</span> <span class="nx">model</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-67">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-67">¶</a>               </div>               <p>Internal implementation of removing a single model from the set, updating
+hash indexes for <code>id</code> and <code>cid</code> lookups.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">_remove</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">model</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
+      <span class="nx">options</span> <span class="o">||</span> <span class="p">(</span><span class="nx">options</span> <span class="o">=</span> <span class="p">{});</span>
+      <span class="nx">model</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">getByCid</span><span class="p">(</span><span class="nx">model</span><span class="p">)</span> <span class="o">||</span> <span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">model</span><span class="p">);</span>
+      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">model</span><span class="p">)</span> <span class="k">return</span> <span class="kc">null</span><span class="p">;</span>
+      <span class="k">delete</span> <span class="k">this</span><span class="p">.</span><span class="nx">_byId</span><span class="p">[</span><span class="nx">model</span><span class="p">.</span><span class="nx">id</span><span class="p">];</span>
+      <span class="k">delete</span> <span class="k">this</span><span class="p">.</span><span class="nx">_byCid</span><span class="p">[</span><span class="nx">model</span><span class="p">.</span><span class="nx">cid</span><span class="p">];</span>
+      <span class="k">delete</span> <span class="nx">model</span><span class="p">.</span><span class="nx">collection</span><span class="p">;</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">models</span><span class="p">.</span><span class="nx">splice</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="nx">model</span><span class="p">),</span> <span class="mi">1</span><span class="p">);</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">length</span><span class="o">--</span><span class="p">;</span>
+      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">options</span><span class="p">.</span><span class="nx">silent</span><span class="p">)</span> <span class="nx">model</span><span class="p">.</span><span class="nx">trigger</span><span class="p">(</span><span class="s1">'remove'</span><span class="p">,</span> <span class="nx">model</span><span class="p">,</span> <span class="k">this</span><span class="p">,</span> <span class="nx">option [...]
+      <span class="nx">model</span><span class="p">.</span><span class="nx">unbind</span><span class="p">(</span><span class="s1">'all'</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">_boundOnModelEvent</span><span class="p">);</span>
+      <span class="k">return</span> <span class="nx">model</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-68">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-68">¶</a>               </div>               <p>Internal method called every time a model in the set fires an event.
+Sets need to update their indexes when models change ids. All other
+events simply proxy through.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">_onModelEvent</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">ev</span><span class="p">,</span> <span class="nx">model</span><span class="p">)</span> <span class="p">{</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">ev</span> <span class="o">===</span> <span class="s1">'change:id'</span><span class="p">)</span> <span class="p">{</span>
+        <span class="k">delete</span> <span class="k">this</span><span class="p">.</span><span class="nx">_byId</span><span class="p">[</span><span class="nx">model</span><span class="p">.</span><span class="nx">previous</span><span class="p">(</span><span class="s1">'id'</span><span class="p">)];</span>
+        <span class="k">this</span><span class="p">.</span><span class="nx">_byId</span><span class="p">[</span><span class="nx">model</span><span class="p">.</span><span class="nx">id</span><span class="p">]</span> <span class="o">=</span> <span class="nx">model</span><span class="p">;</span>
+      <span class="p">}</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">trigger</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span>
+    <span class="p">}</span>
+
+  <span class="p">});</span></pre></div>             </td>           </tr>                               <tr id="section-69">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-69">¶</a>               </div>               <p>Underscore methods that we want to implement on the Collection.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="kd">var</span> <span cla [...]
+    <span class="s1">'filter'</span><span class="p">,</span> <span class="s1">'select'</span><span class="p">,</span> <span class="s1">'reject'</span><span class="p">,</span> <span class="s1">'every'</span><span class="p">,</span> <span class="s1">'all'</span><span class="p">,</span> <span class="s1">'some'</span><span class="p">,</span> <span class="s1">'any'</span><span class="p">,</span> <span class="s1">'include'</span>< [...]
+    <span class="s1">'invoke'</span><span class="p">,</span> <span class="s1">'max'</span><span class="p">,</span> <span class="s1">'min'</span><span class="p">,</span> <span class="s1">'sortBy'</span><span class="p">,</span> <span class="s1">'sortedIndex'</span><span class="p">,</span> <span class="s1">'toArray'</span><span class="p">,</span> <span class="s1">'size'</span><span class="p">,</span>
+    <span class="s1">'first'</span><span class="p">,</span> <span class="s1">'rest'</span><span class="p">,</span> <span class="s1">'last'</span><span class="p">,</span> <span class="s1">'without'</span><span class="p">,</span> <span class="s1">'indexOf'</span><span class="p">,</span> <span class="s1">'lastIndexOf'</span><span class="p">,</span> <span class="s1">'isEmpty'</span><span class="p">];</span></pre></div>             </td> [...]
+    <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Collection</span><span class="p">.</span><span class="nx">prototype</span><span class="p">[</span><span class="nx">method</span><span class="p">]</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
+      <span class="k">return</span> <span class="nx">_</span><span class="p">[</span><span class="nx">method</span><span class="p">].</span><span class="nx">apply</span><span class="p">(</span><span class="nx">_</span><span class="p">,</span> <span class="p">[</span><span class="k">this</span><span class="p">.</span><span class="nx">models</span><span class="p">].</span><span class="nx">concat</span><span class="p">(</span><span class="nx">_</span><span class="p">.</span><span class="nx" [...]
+    <span class="p">};</span>
+  <span class="p">});</span></pre></div>             </td>           </tr>                               <tr id="section-71">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-71">¶</a>               </div>               <h2>Backbone.Controller</h2>             </td>             <td class="code">               <div class="highlight"><pre></pre></div>             </td>           </tr>                               <tr  [...]
+matched. Creating a new one sets its <code>routes</code> hash, if not set statically.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Controller</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
+    <span class="nx">options</span> <span class="o">||</span> <span class="p">(</span><span class="nx">options</span> <span class="o">=</span> <span class="p">{});</span>
+    <span class="k">if</span> <span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">routes</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">routes</span> <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">routes</span><span class="p">;</span>
+    <span class="k">this</span><span class="p">.</span><span class="nx">_bindRoutes</span><span class="p">();</span>
+    <span class="k">this</span><span class="p">.</span><span class="nx">initialize</span><span class="p">(</span><span class="nx">options</span><span class="p">);</span>
+  <span class="p">};</span></pre></div>             </td>           </tr>                               <tr id="section-73">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-73">¶</a>               </div>               <p>Cached regular expressions for matching named param parts and splatted
+parts of route strings.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="kd">var</span> <span class="nx">namedParam</span> <span class="o">=</span> <span class="sr">/:([\w\d]+)/g</span><span class="p">;</span>
+  <span class="kd">var</span> <span class="nx">splatParam</span> <span class="o">=</span> <span class="sr">/\*([\w\d]+)/g</span><span class="p">;</span></pre></div>             </td>           </tr>                               <tr id="section-74">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-74">¶</a>               </div>               <p>Set up all inheritable <strong>Backbone.Controller</strong> properties an [...]
+initialization logic.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">initialize</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(){},</span></pre></div>             </td>           </tr>                               <tr id="section-76">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-76">¶</a>               </div>    [...]
+
+<pre><code>this.route('search/:query/p:num', 'search', function(query, num) {
+  ...
+});
+</code></pre>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">route</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">route</span><span class="p">,</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
+      <span class="nx">Backbone</span><span class="p">.</span><span class="nx">history</span> <span class="o">||</span> <span class="p">(</span><span class="nx">Backbone</span><span class="p">.</span><span class="nx">history</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">History</span><span class="p">);</span>
+      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">_</span><span class="p">.</span><span class="nx">isRegExp</span><span class="p">(</span><span class="nx">route</span><span class="p">))</span> <span class="nx">route</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_routeToRegExp</span><span class="p">(</span><span class="nx">route</span><span class="p">);</span>
+      <span class="nx">Backbone</span><span class="p">.</span><span class="nx">history</span><span class="p">.</span><span class="nx">route</span><span class="p">(</span><span class="nx">route</span><span class="p">,</span> <span class="nx">_</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">fragment</span><span class="p">)</span> <span class="p">{</span>
+        <span class="kd">var</span> <span class="nx">args</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_extractParameters</span><span class="p">(</span><span class="nx">route</span><span class="p">,</span> <span class="nx">fragment</span><span class="p">);</span>
+        <span class="nx">callback</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">args</span><span class="p">);</span>
+        <span class="k">this</span><span class="p">.</span><span class="nx">trigger</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="p">[</span><span class="s1">'route:'</span> <span class="o">+</span> <span class="nx">name</span><span class="p">].</span><span class="nx">concat</span><span class="p">(</span><span class="nx">args</span><span class="p">));</span>
+      <span class="p">},</span> <span class="k">this</span><span class="p">));</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-77">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-77">¶</a>               </div>               <p>Simple proxy to <code>Backbone.history</code> to save a fragment into the history,
+without triggering routes.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">saveLocation</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">fragment</span><span class="p">)</span> <span class="p">{</span>
+      <span class="nx">Backbone</span><span class="p">.</span><span class="nx">history</span><span class="p">.</span><span class="nx">saveLocation</span><span class="p">(</span><span class="nx">fragment</span><span class="p">);</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-78">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-78">¶</a>               </div>               <p>Bind all defined routes to <code>Backbone.history</code>.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">_bindRoutes</span> <spa [...]
+      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="k">this</span><span class="p">.</span><span class="nx">routes</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>
+      <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">route</span> <span class="k">in</span> <span class="k">this</span><span class="p">.</span><span class="nx">routes</span><span class="p">)</span> <span class="p">{</span>
+        <span class="kd">var</span> <span class="nx">name</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">routes</span><span class="p">[</span><span class="nx">route</span><span class="p">];</span>
+        <span class="k">this</span><span class="p">.</span><span class="nx">route</span><span class="p">(</span><span class="nx">route</span><span class="p">,</span> <span class="nx">name</span><span class="p">,</span> <span class="k">this</span><span class="p">[</span><span class="nx">name</span><span class="p">]);</span>
+      <span class="p">}</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-79">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-79">¶</a>               </div>               <p>Convert a route string into a regular expression, suitable for matching
+against the current location fragment.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">_routeToRegExp</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">route</span><span class="p">)</span> <span class="p">{</span>
+      <span class="nx">route</span> <span class="o">=</span> <span class="nx">route</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="nx">namedParam</span><span class="p">,</span> <span class="s2">"([^\/]*)"</span><span class="p">).</span><span class="nx">replace</span><span class="p">(</span><span class="nx">splatParam</span><span class="p">,</span> <span class="s2">"(.*?)"</span><span class="p">);</span>
+      <span class="k">return</span> <span class="k">new</span> <span class="nb">RegExp</span><span class="p">(</span><span class="s1">'^'</span> <span class="o">+</span> <span class="nx">route</span> <span class="o">+</span> <span class="s1">'$'</span><span class="p">);</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-80">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-80">¶</a>               </div>               <p>Given a route, and a URL fragment that it matches, return the array of
+extracted parameters.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">_extractParameters</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">route</span><span class="p">,</span> <span class="nx">fragment</span><span class="p">)</span> <span class="p">{</span>
+      <span class="k">return</span> <span class="nx">route</span><span class="p">.</span><span class="nx">exec</span><span class="p">(</span><span class="nx">fragment</span><span class="p">).</span><span class="nx">slice</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
+    <span class="p">}</span>
+
+  <span class="p">});</span></pre></div>             </td>           </tr>                               <tr id="section-81">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-81">¶</a>               </div>               <h2>Backbone.History</h2>             </td>             <td class="code">               <div class="highlight"><pre></pre></div>             </td>           </tr>                               <tr id= [...]
+browser does not support <code>onhashchange</code>, falls back to polling.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nx">Backbone</span><span class="p">.</span><span class="nx">History</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
+    <span class="k">this</span><span class="p">.</span><span class="nx">handlers</span> <span class="o">=</span> <span class="p">[];</span>
+    <span class="k">this</span><span class="p">.</span><span class="nx">fragment</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">getFragment</span><span class="p">();</span>
+    <span class="nx">_</span><span class="p">.</span><span class="nx">bindAll</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="s1">'checkUrl'</span><span class="p">);</span>
+  <span class="p">};</span></pre></div>             </td>           </tr>                               <tr id="section-83">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-83">¶</a>               </div>               <p>Cached regex for cleaning hashes.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="kd">var</span> <span class="nx">hashStrip</span> <span  [...]
+twenty times a second.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">interval</span><span class="o">:</span> <span class="mi">50</span><span class="p">,</span></pre></div>             </td>           </tr>                               <tr id="section-86">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-86">¶</a>               </div>                [...]
+      <span class="k">return</span> <span class="p">(</span><span class="nx">loc</span> <span class="o">||</span> <span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">).</span><span class="nx">hash</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="nx">hashStrip</span><span class="p">,</span> <span class="s1">''</span><span class="p">);</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-87">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-87">¶</a>               </div>               <p>Start the hash change handling, returning <code>true</code> if the current URL matches
+an existing route, and <code>false</code> otherwise.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">start</span> <span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
+      <span class="kd">var</span> <span class="nx">docMode</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">documentMode</span><span class="p">;</span>
+      <span class="kd">var</span> <span class="nx">oldIE</span> <span class="o">=</span> <span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">browser</span><span class="p">.</span><span class="nx">msie</span> <span class="o">&&</span> <span class="p">(</span><span class="o">!</span><span class="nx">docMode</span> <span class="o">||</span> <span class="nx">docMode</span> <span class="o"><=</span> <span class="mi">7</span><span class="p">));</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">oldIE</span><span class="p">)</span> <span class="p">{</span>
+        <span class="k">this</span><span class="p">.</span><span class="nx">iframe</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">'<iframe src="javascript:0" tabindex="-1" />'</span><span class="p">).</span><span class="nx">hide</span><span class="p">().</span><span class="nx">appendTo</span><span class="p">(</span><span class="s1">'body'</span><span class="p">)[</span><span class="mi">0</span><s [...]
+      <span class="p">}</span>
+      <span class="k">if</span> <span class="p">(</span><span class="s1">'onhashchange'</span> <span class="k">in</span> <span class="nb">window</span> <span class="o">&&</span> <span class="o">!</span><span class="nx">oldIE</span><span class="p">)</span> <span class="p">{</span>
+        <span class="nx">$</span><span class="p">(</span><span class="nb">window</span><span class="p">).</span><span class="nx">bind</span><span class="p">(</span><span class="s1">'hashchange'</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">checkUrl</span><span class="p">);</span>
+      <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
+        <span class="nx">setInterval</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">checkUrl</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">interval</span><span class="p">);</span>
+      <span class="p">}</span>
+      <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">loadUrl</span><span class="p">();</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-88">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-88">¶</a>               </div>               <p>Add a route to be tested when the hash changes. Routes are matched in the
+order they are added.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">route</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">route</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">handlers</span><span class="p">.</span><span class="nx">push</span><span class="p">({</span><span class="nx">route</span> <span class="o">:</span> <span class="nx">route</span><span class="p">,</span> <span class="nx">callback</span> <span class="o">:</span> <span class="nx">callback</span><span class="p">});</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-89">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-89">¶</a>               </div>               <p>Checks the current URL to see if it has changed, and if it has,
+calls <code>loadUrl</code>, normalizing across the hidden iframe.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">checkUrl</span> <span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
+      <span class="kd">var</span> <span class="nx">current</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">getFragment</span><span class="p">();</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">current</span> <span class="o">==</span> <span class="k">this</span><span class="p">.</span><span class="nx">fragment</span> <span class="o">&&</span> <span class="k">this</span><span class="p">.</span><span class="nx">iframe</span><span class="p">)</span> <span class="p">{</span>
+        <span class="nx">current</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">getFragment</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">iframe</span><span class="p">.</span><span class="nx">location</span><span class="p">);</span>
+      <span class="p">}</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">current</span> <span class="o">==</span> <span class="k">this</span><span class="p">.</span><span class="nx">fragment</span> <span class="o">||</span>
+          <span class="nx">current</span> <span class="o">==</span> <span class="nb">decodeURIComponent</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">fragment</span><span class="p">))</span> <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
+      <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">iframe</span><span class="p">)</span> <span class="p">{</span>
+        <span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">hash</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">iframe</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">hash</span> <span class="o">=</span> <span class="nx">current</span><span class="p">;</span>
+      <span class="p">}</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">loadUrl</span><span class="p">();</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-90">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-90">¶</a>               </div>               <p>Attempt to load the current URL fragment. If a route succeeds with a
+match, returns <code>true</code>. If no defined routes matches the fragment,
+returns <code>false</code>.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">loadUrl</span> <span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
+      <span class="kd">var</span> <span class="nx">fragment</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">fragment</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">getFragment</span><span class="p">();</span>
+      <span class="kd">var</span> <span class="nx">matched</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">any</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">handlers</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">handler</span><span class="p">)</span> <span class="p">{</span>
+        <span class="k">if</span> <span class="p">(</span><span class="nx">handler</span><span class="p">.</span><span class="nx">route</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">fragment</span><span class="p">))</span> <span class="p">{</span>
+          <span class="nx">handler</span><span class="p">.</span><span class="nx">callback</span><span class="p">(</span><span class="nx">fragment</span><span class="p">);</span>
+          <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
+        <span class="p">}</span>
+      <span class="p">});</span>
+      <span class="k">return</span> <span class="nx">matched</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-91">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-91">¶</a>               </div>               <p>Save a fragment into the hash history. You are responsible for properly
+URL-encoding the fragment in advance. This does not trigger
+a <code>hashchange</code> event.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">saveLocation</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">fragment</span><span class="p">)</span> <span class="p">{</span>
+      <span class="nx">fragment</span> <span class="o">=</span> <span class="p">(</span><span class="nx">fragment</span> <span class="o">||</span> <span class="s1">''</span><span class="p">).</span><span class="nx">replace</span><span class="p">(</span><span class="nx">hashStrip</span><span class="p">,</span> <span class="s1">''</span><span class="p">);</span>
+      <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">fragment</span> <span class="o">==</span> <span class="nx">fragment</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>
+      <span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">hash</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">fragment</span> <span class="o">=</span> <span class="nx">fragment</span><span class="p">;</span>
+      <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">iframe</span> <span class="o">&&</span> <span class="p">(</span><span class="nx">fragment</span> <span class="o">!=</span> <span class="k">this</span><span class="p">.</span><span class="nx">getFragment</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">iframe</span><span class="p">.</span><span class="nx">locat [...]
+        <span class="k">this</span><span class="p">.</span><span class="nx">iframe</span><span class="p">.</span><span class="nb">document</span><span class="p">.</span><span class="nx">open</span><span class="p">().</span><span class="nx">close</span><span class="p">();</span>
+        <span class="k">this</span><span class="p">.</span><span class="nx">iframe</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">hash</span> <span class="o">=</span> <span class="nx">fragment</span><span class="p">;</span>
+      <span class="p">}</span>
+    <span class="p">}</span>
+
+  <span class="p">});</span></pre></div>             </td>           </tr>                               <tr id="section-92">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-92">¶</a>               </div>               <h2>Backbone.View</h2>             </td>             <td class="code">               <div class="highlight"><pre></pre></div>             </td>           </tr>                               <tr id="se [...]
+if an existing element is not provided...</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nx">Backbone</span><span class="p">.</span><span class="nx">View</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
+    <span class="k">this</span><span class="p">.</span><span class="nx">_configure</span><span class="p">(</span><span class="nx">options</span> <span class="o">||</span> <span class="p">{});</span>
+    <span class="k">this</span><span class="p">.</span><span class="nx">_ensureElement</span><span class="p">();</span>
+    <span class="k">this</span><span class="p">.</span><span class="nx">delegateEvents</span><span class="p">();</span>
+    <span class="k">this</span><span class="p">.</span><span class="nx">initialize</span><span class="p">(</span><span class="nx">options</span><span class="p">);</span>
+  <span class="p">};</span></pre></div>             </td>           </tr>                               <tr id="section-94">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-94">¶</a>               </div>               <p>Element lookup, scoped to DOM elements within the current view.
+This should be prefered to global lookups, if you're dealing with
+a specific view.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="kd">var</span> <span class="nx">selectorDelegate</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">selector</span><span class="p">)</span> <span class="p">{</span>
+    <span class="k">return</span> <span class="nx">$</span><span class="p">(</span><span class="nx">selector</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">el</span><span class="p">);</span>
+  <span class="p">};</span></pre></div>             </td>           </tr>                               <tr id="section-95">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-95">¶</a>               </div>               <p>Cached regex to split keys for <code>delegate</code>.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="kd">var</span> <span class="nx">eve [...]
+initialization logic.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">initialize</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(){},</span></pre></div>             </td>           </tr>                               <tr id="section-100">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-100">¶</a>               </div>  [...]
+to populate its element (<code>this.el</code>), with the appropriate HTML. The
+convention is for <strong>render</strong> to always return <code>this</code>.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">render</span> <span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
+      <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-101">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-101">¶</a>               </div>               <p>Remove this view from the DOM. Note that the view isn't present in the
+DOM by default, so calling this method may be a no-op.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">remove</span> <span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
+      <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">el</span><span class="p">).</span><span class="nx">remove</span><span class="p">();</span>
+      <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-102">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-102">¶</a>               </div>               <p>For small amounts of DOM Elements, where a full-blown template isn't
+needed, use <strong>make</strong> to manufacture elements, one at a time.</p>
+
+<pre><code>var el = this.make('li', {'class': 'row'}, this.model.get('title'));
+</code></pre>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">make</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">tagName</span><span class="p">,</span> <span class="nx">attributes</span><span class="p">,</span> <span class="nx">content</span><span class="p">)</span> <span class="p">{</span>
+      <span class="kd">var</span> <span class="nx">el</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="nx">tagName</span><span class="p">);</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">attributes</span><span class="p">)</span> <span class="nx">$</span><span class="p">(</span><span class="nx">el</span><span class="p">).</span><span class="nx">attr</span><span class="p">(</span><span class="nx">attributes</span><span class="p">);</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">content</span><span class="p">)</span> <span class="nx">$</span><span class="p">(</span><span class="nx">el</span><span class="p">).</span><span class="nx">html</span><span class="p">(</span><span class="nx">content</span><span class="p">);</span>
+      <span class="k">return</span> <span class="nx">el</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-103">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-103">¶</a>               </div>               <p>Set callbacks, where <code>this.callbacks</code> is a hash of</p>
+
+<p><em>{"event selector": "callback"}</em></p>
+
+<pre><code>{
+  'mousedown .title':  'edit',
+  'click .button':     'save'
+}
+</code></pre>
+
+<p>pairs. Callbacks will be bound to the view, with <code>this</code> set properly.
+Uses event delegation for efficiency.
+Omitting the selector binds the event to <code>this.el</code>.
+This only works for delegate-able events: not <code>focus</code>, <code>blur</code>, and
+not <code>change</code>, <code>submit</code>, and <code>reset</code> in Internet Explorer.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">delegateEvents</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">events</span><span class="p">)</span> <span class="p">{</span>
+      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="nx">events</span> <span class="o">||</span> <span class="p">(</span><span class="nx">events</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">events</span><span class="p">)))</span> <span class="k">return</span><span class="p">;</span>
+      <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">el</span><span class="p">).</span><span class="nx">unbind</span><span class="p">();</span>
+      <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">key</span> <span class="k">in</span> <span class="nx">events</span><span class="p">)</span> <span class="p">{</span>
+        <span class="kd">var</span> <span class="nx">methodName</span> <span class="o">=</span> <span class="nx">events</span><span class="p">[</span><span class="nx">key</span><span class="p">];</span>
+        <span class="kd">var</span> <span class="nx">match</span> <span class="o">=</span> <span class="nx">key</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">eventSplitter</span><span class="p">);</span>
+        <span class="kd">var</span> <span class="nx">eventName</span> <span class="o">=</span> <span class="nx">match</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="nx">selector</span> <span class="o">=</span> <span class="nx">match</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span>
+        <span class="kd">var</span> <span class="nx">method</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="k">this</span><span class="p">[</span><span class="nx">methodName</span><span class="p">],</span> <span class="k">this</span><span class="p">);</span>
+        <span class="k">if</span> <span class="p">(</span><span class="nx">selector</span> <span class="o">===</span> <span class="s1">''</span><span class="p">)</span> <span class="p">{</span>
+          <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">el</span><span class="p">).</span><span class="nx">bind</span><span class="p">(</span><span class="nx">eventName</span><span class="p">,</span> <span class="nx">method</span><span class="p">);</span>
+        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
+          <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">el</span><span class="p">).</span><span class="nx">delegate</span><span class="p">(</span><span class="nx">selector</span><span class="p">,</span> <span class="nx">eventName</span><span class="p">,</span> <span class="nx">method</span><span class="p">);</span>
+        <span class="p">}</span>
+      <span class="p">}</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-104">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-104">¶</a>               </div>               <p>Performs the initial configuration of a View with a set of options.
+Keys with special meaning <em>(model, collection, id, className)</em>, are
+attached directly to the view.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">_configure</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
+      <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">options</span><span class="p">)</span> <span class="nx">options</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">extend</span><span class="p">({},</span> <span class="k">this</span><span class="p">.</span><span class="nx">options</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">model</span><span class="p">)</span>      <span class="k">this</span><span class="p">.</span><span class="nx">model</span>      <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">model</span><span class="p">;</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">collection</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">collection</span> <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">collection</span><span class="p">;</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">el</span><span class="p">)</span>         <span class="k">this</span><span class="p">.</span><span class="nx">el</span>         <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">el</span><span class="p">;</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">id</span><span class="p">)</span>         <span class="k">this</span><span class="p">.</span><span class="nx">id</span>         <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">id</span><span class="p">;</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">className</span><span class="p">)</span>  <span class="k">this</span><span class="p">.</span><span class="nx">className</span>  <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">className</span><span class="p">;</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">tagName</span><span class="p">)</span>    <span class="k">this</span><span class="p">.</span><span class="nx">tagName</span>    <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">tagName</span><span class="p">;</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">options</span> <span class="o">=</span> <span class="nx">options</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-105">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-105">¶</a>               </div>               <p>Ensure that the View has a DOM element to render into.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">_ensureElement</span> <s [...]
+      <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">el</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>
+      <span class="kd">var</span> <span class="nx">attrs</span> <span class="o">=</span> <span class="p">{};</span>
+      <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">id</span><span class="p">)</span> <span class="nx">attrs</span><span class="p">.</span><span class="nx">id</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">id</span><span class="p">;</span>
+      <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">className</span><span class="p">)</span> <span class="nx">attrs</span><span class="p">[</span><span class="s2">"class"</span><span class="p">]</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">className</span><span class="p">;</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">el</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">make</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">tagName</span><span class="p">,</span> <span class="nx">attrs</span><span class="p">);</span>
+    <span class="p">}</span>
+
+  <span class="p">});</span></pre></div>             </td>           </tr>                               <tr id="section-106">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-106">¶</a>               </div>               <p>The self-propagating extend function that Backbone classes use.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="kd">var</span> <span c [...]
+    <span class="kd">var</span> <span class="nx">child</span> <span class="o">=</span> <span class="nx">inherits</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">protoProps</span><span class="p">,</span> <span class="nx">classProps</span><span class="p">);</span>
+    <span class="nx">child</span><span class="p">.</span><span class="nx">extend</span> <span class="o">=</span> <span class="nx">extend</span><span class="p">;</span>
+    <span class="k">return</span> <span class="nx">child</span><span class="p">;</span>
+  <span class="p">};</span></pre></div>             </td>           </tr>                               <tr id="section-107">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-107">¶</a>               </div>               <p>Set up inheritance for the model, collection, and view.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nx">Backbone</span><span class= [...]
+    <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Controller</span><span class="p">.</span><span class="nx">extend</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">extend</span> <span class="o">=</span> <span class="nx">extend</span><span class="p">;</span></pre></div>             </td>           </tr>                               <tr id="section-108">   [...]
+    <span class="s1">'create'</span><span class="o">:</span> <span class="s1">'POST'</span><span class="p">,</span>
+    <span class="s1">'update'</span><span class="o">:</span> <span class="s1">'PUT'</span><span class="p">,</span>
+    <span class="s1">'delete'</span><span class="o">:</span> <span class="s1">'DELETE'</span><span class="p">,</span>
+    <span class="s1">'read'</span>  <span class="o">:</span> <span class="s1">'GET'</span>
+  <span class="p">};</span></pre></div>             </td>           </tr>                               <tr id="section-109">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-109">¶</a>               </div>               <h2>Backbone.sync</h2>             </td>             <td class="code">               <div class="highlight"><pre></pre></div>             </td>           </tr>                               <tr id="s [...]
+models to the server. You will be passed the type of request, and the
+model in question. By default, uses makes a RESTful Ajax request
+to the model's <code>url()</code>. Some possible customizations could be:</p>
+
+<ul>
+<li>Use <code>setTimeout</code> to batch rapid-fire updates into a single request.</li>
+<li>Send up the models as XML instead of JSON.</li>
+<li>Persist models via WebSockets instead of Ajax.</li>
+</ul>
+
+<p>Turn on <code>Backbone.emulateHTTP</code> in order to send <code>PUT</code> and <code>DELETE</code> requests
+as <code>POST</code>, with a <code>_method</code> parameter containing the true HTTP method,
+as well as all requests with the body as <code>application/x-www-form-urlencoded</code> instead of
+<code>application/json</code> with the model in a param named <code>model</code>.
+Useful when interfacing with server-side languages like <strong>PHP</strong> that make
+it difficult to read the body of <code>PUT</code> requests.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nx">Backbone</span><span class="p">.</span><span class="nx">sync</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">method</span><span class="p">,</span> <span class="nx">model</span><span class="p">,</span> <span class="nx">success</span><span class="p">,</span> <span [...]
+    <span class="kd">var</span> <span class="nx">type</span> <span class="o">=</span> <span class="nx">methodMap</span><span class="p">[</span><span class="nx">method</span><span class="p">];</span>
+    <span class="kd">var</span> <span class="nx">modelJSON</span> <span class="o">=</span> <span class="p">(</span><span class="nx">method</span> <span class="o">===</span> <span class="s1">'create'</span> <span class="o">||</span> <span class="nx">method</span> <span class="o">===</span> <span class="s1">'update'</span><span class="p">)</span> <span class="o">?</span>
+                    <span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">model</span><span class="p">.</span><span class="nx">toJSON</span><span class="p">())</span> <span class="o">:</span> <span class="kc">null</span><span class="p">;</span></pre></div>             </td>           </tr>                               <tr id="section-111">             <td class="docs">               <div class="pilwrap">             [...]
+      <span class="nx">url</span><span class="o">:</span>          <span class="nx">getUrl</span><span class="p">(</span><span class="nx">model</span><span class="p">),</span>
+      <span class="nx">type</span><span class="o">:</span>         <span class="nx">type</span><span class="p">,</span>
+      <span class="nx">contentType</span><span class="o">:</span>  <span class="s1">'application/json'</span><span class="p">,</span>
+      <span class="nx">data</span><span class="o">:</span>         <span class="nx">modelJSON</span><span class="p">,</span>
+      <span class="nx">dataType</span><span class="o">:</span>     <span class="s1">'json'</span><span class="p">,</span>
+      <span class="nx">processData</span><span class="o">:</span>  <span class="kc">false</span><span class="p">,</span>
+      <span class="nx">success</span><span class="o">:</span>      <span class="nx">success</span><span class="p">,</span>
+      <span class="nx">error</span><span class="o">:</span>        <span class="nx">error</span>
+    <span class="p">};</span></pre></div>             </td>           </tr>                               <tr id="section-112">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-112">¶</a>               </div>               <p>For older servers, emulate JSON by encoding the request into an HTML-form.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="k">if</s [...]
+      <span class="nx">params</span><span class="p">.</span><span class="nx">contentType</span> <span class="o">=</span> <span class="s1">'application/x-www-form-urlencoded'</span><span class="p">;</span>
+      <span class="nx">params</span><span class="p">.</span><span class="nx">processData</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
+      <span class="nx">params</span><span class="p">.</span><span class="nx">data</span>        <span class="o">=</span> <span class="nx">modelJSON</span> <span class="o">?</span> <span class="p">{</span><span class="nx">model</span> <span class="o">:</span> <span class="nx">modelJSON</span><span class="p">}</span> <span class="o">:</span> <span class="p">{};</span>
+    <span class="p">}</span></pre></div>             </td>           </tr>                               <tr id="section-113">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-113">¶</a>               </div>               <p>For older servers, emulate HTTP by mimicking the HTTP method with <code>_method</code>
+And an <code>X-HTTP-Method-Override</code> header.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="k">if</span> <span class="p">(</span><span class="nx">Backbone</span><span class="p">.</span><span class="nx">emulateHTTP</span><span class="p">)</span> <span class="p">{</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">type</span> <span class="o">===</span> <span class="s1">'PUT'</span> <span class="o">||</span> <span class="nx">type</span> <span class="o">===</span> <span class="s1">'DELETE'</span><span class="p">)</span> <span class="p">{</span>
+        <span class="k">if</span> <span class="p">(</span><span class="nx">Backbone</span><span class="p">.</span><span class="nx">emulateJSON</span><span class="p">)</span> <span class="nx">params</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">_method</span> <span class="o">=</span> <span class="nx">type</span><span class="p">;</span>
+        <span class="nx">params</span><span class="p">.</span><span class="nx">type</span> <span class="o">=</span> <span class="s1">'POST'</span><span class="p">;</span>
+        <span class="nx">params</span><span class="p">.</span><span class="nx">beforeSend</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">xhr</span><span class="p">)</span> <span class="p">{</span>
+          <span class="nx">xhr</span><span class="p">.</span><span class="nx">setRequestHeader</span><span class="p">(</span><span class="s2">"X-HTTP-Method-Override"</span><span class="p">,</span> <span class="nx">type</span><span class="p">);</span>
+        <span class="p">};</span>
+      <span class="p">}</span>
+    <span class="p">}</span></pre></div>             </td>           </tr>                               <tr id="section-114">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-114">¶</a>               </div>               <p>Make the request.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><s [...]
+  <span class="p">};</span></pre></div>             </td>           </tr>                               <tr id="section-115">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-115">¶</a>               </div>               <h2>Helpers</h2>             </td>             <td class="code">               <div class="highlight"><pre></pre></div>             </td>           </tr>                               <tr id="section [...]
+Similar to <code>goog.inherits</code>, but uses a hash of prototype properties and
+class properties to be extended.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="kd">var</span> <span class="nx">inherits</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">parent</span><span class="p">,</span> <span class="nx">protoProps</span><span class="p">,</span> <span class="nx">staticProps</span><span class="p">)</span> <span class="p">{</span>
+    <span class="kd">var</span> <span class="nx">child</span><span class="p">;</span></pre></div>             </td>           </tr>                               <tr id="section-118">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-118">¶</a>               </div>               <p>The constructor function for the new subclass is either defined by you
+(the "constructor" property in your <code>extend</code> definition), or defaulted
+by us to simply call <code>super()</code>.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="k">if</span> <span class="p">(</span><span class="nx">protoProps</span> <span class="o">&&</span> <span class="nx">protoProps</span><span class="p">.</span><span class="nx">hasOwnProperty</span><span class="p">(</span><span class="s1">'constructor'</span><span class="p">))</span> <span class="p">{</span>
+      <span class="nx">child</span> <span class="o">=</span> <span class="nx">protoProps</span><span class="p">.</span><span class="nx">constructor</span><span class="p">;</span>
+    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
+      <span class="nx">child</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){</span> <span class="k">return</span> <span class="nx">parent</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span> <span class="p">};</span>
+    <span class="p">}</span></pre></div>             </td>           </tr>                               <tr id="section-119">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-119">¶</a>               </div>               <p>Set the prototype chain to inherit from <code>parent</code>, without calling
+<code>parent</code>'s constructor function.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">ctor</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="nx">parent</span><span class="p">.</span><span class="nx">prototype</span><span class="p">;</span>
+    <span class="nx">child</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ctor</span><span class="p">();</span></pre></div>             </td>           </tr>                               <tr id="section-120">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-120">¶</a>               </div>               <p>Add prototype properties ( [...]
+if supplied.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="k">if</span> <span class="p">(</span><span class="nx">protoProps</span><span class="p">)</span> <span class="nx">_</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span><span class="nx">child</span><span class="p">.</span><span class="nx">prototype</span><span class="p">,</span> <span class="nx">protoProps</span><span class="p">);</span [...]
+
+    <span class="k">return</span> <span class="nx">child</span><span class="p">;</span>
+  <span class="p">};</span></pre></div>             </td>           </tr>                               <tr id="section-124">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-124">¶</a>               </div>               <p>Helper function to get a URL from a Model or Collection as a property
+or as a function.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="kd">var</span> <span class="nx">getUrl</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">object</span><span class="p">)</span> <span class="p">{</span>
+    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="nx">object</span> <span class="o">&&</span> <span class="nx">object</span><span class="p">.</span><span class="nx">url</span><span class="p">))</span> <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s2">"A 'url' property or function must be specified"</span><span class="p">);</span>
+    <span class="k">return</span> <span class="nx">_</span><span class="p">.</span><span class="nx">isFunction</span><span class="p">(</span><span class="nx">object</span><span class="p">.</span><span class="nx">url</span><span class="p">)</span> <span class="o">?</span> <span class="nx">object</span><span class="p">.</span><span class="nx">url</span><span class="p">()</span> <span class="o">:</span> <span class="nx">object</span><span class="p">.</span><span class="nx">url</span><span c [...]
+  <span class="p">};</span></pre></div>             </td>           </tr>                               <tr id="section-125">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-125">¶</a>               </div>               <p>Wrap an optional error callback with a fallback error event.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="kd">var</span> <span class [...]
+    <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">resp</span><span class="p">)</span> <span class="p">{</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">onError</span><span class="p">)</span> <span class="p">{</span>
+        <span class="nx">onError</span><span class="p">(</span><span class="nx">model</span><span class="p">,</span> <span class="nx">resp</span><span class="p">);</span>
+      <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
+        <span class="nx">model</span><span class="p">.</span><span class="nx">trigger</span><span class="p">(</span><span class="s1">'error'</span><span class="p">,</span> <span class="nx">model</span><span class="p">,</span> <span class="nx">resp</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
+      <span class="p">}</span>
+    <span class="p">};</span>
+  <span class="p">};</span></pre></div>             </td>           </tr>                               <tr id="section-126">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-126">¶</a>               </div>               <p>Helper function to escape a string for HTML rendering.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="kd">var</span> <span class="nx"> [...]
+    <span class="k">return</span> <span class="nx">string</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/&(?!\w+;)/g</span><span class="p">,</span> <span class="s1">'&amp;'</span><span class="p">).</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/</g</span><span class="p">,</span> <span class="s1">'&lt;'</span><span class="p">).</span><span class="nx">replace</span><span c [...]
+  <span class="p">};</span>
+
+<span class="p">})();</span>
+
+</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> 
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/backbone/docs/docco.css b/debian/node_modules/bones/node_modules/backbone/docs/docco.css
new file mode 100644
index 0000000..5aa0a8d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/backbone/docs/docco.css
@@ -0,0 +1,186 @@
+/*--------------------- Layout and Typography ----------------------------*/
+body {
+  font-family: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;
+  font-size: 15px;
+  line-height: 22px;
+  color: #252519;
+  margin: 0; padding: 0;
+}
+a {
+  color: #261a3b;
+}
+  a:visited {
+    color: #261a3b;
+  }
+p {
+  margin: 0 0 15px 0;
+}
+h1, h2, h3, h4, h5, h6 {
+  margin: 0px 0 15px 0;
+}
+  h1 {
+    margin-top: 40px;
+  }
+#container {
+  position: relative;
+}
+#background {
+  position: fixed;
+  top: 0; left: 525px; right: 0; bottom: 0;
+  background: #f5f5ff;
+  border-left: 1px solid #e5e5ee;
+  z-index: -1;
+}
+#jump_to, #jump_page {
+  background: white;
+  -webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777;
+  -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px;
+  font: 10px Arial;
+  text-transform: uppercase;
+  cursor: pointer;
+  text-align: right;
+}
+#jump_to, #jump_wrapper {
+  position: fixed;
+  right: 0; top: 0;
+  padding: 5px 10px;
+}
+  #jump_wrapper {
+    padding: 0;
+    display: none;
+  }
+    #jump_to:hover #jump_wrapper {
+      display: block;
+    }
+    #jump_page {
+      padding: 5px 0 3px;
+      margin: 0 0 25px 25px;
+    }
+      #jump_page .source {
+        display: block;
+        padding: 5px 10px;
+        text-decoration: none;
+        border-top: 1px solid #eee;
+      }
+        #jump_page .source:hover {
+          background: #f5f5ff;
+        }
+        #jump_page .source:first-child {
+        }
+table td {
+  border: 0;
+  outline: 0;
+}
+  td.docs, th.docs {
+    max-width: 450px;
+    min-width: 450px;
+    min-height: 5px;
+    padding: 10px 25px 1px 50px;
+    overflow-x: hidden;
+    vertical-align: top;
+    text-align: left;
+  }
+    .docs pre {
+      margin: 15px 0 15px;
+      padding-left: 15px;
+    }
+    .docs p tt, .docs p code {
+      background: #f8f8ff;
+      border: 1px solid #dedede;
+      font-size: 12px;
+      padding: 0 0.2em;
+    }
+    .pilwrap {
+      position: relative;
+    }
+      .pilcrow {
+        font: 12px Arial;
+        text-decoration: none;
+        color: #454545;
+        position: absolute;
+        top: 3px; left: -20px;
+        padding: 1px 2px;
+        opacity: 0;
+        -webkit-transition: opacity 0.2s linear;
+      }
+        td.docs:hover .pilcrow {
+          opacity: 1;
+        }
+  td.code, th.code {
+    padding: 14px 15px 16px 25px;
+    width: 100%;
+    vertical-align: top;
+    background: #f5f5ff;
+    border-left: 1px solid #e5e5ee;
+  }
+    pre, tt, code {
+      font-size: 12px; line-height: 18px;
+      font-family: Monaco, Consolas, "Lucida Console", monospace;
+      margin: 0; padding: 0;
+    }
+
+
+/*---------------------- Syntax Highlighting -----------------------------*/
+td.linenos { background-color: #f0f0f0; padding-right: 10px; }
+span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }
+body .hll { background-color: #ffffcc }
+body .c { color: #408080; font-style: italic }  /* Comment */
+body .err { border: 1px solid #FF0000 }         /* Error */
+body .k { color: #954121 }                      /* Keyword */
+body .o { color: #666666 }                      /* Operator */
+body .cm { color: #408080; font-style: italic } /* Comment.Multiline */
+body .cp { color: #BC7A00 }                     /* Comment.Preproc */
+body .c1 { color: #408080; font-style: italic } /* Comment.Single */
+body .cs { color: #408080; font-style: italic } /* Comment.Special */
+body .gd { color: #A00000 }                     /* Generic.Deleted */
+body .ge { font-style: italic }                 /* Generic.Emph */
+body .gr { color: #FF0000 }                     /* Generic.Error */
+body .gh { color: #000080; font-weight: bold }  /* Generic.Heading */
+body .gi { color: #00A000 }                     /* Generic.Inserted */
+body .go { color: #808080 }                     /* Generic.Output */
+body .gp { color: #000080; font-weight: bold }  /* Generic.Prompt */
+body .gs { font-weight: bold }                  /* Generic.Strong */
+body .gu { color: #800080; font-weight: bold }  /* Generic.Subheading */
+body .gt { color: #0040D0 }                     /* Generic.Traceback */
+body .kc { color: #954121 }                     /* Keyword.Constant */
+body .kd { color: #954121; font-weight: bold }  /* Keyword.Declaration */
+body .kn { color: #954121; font-weight: bold }  /* Keyword.Namespace */
+body .kp { color: #954121 }                     /* Keyword.Pseudo */
+body .kr { color: #954121; font-weight: bold }  /* Keyword.Reserved */
+body .kt { color: #B00040 }                     /* Keyword.Type */
+body .m { color: #666666 }                      /* Literal.Number */
+body .s { color: #219161 }                      /* Literal.String */
+body .na { color: #7D9029 }                     /* Name.Attribute */
+body .nb { color: #954121 }                     /* Name.Builtin */
+body .nc { color: #0000FF; font-weight: bold }  /* Name.Class */
+body .no { color: #880000 }                     /* Name.Constant */
+body .nd { color: #AA22FF }                     /* Name.Decorator */
+body .ni { color: #999999; font-weight: bold }  /* Name.Entity */
+body .ne { color: #D2413A; font-weight: bold }  /* Name.Exception */
+body .nf { color: #0000FF }                     /* Name.Function */
+body .nl { color: #A0A000 }                     /* Name.Label */
+body .nn { color: #0000FF; font-weight: bold }  /* Name.Namespace */
+body .nt { color: #954121; font-weight: bold }  /* Name.Tag */
+body .nv { color: #19469D }                     /* Name.Variable */
+body .ow { color: #AA22FF; font-weight: bold }  /* Operator.Word */
+body .w { color: #bbbbbb }                      /* Text.Whitespace */
+body .mf { color: #666666 }                     /* Literal.Number.Float */
+body .mh { color: #666666 }                     /* Literal.Number.Hex */
+body .mi { color: #666666 }                     /* Literal.Number.Integer */
+body .mo { color: #666666 }                     /* Literal.Number.Oct */
+body .sb { color: #219161 }                     /* Literal.String.Backtick */
+body .sc { color: #219161 }                     /* Literal.String.Char */
+body .sd { color: #219161; font-style: italic } /* Literal.String.Doc */
+body .s2 { color: #219161 }                     /* Literal.String.Double */
+body .se { color: #BB6622; font-weight: bold }  /* Literal.String.Escape */
+body .sh { color: #219161 }                     /* Literal.String.Heredoc */
+body .si { color: #BB6688; font-weight: bold }  /* Literal.String.Interpol */
+body .sx { color: #954121 }                     /* Literal.String.Other */
+body .sr { color: #BB6688 }                     /* Literal.String.Regex */
+body .s1 { color: #219161 }                     /* Literal.String.Single */
+body .ss { color: #19469D }                     /* Literal.String.Symbol */
+body .bp { color: #954121 }                     /* Name.Builtin.Pseudo */
+body .vc { color: #19469D }                     /* Name.Variable.Class */
+body .vg { color: #19469D }                     /* Name.Variable.Global */
+body .vi { color: #19469D }                     /* Name.Variable.Instance */
+body .il { color: #666666 }                     /* Literal.Number.Integer.Long */
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/backbone/docs/images/arrows.png b/debian/node_modules/bones/node_modules/backbone/docs/images/arrows.png
new file mode 100644
index 0000000..e25ce86
Binary files /dev/null and b/debian/node_modules/bones/node_modules/backbone/docs/images/arrows.png differ
diff --git a/debian/node_modules/bones/node_modules/backbone/docs/images/backbone-mobile.png b/debian/node_modules/bones/node_modules/backbone/docs/images/backbone-mobile.png
new file mode 100644
index 0000000..fcadcc5
Binary files /dev/null and b/debian/node_modules/bones/node_modules/backbone/docs/images/backbone-mobile.png differ
diff --git a/debian/node_modules/bones/node_modules/backbone/docs/images/backbone.png b/debian/node_modules/bones/node_modules/backbone/docs/images/backbone.png
new file mode 100644
index 0000000..b69682c
Binary files /dev/null and b/debian/node_modules/bones/node_modules/backbone/docs/images/backbone.png differ
diff --git a/debian/node_modules/bones/node_modules/backbone/docs/images/background.png b/debian/node_modules/bones/node_modules/backbone/docs/images/background.png
new file mode 100644
index 0000000..90ee693
Binary files /dev/null and b/debian/node_modules/bones/node_modules/backbone/docs/images/background.png differ
diff --git a/debian/node_modules/bones/node_modules/backbone/docs/images/dc-workspace.png b/debian/node_modules/bones/node_modules/backbone/docs/images/dc-workspace.png
new file mode 100644
index 0000000..5a0e0cc
Binary files /dev/null and b/debian/node_modules/bones/node_modules/backbone/docs/images/dc-workspace.png differ
diff --git a/debian/node_modules/bones/node_modules/backbone/docs/images/todos.png b/debian/node_modules/bones/node_modules/backbone/docs/images/todos.png
new file mode 100644
index 0000000..e1003a5
Binary files /dev/null and b/debian/node_modules/bones/node_modules/backbone/docs/images/todos.png differ
diff --git a/debian/node_modules/bones/node_modules/backbone/docs/jsl.conf b/debian/node_modules/bones/node_modules/backbone/docs/jsl.conf
new file mode 100644
index 0000000..c66f3b5
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/backbone/docs/jsl.conf
@@ -0,0 +1,44 @@
+# JavaScriptLint configuration file for CoffeeScript.
+
++no_return_value              # function {0} does not always return a value
++duplicate_formal             # duplicate formal argument {0}
+-equal_as_assign              # test for equality (==) mistyped as assignment (=)?{0}
++var_hides_arg                # variable {0} hides argument
++redeclared_var               # redeclaration of {0} {1}
+-anon_no_return_value         # anonymous function does not always return a value
++missing_semicolon            # missing semicolon
++meaningless_block            # meaningless block; curly braces have no impact
+-comma_separated_stmts        # multiple statements separated by commas (use semicolons?)
++unreachable_code             # unreachable code
++missing_break                # missing break statement
++missing_break_for_last_case  # missing break statement for last case in switch
+-comparison_type_conv         # comparisons against null, 0, true, false, or an empty string allowing implicit type conversion (use === or !==)
+-inc_dec_within_stmt          # increment (++) and decrement (--) operators used as part of greater statement
+-useless_void                 # use of the void type may be unnecessary (void is always undefined)
++multiple_plus_minus          # unknown order of operations for successive plus (e.g. x+++y) or minus (e.g. x---y) signs
++use_of_label                 # use of label
+-block_without_braces         # block statement without curly braces
++leading_decimal_point        # leading decimal point may indicate a number or an object member
++trailing_decimal_point       # trailing decimal point may indicate a number or an object member
++octal_number                 # leading zeros make an octal number
++nested_comment               # nested comment
++misplaced_regex              # regular expressions should be preceded by a left parenthesis, assignment, colon, or comma
++ambiguous_newline            # unexpected end of line; it is ambiguous whether these lines are part of the same statement
++empty_statement              # empty statement or extra semicolon
+-missing_option_explicit      # the "option explicit" control comment is missing
++partial_option_explicit      # the "option explicit" control comment, if used, must be in the first script tag
++dup_option_explicit          # duplicate "option explicit" control comment
++useless_assign               # useless assignment
++ambiguous_nested_stmt        # block statements containing block statements should use curly braces to resolve ambiguity
++ambiguous_else_stmt          # the else statement could be matched with one of multiple if statements (use curly braces to indicate intent)
+-missing_default_case         # missing default case in switch statement
++duplicate_case_in_switch     # duplicate case in switch statements
++default_not_at_end           # the default case is not at the end of the switch statement
++legacy_cc_not_understood     # couldn't understand control comment using /*@keyword@*/ syntax
++jsl_cc_not_understood        # couldn't understand control comment using /*jsl:keyword*/ syntax
++useless_comparison           # useless comparison; comparing identical expressions
++with_statement               # with statement hides undeclared variables; use temporary variable instead
++trailing_comma_in_array      # extra comma is not recommended in array initializers
++assign_to_function_call      # assignment to a function call
++parseint_missing_radix       # parseInt missing radix parameter
++lambda_assign_requires_semicolon
diff --git a/debian/node_modules/bones/node_modules/backbone/docs/todos.html b/debian/node_modules/bones/node_modules/backbone/docs/todos.html
new file mode 100644
index 0000000..dc6e213
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/backbone/docs/todos.html
@@ -0,0 +1,126 @@
+<!DOCTYPE html>  <html> <head>   <title>todos.js</title>   <meta http-equiv="content-type" content="text/html; charset=UTF-8">   <link rel="stylesheet" media="all" href="docco.css" /> </head> <body>   <div id="container">     <div id="background"></div>            <div id="jump_to">         Jump To …         <div id="jump_wrapper">           <div id="jump_page">                                           <a class="source" href="backbone-localstorage.html">                 backbone- [...]
+<a href="http://jgn.me/">Jérôme Gravel-Niquet</a>. This demo uses a simple
+<a href="backbone-localstorage.html">LocalStorage adapter</a>
+to persist Backbone models within your browser.</p>             </td>             <td class="code">               <div class="highlight"><pre></pre></div>             </td>           </tr>                               <tr id="section-2">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-2">¶</a>               </div>               <p>Load the application once the DOM is ready, using <code>jQuery.ready</code>:</p>      [...]
+      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s2">"content"</span><span class="p">))</span> <span class="p">{</span>
+        <span class="k">this</span><span class="p">.</span><span class="nx">set</span><span class="p">({</span><span class="s2">"content"</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">EMPTY</span><span class="p">});</span>
+      <span class="p">}</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-7">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-7">¶</a>               </div>               <p>Toggle the <code>done</code> state of this todo item.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">toggle</span><span class="o"> [...]
+      <span class="k">this</span><span class="p">.</span><span class="nx">save</span><span class="p">({</span><span class="nx">done</span><span class="o">:</span> <span class="o">!</span><span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s2">"done"</span><span class="p">)});</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-8">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-8">¶</a>               </div>               <p>Remove this Todo from <em>localStorage</em> and delete its view.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">clear</span><span  [...]
+      <span class="k">this</span><span class="p">.</span><span class="nx">destroy</span><span class="p">();</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">view</span><span class="p">.</span><span class="nx">remove</span><span class="p">();</span>
+    <span class="p">}</span>
+
+  <span class="p">});</span></pre></div>             </td>           </tr>                               <tr id="section-9">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-9">¶</a>               </div>               <h2>Todo Collection</h2>             </td>             <td class="code">               <div class="highlight"><pre></pre></div>             </td>           </tr>                               <tr id="se [...]
+server.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nb">window</span><span class="p">.</span><span class="nx">TodoList</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Collection</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span></pre></div>             </td>           </tr>                               <tr id="section-11">           [...]
+      <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">filter</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">todo</span><span class="p">){</span> <span class="k">return</span> <span class="nx">todo</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">'done'</span><span class="p">);</span> <span class="p">});</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-14">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-14">¶</a>               </div>               <p>Filter down the list to only todo items that are still not finished.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">remaining</s [...]
+      <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">without</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">done</span><span class="p">());</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-15">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-15">¶</a>               </div>               <p>We keep the Todos in sequential order, despite being saved by unordered
+GUID in the database. This generates the next order number for new items.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">nextOrder</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
+      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="k">this</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span> <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
+      <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">last</span><span class="p">().</span><span class="nx">get</span><span class="p">(</span><span class="s1">'order'</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-16">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-16">¶</a>               </div>               <p>Todos are sorted by their original insertion order.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">comparator</span><span class= [...]
+      <span class="k">return</span> <span class="nx">todo</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">'order'</span><span class="p">);</span>
+    <span class="p">}</span>
+
+  <span class="p">});</span></pre></div>             </td>           </tr>                               <tr id="section-17">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-17">¶</a>               </div>               <p>Create our global collection of <strong>Todos</strong>.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nb">window</span><span class="p" [...]
+      <span class="s2">"click .check"</span>              <span class="o">:</span> <span class="s2">"toggleDone"</span><span class="p">,</span>
+      <span class="s2">"dblclick div.todo-content"</span> <span class="o">:</span> <span class="s2">"edit"</span><span class="p">,</span>
+      <span class="s2">"click span.todo-destroy"</span>   <span class="o">:</span> <span class="s2">"clear"</span><span class="p">,</span>
+      <span class="s2">"keypress .todo-input"</span>      <span class="o">:</span> <span class="s2">"updateOnEnter"</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-23">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-23">¶</a>               </div>               <p>The TodoView listens for changes to its model, re-rendering. Since there's
+a one-to-one correspondence between a <strong>Todo</strong> and a <strong>TodoView</strong> in this
+app, we set a direct reference on the model for convenience.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
+      <span class="nx">_</span><span class="p">.</span><span class="nx">bindAll</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="s1">'render'</span><span class="p">,</span> <span class="s1">'close'</span><span class="p">);</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="s1">'change'</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">render</span><span class="p">);</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">view</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-24">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-24">¶</a>               </div>               <p>Re-render the contents of the todo item.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">render</span><span class="o">:</span> <s [...]
+      <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">el</span><span class="p">).</span><span class="nx">html</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">template</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">toJSON</span><span class="p">()));</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">setContent</span><span class="p">();</span>
+      <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-25">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-25">¶</a>               </div>               <p>To avoid XSS (not that it would be harmful in this particular app),
+we use <code>jQuery.text</code> to set the contents of the todo item.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">setContent</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
+      <span class="kd">var</span> <span class="nx">content</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">'content'</span><span class="p">);</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">$</span><span class="p">(</span><span class="s1">'.todo-content'</span><span class="p">).</span><span class="nx">text</span><span class="p">(</span><span class="nx">content</span><span class="p">);</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">input</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">$</span><span class="p">(</span><span class="s1">'.todo-input'</span><span class="p">);</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">input</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="s1">'blur'</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">close</span><span class="p">);</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">input</span><span class="p">.</span><span class="nx">val</span><span class="p">(</span><span class="nx">content</span><span class="p">);</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-26">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-26">¶</a>               </div>               <p>Toggle the <code>"done"</code> state of the model.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">toggleDone</span><span class=" [...]
+      <span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">toggle</span><span class="p">();</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-27">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-27">¶</a>               </div>               <p>Switch this view into <code>"editing"</code> mode, displaying the input field.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">ed [...]
+      <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">el</span><span class="p">).</span><span class="nx">addClass</span><span class="p">(</span><span class="s2">"editing"</span><span class="p">);</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">input</span><span class="p">.</span><span class="nx">focus</span><span class="p">();</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-28">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-28">¶</a>               </div>               <p>Close the <code>"editing"</code> mode, saving changes to the todo.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">close</span><s [...]
+      <span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">save</span><span class="p">({</span><span class="nx">content</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">input</span><span class="p">.</span><span class="nx">val</span><span class="p">()});</span>
+      <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">el</span><span class="p">).</span><span class="nx">removeClass</span><span class="p">(</span><span class="s2">"editing"</span><span class="p">);</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-29">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-29">¶</a>               </div>               <p>If you hit <code>enter</code>, we're through editing the item.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">updateOnEnter</spa [...]
+      <span class="k">if</span> <span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">keyCode</span> <span class="o">==</span> <span class="mi">13</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">close</span><span class="p">();</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-30">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-30">¶</a>               </div>               <p>Remove this view from the DOM.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">remove</span><span class="o">:</span> <span class= [...]
+      <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">el</span><span class="p">).</span><span class="nx">remove</span><span class="p">();</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-31">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-31">¶</a>               </div>               <p>Remove the item, destroy the model.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">clear</span><span class="o">:</span> <span cl [...]
+      <span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">clear</span><span class="p">();</span>
+    <span class="p">}</span>
+
+  <span class="p">});</span></pre></div>             </td>           </tr>                               <tr id="section-32">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-32">¶</a>               </div>               <h2>The Application</h2>             </td>             <td class="code">               <div class="highlight"><pre></pre></div>             </td>           </tr>                               <tr id=" [...]
+the App already present in the HTML.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">el</span><span class="o">:</span> <span class="nx">$</span><span class="p">(</span><span class="s2">"#todoapp"</span><span class="p">),</span></pre></div>             </td>           </tr>                               <tr id="section-35">             <td class="docs">               <div class="pilwrap">                 <a class [...]
+      <span class="s2">"keypress #new-todo"</span><span class="o">:</span>  <span class="s2">"createOnEnter"</span><span class="p">,</span>
+      <span class="s2">"keyup #new-todo"</span><span class="o">:</span>     <span class="s2">"showTooltip"</span><span class="p">,</span>
+      <span class="s2">"click .todo-clear a"</span><span class="o">:</span> <span class="s2">"clearCompleted"</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-37">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-37">¶</a>               </div>               <p>At initialization we bind to the relevant events on the <code>Todos</code>
+collection, when items are added or changed. Kick things off by
+loading any preexisting todos that might be saved in <em>localStorage</em>.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
+      <span class="nx">_</span><span class="p">.</span><span class="nx">bindAll</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="s1">'addOne'</span><span class="p">,</span> <span class="s1">'addAll'</span><span class="p">,</span> <span class="s1">'render'</span><span class="p">);</span>
+
+      <span class="k">this</span><span class="p">.</span><span class="nx">input</span>    <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">$</span><span class="p">(</span><span class="s2">"#new-todo"</span><span class="p">);</span>
+
+      <span class="nx">Todos</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="s1">'add'</span><span class="p">,</span>     <span class="k">this</span><span class="p">.</span><span class="nx">addOne</span><span class="p">);</span>
+      <span class="nx">Todos</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="s1">'refresh'</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">addAll</span><span class="p">);</span>
+      <span class="nx">Todos</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="s1">'all'</span><span class="p">,</span>     <span class="k">this</span><span class="p">.</span><span class="nx">render</span><span class="p">);</span>
+
+      <span class="nx">Todos</span><span class="p">.</span><span class="nx">fetch</span><span class="p">();</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-38">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-38">¶</a>               </div>               <p>Re-rendering the App just means refreshing the statistics -- the rest
+of the app doesn't change.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">render</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
+      <span class="kd">var</span> <span class="nx">done</span> <span class="o">=</span> <span class="nx">Todos</span><span class="p">.</span><span class="nx">done</span><span class="p">().</span><span class="nx">length</span><span class="p">;</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">$</span><span class="p">(</span><span class="s1">'#todo-stats'</span><span class="p">).</span><span class="nx">html</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">statsTemplate</span><span class="p">({</span>
+        <span class="nx">total</span><span class="o">:</span>      <span class="nx">Todos</span><span class="p">.</span><span class="nx">length</span><span class="p">,</span>
+        <span class="nx">done</span><span class="o">:</span>       <span class="nx">Todos</span><span class="p">.</span><span class="nx">done</span><span class="p">().</span><span class="nx">length</span><span class="p">,</span>
+        <span class="nx">remaining</span><span class="o">:</span>  <span class="nx">Todos</span><span class="p">.</span><span class="nx">remaining</span><span class="p">().</span><span class="nx">length</span>
+      <span class="p">}));</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-39">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-39">¶</a>               </div>               <p>Add a single todo item to the list by creating a view for it, and
+appending its element to the <code><ul></code>.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">addOne</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">todo</span><span class="p">)</span> <span class="p">{</span>
+      <span class="kd">var</span> <span class="nx">view</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">TodoView</span><span class="p">({</span><span class="nx">model</span><span class="o">:</span> <span class="nx">todo</span><span class="p">});</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">$</span><span class="p">(</span><span class="s2">"#todo-list"</span><span class="p">).</span><span class="nx">append</span><span class="p">(</span><span class="nx">view</span><span class="p">.</span><span class="nx">render</span><span class="p">().</span><span class="nx">el</span><span class="p">);</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-40">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-40">¶</a>               </div>               <p>Add all items in the <strong>Todos</strong> collection at once.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">addAll</span><spa [...]
+      <span class="nx">Todos</span><span class="p">.</span><span class="nx">each</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">addOne</span><span class="p">);</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-41">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-41">¶</a>               </div>               <p>Generate the attributes for a new Todo item.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">newAttributes</span><span class="o"> [...]
+      <span class="k">return</span> <span class="p">{</span>
+        <span class="nx">content</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">input</span><span class="p">.</span><span class="nx">val</span><span class="p">(),</span>
+        <span class="nx">order</span><span class="o">:</span>   <span class="nx">Todos</span><span class="p">.</span><span class="nx">nextOrder</span><span class="p">(),</span>
+        <span class="nx">done</span><span class="o">:</span>    <span class="kc">false</span>
+      <span class="p">};</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-42">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-42">¶</a>               </div>               <p>If you hit return in the main input field, create new <strong>Todo</strong> model,
+persisting it to <em>localStorage</em>.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">createOnEnter</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">keyCode</span> <span class="o">!=</span> <span class="mi">13</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>
+      <span class="nx">Todos</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">newAttributes</span><span class="p">());</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">input</span><span class="p">.</span><span class="nx">val</span><span class="p">(</span><span class="s1">''</span><span class="p">);</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-43">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-43">¶</a>               </div>               <p>Clear all done todo items, destroying their models.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">clearCompleted</span><span cl [...]
+      <span class="nx">_</span><span class="p">.</span><span class="nx">each</span><span class="p">(</span><span class="nx">Todos</span><span class="p">.</span><span class="nx">done</span><span class="p">(),</span> <span class="kd">function</span><span class="p">(</span><span class="nx">todo</span><span class="p">){</span> <span class="nx">todo</span><span class="p">.</span><span class="nx">clear</span><span class="p">();</span> <span class="p">});</span>
+      <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
+    <span class="p">},</span></pre></div>             </td>           </tr>                               <tr id="section-44">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-44">¶</a>               </div>               <p>Lazily show the tooltip that tells you to press <code>enter</code> to save
+a new todo item, after one second.</p>             </td>             <td class="code">               <div class="highlight"><pre>    <span class="nx">showTooltip</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
+      <span class="kd">var</span> <span class="nx">tooltip</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">$</span><span class="p">(</span><span class="s2">".ui-tooltip-top"</span><span class="p">);</span>
+      <span class="kd">var</span> <span class="nx">val</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">input</span><span class="p">.</span><span class="nx">val</span><span class="p">();</span>
+      <span class="nx">tooltip</span><span class="p">.</span><span class="nx">fadeOut</span><span class="p">();</span>
+      <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">tooltipTimeout</span><span class="p">)</span> <span class="nx">clearTimeout</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">tooltipTimeout</span><span class="p">);</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">val</span> <span class="o">==</span> <span class="s1">''</span> <span class="o">||</span> <span class="nx">val</span> <span class="o">==</span> <span class="k">this</span><span class="p">.</span><span class="nx">input</span><span class="p">.</span><span class="nx">attr</span><span class="p">(</span><span class="s1">'placeholder'</span><span class="p">))</span> <span class="k">return</span><span class [...]
+      <span class="kd">var</span> <span class="nx">show</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){</span> <span class="nx">tooltip</span><span class="p">.</span><span class="nx">show</span><span class="p">().</span><span class="nx">fadeIn</span><span class="p">();</span> <span class="p">};</span>
+      <span class="k">this</span><span class="p">.</span><span class="nx">tooltipTimeout</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">delay</span><span class="p">(</span><span class="nx">show</span><span class="p">,</span> <span class="mi">1000</span><span class="p">);</span>
+    <span class="p">}</span>
+
+  <span class="p">});</span></pre></div>             </td>           </tr>                               <tr id="section-45">             <td class="docs">               <div class="pilwrap">                 <a class="pilcrow" href="#section-45">¶</a>               </div>               <p>Finally, we kick things off by creating the <strong>App</strong>.</p>             </td>             <td class="code">               <div class="highlight"><pre>  <span class="nb">window</span><span [...]
+
+<span class="p">});</span>
+
+</pre></div>             </td>           </tr>                </tbody>     </table>   </div> </body> </html> 
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/backbone/examples/backbone-localstorage.js b/debian/node_modules/bones/node_modules/backbone/examples/backbone-localstorage.js
new file mode 100644
index 0000000..add3cf7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/backbone/examples/backbone-localstorage.js
@@ -0,0 +1,84 @@
+// A simple module to replace `Backbone.sync` with *localStorage*-based
+// persistence. Models are given GUIDS, and saved into a JSON object. Simple
+// as that.
+
+// Generate four random hex digits.
+function S4() {
+   return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
+};
+
+// Generate a pseudo-GUID by concatenating random hexadecimal.
+function guid() {
+   return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
+};
+
+// Our Store is represented by a single JS object in *localStorage*. Create it
+// with a meaningful name, like the name you'd give a table.
+var Store = function(name) {
+  this.name = name;
+  var store = localStorage.getItem(this.name);
+  this.data = (store && JSON.parse(store)) || {};
+};
+
+_.extend(Store.prototype, {
+
+  // Save the current state of the **Store** to *localStorage*.
+  save: function() {
+    localStorage.setItem(this.name, JSON.stringify(this.data));
+  },
+
+  // Add a model, giving it a (hopefully)-unique GUID, if it doesn't already
+  // have an id of it's own.
+  create: function(model) {
+    if (!model.id) model.id = model.attributes.id = guid();
+    this.data[model.id] = model;
+    this.save();
+    return model;
+  },
+
+  // Update a model by replacing its copy in `this.data`.
+  update: function(model) {
+    this.data[model.id] = model;
+    this.save();
+    return model;
+  },
+
+  // Retrieve a model from `this.data` by id.
+  find: function(model) {
+    return this.data[model.id];
+  },
+
+  // Return the array of all models currently in storage.
+  findAll: function() {
+    return _.values(this.data);
+  },
+
+  // Delete a model from `this.data`, returning it.
+  destroy: function(model) {
+    delete this.data[model.id];
+    this.save();
+    return model;
+  }
+
+});
+
+// Override `Backbone.sync` to use delegate to the model or collection's
+// *localStorage* property, which should be an instance of `Store`.
+Backbone.sync = function(method, model, success, error) {
+
+  var resp;
+  var store = model.localStorage || model.collection.localStorage;
+
+  switch (method) {
+    case "read":    resp = model.id ? store.find(model) : store.findAll(); break;
+    case "create":  resp = store.create(model);                            break;
+    case "update":  resp = store.update(model);                            break;
+    case "delete":  resp = store.destroy(model);                           break;
+  }
+
+  if (resp) {
+    success(resp);
+  } else {
+    error("Record not found");
+  }
+};
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/backbone/examples/todos/destroy.png b/debian/node_modules/bones/node_modules/backbone/examples/todos/destroy.png
new file mode 100644
index 0000000..56d7637
Binary files /dev/null and b/debian/node_modules/bones/node_modules/backbone/examples/todos/destroy.png differ
diff --git a/debian/node_modules/bones/node_modules/backbone/examples/todos/index.html b/debian/node_modules/bones/node_modules/backbone/examples/todos/index.html
new file mode 100644
index 0000000..1ff569d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/backbone/examples/todos/index.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html>
+
+  <head>
+    <title>Backbone Demo: Todos</title>
+    <link href="todos.css" media="all" rel="stylesheet" type="text/css"/>
+    <script src="../../test/vendor/json2.js"></script>
+    <script src="../../test/vendor/jquery-1.4.2.js"></script>
+    <script src="../../test/vendor/underscore-1.1.3.js"></script>
+    <script src="../../backbone.js"></script>
+    <script src="../backbone-localstorage.js"></script>
+    <script src="todos.js"></script>
+  </head>
+
+  <body>
+
+    <!-- Todo App Interface -->
+
+    <div id="todoapp">
+
+      <div class="title">
+        <h1>Todos</h1>
+      </div>
+
+      <div class="content">
+
+        <div id="create-todo">
+          <input id="new-todo" placeholder="What needs to be done?" type="text" />
+          <span class="ui-tooltip-top" style="display:none;">Press Enter to save this task</span>
+        </div>
+
+        <div id="todos">
+          <ul id="todo-list"></ul>
+        </div>
+
+        <div id="todo-stats"></div>
+
+      </div>
+
+    </div>
+
+    <ul id="instructions">
+      <li>Double-click to edit a todo.</li>
+      <li><a href="../../docs/todos.html">View the annotated source.</a></li>
+    </ul>
+
+    <div id="credits">
+      Created by
+      <br />
+      <a href="http://jgn.me/">Jérôme Gravel-Niquet</a>
+    </div>
+
+    <!-- Templates -->
+
+    <script type="text/template" id="item-template">
+      <div class="todo <%= done ? 'done' : '' %>">
+        <div class="display">
+          <input class="check" type="checkbox" <%= done ? 'checked="checked"' : '' %> />
+          <div class="todo-content"></div>
+          <span class="todo-destroy"></span>
+        </div>
+        <div class="edit">
+          <input class="todo-input" type="text" value="" />
+        </div>
+      </div>
+    </script>
+
+    <script type="text/template" id="stats-template">
+      <% if (total) { %>
+        <span class="todo-count">
+          <span class="number"><%= remaining %></span>
+          <span class="word"><%= remaining == 1 ? 'item' : 'items' %></span> left.
+        </span>
+      <% } %>
+      <% if (done) { %>
+        <span class="todo-clear">
+          <a href="#">
+            Clear <span class="number-done"><%= done %></span>
+            completed <span class="word-done"><%= done == 1 ? 'item' : 'items' %></span>
+          </a>
+        </span>
+      <% } %>
+    </script>
+
+  </body>
+
+</html>
diff --git a/debian/node_modules/bones/node_modules/backbone/examples/todos/todos.css b/debian/node_modules/bones/node_modules/backbone/examples/todos/todos.css
new file mode 100644
index 0000000..8fdd0c8
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/backbone/examples/todos/todos.css
@@ -0,0 +1,311 @@
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, font, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  outline: 0;
+  font-weight: inherit;
+  font-style: inherit;
+  font-size: 100%;
+  font-family: inherit;
+  vertical-align: baseline;
+}
+body {
+  line-height: 1;
+  color: black;
+  background: white;
+}
+ol, ul {
+  list-style: none;
+}
+a img {
+  border: none;
+}
+
+html {
+  background: #eeeeee;
+}
+  body {
+    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+    font-size: 14px;
+    line-height: 1.4em;
+    background: #eeeeee;
+    color: #333333;
+  }
+
+#todoapp {
+  width: 480px;
+  margin: 0 auto 40px;
+  background: white;
+  padding: 20px;
+  -moz-box-shadow: rgba(0, 0, 0, 0.2) 0 5px 6px 0;
+  -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 5px 6px 0;
+  -o-box-shadow: rgba(0, 0, 0, 0.2) 0 5px 6px 0;
+  box-shadow: rgba(0, 0, 0, 0.2) 0 5px 6px 0;
+}
+  #todoapp h1 {
+    font-size: 36px;
+    font-weight: bold;
+    text-align: center;
+    padding: 20px 0 30px 0;
+    line-height: 1;
+  }
+
+#create-todo {
+  position: relative;
+}
+  #create-todo input {
+    width: 466px;
+    font-size: 24px;
+    font-family: inherit;
+    line-height: 1.4em;
+    border: 0;
+    outline: none;
+    padding: 6px;
+    border: 1px solid #999999;
+    -moz-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px 0 inset;
+    -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px 0 inset;
+    -o-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px 0 inset;
+    box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px 0 inset;
+  }
+    #create-todo input::-webkit-input-placeholder {
+      font-style: italic;
+    }
+  #create-todo span {
+    position: absolute;
+    z-index: 999;
+    width: 170px;
+    left: 50%;
+    margin-left: -85px;
+  }
+
+#todo-list {
+  margin-top: 10px;
+}
+  #todo-list li {
+    padding: 12px 20px 11px 0;
+    position: relative;
+    font-size: 24px;
+    line-height: 1.1em;
+    border-bottom: 1px solid #cccccc;
+  }
+    #todo-list li:after {
+      content: "\0020";
+      display: block;
+      height: 0;
+      clear: both;
+      overflow: hidden;
+      visibility: hidden;
+    }
+    #todo-list li.editing {
+      padding: 0;
+      border-bottom: 0;
+    }
+  #todo-list .editing .display,
+  #todo-list .edit {
+    display: none;
+  }
+    #todo-list .editing .edit {
+      display: block;
+    }
+    #todo-list .editing input {
+      width: 444px;
+      font-size: 24px;
+      font-family: inherit;
+      margin: 0;
+      line-height: 1.6em;
+      border: 0;
+      outline: none;
+      padding: 10px 7px 0px 27px;
+      border: 1px solid #999999;
+      -moz-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px 0 inset;
+      -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px 0 inset;
+      -o-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px 0 inset;
+      box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px 0 inset;
+    }
+  #todo-list .check {
+    position: relative;
+    top: 9px;
+    margin: 0 10px 0 7px;
+    float: left;
+  }
+  #todo-list .done .todo-content {
+    text-decoration: line-through;
+    color: #777777;
+  }
+  #todo-list .todo-destroy {
+    position: absolute;
+    right: 5px;
+    top: 14px;
+    display: none;
+    cursor: pointer;
+    width: 20px;
+    height: 20px;
+    background: url(destroy.png) no-repeat 0 0;
+  }
+    #todo-list li:hover .todo-destroy {
+      display: block;
+    }
+    #todo-list .todo-destroy:hover {
+      background-position: 0 -20px;
+    }
+
+#todo-stats {
+  *zoom: 1;
+  margin-top: 10px;
+  color: #777777;
+}
+  #todo-stats:after {
+    content: "\0020";
+    display: block;
+    height: 0;
+    clear: both;
+    overflow: hidden;
+    visibility: hidden;
+  }
+  #todo-stats .todo-count {
+    float: left;
+  }
+    #todo-stats .todo-count .number {
+      font-weight: bold;
+      color: #333333;
+    }
+  #todo-stats .todo-clear {
+    float: right;
+  }
+    #todo-stats .todo-clear a {
+      color: #777777;
+      font-size: 12px;
+    }
+      #todo-stats .todo-clear a:visited {
+        color: #777777;
+      }
+      #todo-stats .todo-clear a:hover {
+        color: #336699;
+      }
+
+#instructions {
+  width: 520px;
+  margin: 10px auto;
+  color: #777777;
+  text-shadow: rgba(255, 255, 255, 0.8) 0 1px 0;
+  text-align: center;
+}
+  #instructions a {
+    color: #336699;
+  }
+
+#credits {
+  width: 520px;
+  margin: 30px auto;
+  color: #999;
+  text-shadow: rgba(255, 255, 255, 0.8) 0 1px 0;
+  text-align: center;
+}
+  #credits a {
+    color: #888;
+  }
+
+
+/*
+ *  François 'cahnory' Germain
+ */
+.ui-tooltip, .ui-tooltip-top, .ui-tooltip-right, .ui-tooltip-bottom, .ui-tooltip-left {
+  color:#ffffff;
+  cursor:normal;
+  display:-moz-inline-stack;
+  display:inline-block;
+  font-size:12px;
+  font-family:arial;
+  padding:.5em 1em;
+  position:relative;
+  text-align:center;
+  text-shadow:0 -1px 1px #111111;
+  -webkit-border-top-left-radius:4px ;
+  -webkit-border-top-right-radius:4px ;
+  -webkit-border-bottom-right-radius:4px ;
+  -webkit-border-bottom-left-radius:4px ;
+  -khtml-border-top-left-radius:4px ;
+  -khtml-border-top-right-radius:4px ;
+  -khtml-border-bottom-right-radius:4px ;
+  -khtml-border-bottom-left-radius:4px ;
+  -moz-border-radius-topleft:4px ;
+  -moz-border-radius-topright:4px ;
+  -moz-border-radius-bottomright:4px ;
+  -moz-border-radius-bottomleft:4px ;
+  border-top-left-radius:4px ;
+  border-top-right-radius:4px ;
+  border-bottom-right-radius:4px ;
+  border-bottom-left-radius:4px ;
+  -o-box-shadow:0 1px 2px #000000, inset 0 0 0 1px #222222, inset 0 2px #666666, inset 0 -2px 2px #444444;
+  -moz-box-shadow:0 1px 2px #000000, inset 0 0 0 1px #222222, inset 0 2px #666666, inset 0 -2px 2px #444444;
+  -khtml-box-shadow:0 1px 2px #000000, inset 0 0 0 1px #222222, inset 0 2px #666666, inset 0 -2px 2px #444444;
+  -webkit-box-shadow:0 1px 2px #000000, inset 0 0 0 1px #222222, inset 0 2px #666666, inset 0 -2px 2px #444444;
+  box-shadow:0 1px 2px #000000, inset 0 0 0 1px #222222, inset 0 2px #666666, inset 0 -2px 2px #444444;
+  background-color:#3b3b3b;
+  background-image:-moz-linear-gradient(top,#555555,#222222);
+  background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#555555),color-stop(1,#222222));
+  filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#555555,EndColorStr=#222222);
+  -ms-filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#555555,EndColorStr=#222222);
+}
+.ui-tooltip:after, .ui-tooltip-top:after, .ui-tooltip-right:after, .ui-tooltip-bottom:after, .ui-tooltip-left:after {
+  content:"\25B8";
+  display:block;
+  font-size:2em;
+  height:0;
+  line-height:0;
+  position:absolute;
+}
+.ui-tooltip:after, .ui-tooltip-bottom:after {
+  color:#2a2a2a;
+  bottom:0;
+  left:1px;
+  text-align:center;
+  text-shadow:1px 0 2px #000000;
+  -o-transform:rotate(90deg);
+  -moz-transform:rotate(90deg);
+  -khtml-transform:rotate(90deg);
+  -webkit-transform:rotate(90deg);
+  width:100%;
+}
+.ui-tooltip-top:after {
+  bottom:auto;
+  color:#4f4f4f;
+  left:-2px;
+  top:0;
+  text-align:center;
+  text-shadow:none;
+  -o-transform:rotate(-90deg);
+  -moz-transform:rotate(-90deg);
+  -khtml-transform:rotate(-90deg);
+  -webkit-transform:rotate(-90deg);
+  width:100%;
+}
+.ui-tooltip-right:after {
+  color:#222222;
+  right:-0.375em;
+  top:50%;
+  margin-top:-.05em;
+  text-shadow:0 1px 2px #000000;
+  -o-transform:rotate(0);
+  -moz-transform:rotate(0);
+  -khtml-transform:rotate(0);
+  -webkit-transform:rotate(0);
+}
+.ui-tooltip-left:after {
+  color:#222222;
+  left:-0.375em;
+  top:50%;
+  margin-top:.1em;
+  text-shadow:0 -1px 2px #000000;
+  -o-transform:rotate(180deg);
+  -moz-transform:rotate(180deg);
+  -khtml-transform:rotate(180deg);
+  -webkit-transform:rotate(180deg);
+}
diff --git a/debian/node_modules/bones/node_modules/backbone/examples/todos/todos.js b/debian/node_modules/bones/node_modules/backbone/examples/todos/todos.js
new file mode 100644
index 0000000..e4a7fa4
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/backbone/examples/todos/todos.js
@@ -0,0 +1,256 @@
+// An example Backbone application contributed by
+// [Jérôme Gravel-Niquet](http://jgn.me/). This demo uses a simple
+// [LocalStorage adapter](backbone-localstorage.html)
+// to persist Backbone models within your browser.
+
+// Load the application once the DOM is ready, using `jQuery.ready`:
+$(function(){
+
+  // Todo Model
+  // ----------
+
+  // Our basic **Todo** model has `content`, `order`, and `done` attributes.
+  window.Todo = Backbone.Model.extend({
+
+    // If you don't provide a todo, one will be provided for you.
+    EMPTY: "empty todo...",
+
+    // Ensure that each todo created has `content`.
+    initialize: function() {
+      if (!this.get("content")) {
+        this.set({"content": this.EMPTY});
+      }
+    },
+
+    // Toggle the `done` state of this todo item.
+    toggle: function() {
+      this.save({done: !this.get("done")});
+    },
+
+    // Remove this Todo from *localStorage* and delete its view.
+    clear: function() {
+      this.destroy();
+      this.view.remove();
+    }
+
+  });
+
+  // Todo Collection
+  // ---------------
+
+  // The collection of todos is backed by *localStorage* instead of a remote
+  // server.
+  window.TodoList = Backbone.Collection.extend({
+
+    // Reference to this collection's model.
+    model: Todo,
+
+    // Save all of the todo items under the `"todos"` namespace.
+    localStorage: new Store("todos"),
+
+    // Filter down the list of all todo items that are finished.
+    done: function() {
+      return this.filter(function(todo){ return todo.get('done'); });
+    },
+
+    // Filter down the list to only todo items that are still not finished.
+    remaining: function() {
+      return this.without.apply(this, this.done());
+    },
+
+    // We keep the Todos in sequential order, despite being saved by unordered
+    // GUID in the database. This generates the next order number for new items.
+    nextOrder: function() {
+      if (!this.length) return 1;
+      return this.last().get('order') + 1;
+    },
+
+    // Todos are sorted by their original insertion order.
+    comparator: function(todo) {
+      return todo.get('order');
+    }
+
+  });
+
+  // Create our global collection of **Todos**.
+  window.Todos = new TodoList;
+
+  // Todo Item View
+  // --------------
+
+  // The DOM element for a todo item...
+  window.TodoView = Backbone.View.extend({
+
+    //... is a list tag.
+    tagName:  "li",
+
+    // Cache the template function for a single item.
+    template: _.template($('#item-template').html()),
+
+    // The DOM events specific to an item.
+    events: {
+      "click .check"              : "toggleDone",
+      "dblclick div.todo-content" : "edit",
+      "click span.todo-destroy"   : "clear",
+      "keypress .todo-input"      : "updateOnEnter"
+    },
+
+    // The TodoView listens for changes to its model, re-rendering. Since there's
+    // a one-to-one correspondence between a **Todo** and a **TodoView** in this
+    // app, we set a direct reference on the model for convenience.
+    initialize: function() {
+      _.bindAll(this, 'render', 'close');
+      this.model.bind('change', this.render);
+      this.model.view = this;
+    },
+
+    // Re-render the contents of the todo item.
+    render: function() {
+      $(this.el).html(this.template(this.model.toJSON()));
+      this.setContent();
+      return this;
+    },
+
+    // To avoid XSS (not that it would be harmful in this particular app),
+    // we use `jQuery.text` to set the contents of the todo item.
+    setContent: function() {
+      var content = this.model.get('content');
+      this.$('.todo-content').text(content);
+      this.input = this.$('.todo-input');
+      this.input.bind('blur', this.close);
+      this.input.val(content);
+    },
+
+    // Toggle the `"done"` state of the model.
+    toggleDone: function() {
+      this.model.toggle();
+    },
+
+    // Switch this view into `"editing"` mode, displaying the input field.
+    edit: function() {
+      $(this.el).addClass("editing");
+      this.input.focus();
+    },
+
+    // Close the `"editing"` mode, saving changes to the todo.
+    close: function() {
+      this.model.save({content: this.input.val()});
+      $(this.el).removeClass("editing");
+    },
+
+    // If you hit `enter`, we're through editing the item.
+    updateOnEnter: function(e) {
+      if (e.keyCode == 13) this.close();
+    },
+
+    // Remove this view from the DOM.
+    remove: function() {
+      $(this.el).remove();
+    },
+
+    // Remove the item, destroy the model.
+    clear: function() {
+      this.model.clear();
+    }
+
+  });
+
+  // The Application
+  // ---------------
+
+  // Our overall **AppView** is the top-level piece of UI.
+  window.AppView = Backbone.View.extend({
+
+    // Instead of generating a new element, bind to the existing skeleton of
+    // the App already present in the HTML.
+    el: $("#todoapp"),
+
+    // Our template for the line of statistics at the bottom of the app.
+    statsTemplate: _.template($('#stats-template').html()),
+
+    // Delegated events for creating new items, and clearing completed ones.
+    events: {
+      "keypress #new-todo":  "createOnEnter",
+      "keyup #new-todo":     "showTooltip",
+      "click .todo-clear a": "clearCompleted"
+    },
+
+    // At initialization we bind to the relevant events on the `Todos`
+    // collection, when items are added or changed. Kick things off by
+    // loading any preexisting todos that might be saved in *localStorage*.
+    initialize: function() {
+      _.bindAll(this, 'addOne', 'addAll', 'render');
+
+      this.input    = this.$("#new-todo");
+
+      Todos.bind('add',     this.addOne);
+      Todos.bind('refresh', this.addAll);
+      Todos.bind('all',     this.render);
+
+      Todos.fetch();
+    },
+
+    // Re-rendering the App just means refreshing the statistics -- the rest
+    // of the app doesn't change.
+    render: function() {
+      var done = Todos.done().length;
+      this.$('#todo-stats').html(this.statsTemplate({
+        total:      Todos.length,
+        done:       Todos.done().length,
+        remaining:  Todos.remaining().length
+      }));
+    },
+
+    // Add a single todo item to the list by creating a view for it, and
+    // appending its element to the `<ul>`.
+    addOne: function(todo) {
+      var view = new TodoView({model: todo});
+      this.$("#todo-list").append(view.render().el);
+    },
+
+    // Add all items in the **Todos** collection at once.
+    addAll: function() {
+      Todos.each(this.addOne);
+    },
+
+    // Generate the attributes for a new Todo item.
+    newAttributes: function() {
+      return {
+        content: this.input.val(),
+        order:   Todos.nextOrder(),
+        done:    false
+      };
+    },
+
+    // If you hit return in the main input field, create new **Todo** model,
+    // persisting it to *localStorage*.
+    createOnEnter: function(e) {
+      if (e.keyCode != 13) return;
+      Todos.create(this.newAttributes());
+      this.input.val('');
+    },
+
+    // Clear all done todo items, destroying their models.
+    clearCompleted: function() {
+      _.each(Todos.done(), function(todo){ todo.clear(); });
+      return false;
+    },
+
+    // Lazily show the tooltip that tells you to press `enter` to save
+    // a new todo item, after one second.
+    showTooltip: function(e) {
+      var tooltip = this.$(".ui-tooltip-top");
+      var val = this.input.val();
+      tooltip.fadeOut();
+      if (this.tooltipTimeout) clearTimeout(this.tooltipTimeout);
+      if (val == '' || val == this.input.attr('placeholder')) return;
+      var show = function(){ tooltip.show().fadeIn(); };
+      this.tooltipTimeout = _.delay(show, 1000);
+    }
+
+  });
+
+  // Finally, we kick things off by creating the **App**.
+  window.App = new AppView;
+
+});
diff --git a/debian/node_modules/bones/node_modules/backbone/index.html b/debian/node_modules/bones/node_modules/backbone/index.html
new file mode 100644
index 0000000..25a9462
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/backbone/index.html
@@ -0,0 +1,1945 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
+  <meta http-equiv="X-UA-Compatible" content="chrome=1">
+  <title>Backbone.js</title>
+  <style>
+    body {
+      font-size: 14px;
+      line-height: 22px;
+      font-family: Helvetica Neue, Helvetica, Arial;
+      background: #f4f4f4 url(docs/images/background.png);
+    }
+    .interface {
+      font-family: "Lucida Grande", "Lucida Sans Unicode", Helvetica, Arial, sans-serif !important;
+    }
+    div#sidebar {
+      background: #fff;
+      position: fixed;
+      top: 0; left: 0; bottom: 0;
+      width: 200px;
+      overflow-y: auto;
+      overflow-x: hidden;
+      padding: 15px 0 30px 30px;
+      border-right: 1px solid #ddd;
+      box-shadow: 0 0 20px #ccc; -webkit-box-shadow: 0 0 20px #ccc; -moz-box-shadow: 0 0 20px #ccc;
+    }
+      a.toc_title, a.toc_title:visited {
+        display: block;
+        color: black;
+        font-weight: bold;
+        margin-top: 15px;
+      }
+        div.toc_title:hover {
+          text-decoration: underline;
+        }
+        #sidebar .version {
+          font-size: 10px;
+          font-weight: normal;
+        }
+      ul.toc_section {
+        font-size: 11px;
+        line-height: 14px;
+        margin: 5px 0 0 0;
+        padding-left: 0px;
+        list-style-type: none;
+        font-family: Lucida Grande;
+      }
+        .toc_section li {
+          cursor: pointer;
+          margin: 0 0 3px 0;
+        }
+          .toc_section li a {
+            color: black;
+          }
+    div.container {
+      position: relative;
+      width: 550px;
+      margin: 40px 0 50px 260px;
+    }
+    div.run {
+      position: absolute;
+      right: 15px;
+      width: 26px; height: 18px;
+      background: url('docs/images/arrows.png') no-repeat -26px 0;
+    }
+      div.run:active {
+        background-position: -51px 0;
+      }
+    p, div.container ul {
+      margin: 20px 0;
+      width: 550px;
+    }
+      p.warning {
+        font-size: 12px;
+        line-height: 18px;
+        font-style: italic;
+      }
+      div.container ul {
+        list-style: circle;
+        font-size: 12px;
+        padding-left: 15px;
+      }
+    a, a:visited {
+      color: #444;
+      text-decoration: none;
+    }
+    a:active, a:hover {
+      color: #000;
+      text-decoration: underline;
+    }
+    a img {
+      border: 0;
+    }
+    h1, h2, h3, h4, h5, h6 {
+      padding-top: 20px;
+    }
+      h2 {
+        font-size: 20px;
+      }
+    b.header {
+      font-size: 16px;
+      line-height: 30px;
+    }
+    span.alias {
+      font-size: 14px;
+      font-style: italic;
+      margin-left: 20px;
+    }
+    table {
+      margin: 15px 0 0; padding: 0;
+    }
+      tr, td {
+        margin: 0; padding: 0;
+      }
+        td {
+          padding: 0px 15px 5px 0;
+        }
+    code, pre, tt {
+      font-family: Monaco, Consolas, "Lucida Console", monospace;
+      font-size: 12px;
+      line-height: 18px;
+      font-style: normal;
+    }
+      tt {
+        padding: 0px 3px;
+        background: #fff;
+        border: 1px solid #ddd;
+        zoom: 1;
+      }
+      code {
+        margin-left: 20px;
+      }
+      pre {
+        font-size: 12px;
+        padding: 2px 0 2px 15px;
+        border: 4px solid #bbb; border-top: 0; border-bottom: 0;
+        margin: 0px 0 30px;
+      }
+  </style>
+</head>
+<body>
+
+  <div id="sidebar" class="interface">
+
+    <a class="toc_title" href="#">
+      Backbone.js <span class="version">(0.3.3)</span>
+    </a>
+
+    <a class="toc_title" href="#Introduction">
+      Introduction
+    </a>
+
+    <a class="toc_title" href="#Events">
+      Events
+    </a>
+    <ul class="toc_section">
+      <li>– <a href="#Events-bind">bind</a></li>
+      <li>– <a href="#Events-unbind">unbind</a></li>
+      <li>– <a href="#Events-trigger">trigger</a></li>
+    </ul>
+
+    <a class="toc_title" href="#Model">
+      Model
+    </a>
+    <ul class="toc_section">
+      <li>– <a href="#Model-extend">extend</a></li>
+      <li>– <a href="#Model-constructor">constructor / initialize</a></li>
+      <li>– <a href="#Model-get">get</a></li>
+      <li>– <a href="#Model-escape">escape</a></li>
+      <li>– <a href="#Model-set">set</a></li>
+      <li>– <a href="#Model-unset">unset</a></li>
+      <li>– <a href="#Model-clear">clear</a></li>
+      <li>– <a href="#Model-id">id</a></li>
+      <li>– <a href="#Model-cid">cid</a></li>
+      <li>– <a href="#Model-attributes">attributes</a></li>
+      <li>– <a href="#Model-defaults">defaults</a></li>
+      <li>- <a href="#Model-toJSON">toJSON</a></li>
+      <li>– <a href="#Model-fetch">fetch</a></li>
+      <li>– <a href="#Model-save">save</a></li>
+      <li>– <a href="#Model-destroy">destroy</a></li>
+      <li>– <a href="#Model-validate">validate</a></li>
+      <li>– <a href="#Model-url">url</a></li>
+      <li>– <a href="#Model-parse">parse</a></li>
+      <li>– <a href="#Model-clone">clone</a></li>
+      <li>– <a href="#Model-isNew">isNew</a></li>
+      <li>– <a href="#Model-change">change</a></li>
+      <li>– <a href="#Model-hasChanged">hasChanged</a></li>
+      <li>– <a href="#Model-changedAttributes">changedAttributes</a></li>
+      <li>– <a href="#Model-previous">previous</a></li>
+      <li>– <a href="#Model-previousAttributes">previousAttributes</a></li>
+    </ul>
+
+    <a class="toc_title" href="#Collection">
+      Collection
+    </a>
+    <ul class="toc_section">
+      <li>– <a href="#Collection-extend">extend</a></li>
+      <li>– <a href="#Collection-model">model</a></li>
+      <li>– <a href="#Collection-constructor">constructor / initialize</a></li>
+      <li>– <a href="#Collection-models">models</a></li>
+      <li>– <a href="#Collection-toJSON">toJSON</a></li>
+      <li>– <a href="#Collection-Underscore-Methods"><b>Underscore Methods (25)</b></a></li>
+      <li>– <a href="#Collection-add">add</a></li>
+      <li>– <a href="#Collection-remove">remove</a></li>
+      <li>– <a href="#Collection-get">get</a></li>
+      <li>– <a href="#Collection-getByCid">getByCid</a></li>
+      <li>– <a href="#Collection-at">at</a></li>
+      <li>– <a href="#Collection-length">length</a></li>
+      <li>– <a href="#Collection-comparator">comparator</a></li>
+      <li>– <a href="#Collection-sort">sort</a></li>
+      <li>– <a href="#Collection-pluck">pluck</a></li>
+      <li>– <a href="#Collection-url">url</a></li>
+      <li>– <a href="#Collection-parse">parse</a></li>
+      <li>– <a href="#Collection-fetch">fetch</a></li>
+      <li>– <a href="#Collection-refresh">refresh</a></li>
+      <li>– <a href="#Collection-create">create</a></li>
+    </ul>
+
+    <a class="toc_title" href="#Controller">
+      Controller
+    </a>
+    <ul class="toc_section">
+      <li>– <a href="#Controller-extend">extend</a></li>
+      <li>– <a href="#Controller-routes">routes</a></li>
+      <li>– <a href="#Controller-constructor">constructor / initialize</a></li>
+      <li>– <a href="#Controller-route">route</a></li>
+      <li>– <a href="#Controller-saveLocation">saveLocation</a></li>
+    </ul>
+
+    <a class="toc_title" href="#History">
+      History
+    </a>
+    <ul class="toc_section">
+      <li>– <a href="#History-start">start</a></li>
+      <li>– <a href="#History-saveLocation">saveLocation</a></li>
+    </ul>
+
+    <a class="toc_title" href="#Sync">
+      Sync
+    </a>
+    <ul class="toc_section">
+      <li>– <a href="#Sync">Backbone.sync</a></li>
+      <li>– <a href="#Sync-emulateHTTP">Backbone.emulateHTTP</a></li>
+      <li>– <a href="#Sync-emulateJSON">Backbone.emulateJSON</a></li>
+    </ul>
+
+    <a class="toc_title" href="#View">
+      View
+    </a>
+    <ul class="toc_section">
+      <li>– <a href="#View-extend">extend</a></li>
+      <li>– <a href="#View-constructor">constructor / initialize</a></li>
+      <li>– <a href="#View-el">el</a></li>
+      <li>– <a href="#View-dollar">$ (jQuery or Zepto)</a></li>
+      <li>– <a href="#View-render">render</a></li>
+      <li>– <a href="#View-remove">remove</a></li>
+      <li>– <a href="#View-make">make</a></li>
+      <li>– <a href="#View-delegateEvents">delegateEvents</a></li>
+    </ul>
+
+    <a class="toc_title" href="#examples">
+      Examples
+    </a>
+
+    <a class="toc_title" href="#changelog">
+      Change Log
+    </a>
+
+  </div>
+
+  <div class="container">
+
+    <p>
+      <img style="width: 385px; height: 126px;" src="docs/images/backbone.png" alt="Backbone.js" />
+    </p>
+
+    <p>
+      <a href="http://github.com/documentcloud/backbone/">Backbone</a>
+      supplies structure to JavaScript-heavy applications by providing <b>models</b> with
+      key-value binding and custom events, <b>collections</b> with a rich API of enumerable functions,
+      <b>views</b> with declarative event handling, and connects it all to your
+      existing application over a RESTful JSON interface.
+    </p>
+
+    <p>
+      The project is <a href="http://github.com/documentcloud/backbone/">hosted on GitHub</a>,
+      and the <a href="docs/backbone.html">annotated source code</a> is available,
+      as well as an online <a href="test/test.html">test suite</a>, and
+      <a href="examples/todos/index.html">example application</a>.
+    </p>
+
+    <p>
+      You can report bugs and discuss features on the
+      <a href="http://github.com/documentcloud/backbone/issues">issues page</a>,
+      on Freenode in the <tt>#documentcloud</tt> channel,
+      or send tweets to <a href="http://twitter.com/documentcloud">@documentcloud</a>.
+    </p>
+
+    <p>
+      <i>
+        Backbone is an open-source component of
+        <a href="http://documentcloud.org/">DocumentCloud</a>.
+      </i>
+    </p>
+
+    <h2 id="downloads">
+      Downloads & Dependencies
+      <span style="padding-left: 7px; font-size:11px; font-weight: normal;" class="interface">(Right-click, and use "Save As")</span>
+    </h2>
+
+    <table>
+      <tr>
+        <td><a href="backbone.js">Development Version (0.3.3)</a></td>
+        <td><i>35kb, Uncompressed with Comments</i></td>
+      </tr>
+      <tr>
+        <td><a href="backbone-min.js">Production Version (0.3.3)</a></td>
+        <td><i>3.9kb, Packed and Gzipped</i></td>
+      </tr>
+    </table>
+
+    <p>
+      Backbone's only hard dependency is
+      <a href="http://documentcloud.github.com/underscore/">Underscore.js</a>.
+      For RESTful persistence, and DOM manipulation with
+      <a href="#View">Backbone.View</a>,
+      it's highly recommended to include
+      <a href="http://www.json.org/json2.js">json2.js</a>, and either
+      <a href="http://jquery.com">jQuery</a> or <a href="http://zeptojs.com/">Zepto</a>.
+    </p>
+
+    <h2 id="Introduction">Introduction</h2>
+
+    <p>
+      When working on a web application that involves a lot of JavaScript, one
+      of the first things you learn is to stop tying your data to the DOM. It's all
+      too easy to create JavaScript applications that end up as tangled piles of
+      jQuery selectors and callbacks, all trying frantically to keep data in
+      sync between the HTML UI, your JavaScript logic, and the database on your
+      server. For rich client-side applications, a more structured approach
+      is helpful.
+    </p>
+
+    <p>
+      With Backbone, you represent your data as
+      <a href="#Model">Models</a>, which can be created, validated, destroyed,
+      and saved to the server. Whenever a UI action causes an attribute of
+      a model to change, the model triggers a <i>"change"</i> event; all
+      the <a href="#View">Views</a> that display the model's data are notified of the
+      event, causing them to re-render. You don't have to write the glue
+      code that looks into the DOM to find an element with a specific <i>id</i>,
+      and update the HTML manually
+      — when the model changes, the views simply update themselves.
+    </p>
+
+    <p>
+      <i>How is this different than
+        <a href="http://www.sproutcore.com/">SproutCore</a> or
+        <a href="http://cappuccino.org/">Cappuccino</a>?
+      </i>
+    </p>
+
+    <p>
+      This question is frequently asked, and all three projects apply general
+      <a href="http://en.wikipedia.org/wiki/Model–View–Controller">Model-View-Controller</a>
+      principles to JavaScript applications. However, there isn't much basis
+      for comparison. SproutCore and Cappuccino provide rich UI widgets, vast
+      core libraries, and determine the structure of your HTML for you.
+      Both frameworks measure in the hundreds of kilobytes when packed and
+      gzipped, and megabytes of JavaScript, CSS, and images when loaded in the browser
+      — there's a lot of room underneath for libraries of a more moderate scope.
+      Backbone is a <i>4 kilobyte</i> include that provides
+      just the core concepts of models, events, collections, views, controllers, 
+      and persistence.
+    </p>
+
+    <p>
+      Many of the examples that follow are runnable. Click the <i>play</i> button
+      to execute them.
+    </p>
+
+    <h2 id="Events">Backbone.Events</h2>
+
+    <p>
+      <b>Events</b> is a module that can be mixed in to any object, giving the
+      object the ability to bind and trigger custom named events. Events do not
+      have to be declared before they are bound, and may take passed arguments.
+      For example:
+    </p>
+
+<pre class="runnable">
+var object = {};
+
+_.extend(object, Backbone.Events);
+
+object.bind("alert", function(msg) {
+  alert("Triggered " + msg);
+});
+
+object.trigger("alert", "an event");
+</pre>
+
+    <p id="Events-bind">
+      <b class="header">bind</b><code>object.bind(event, callback)</code>
+      <br />
+      Bind a <b>callback</b> function to an object. The callback will be invoked
+      whenever the <b>event</b> (specified by an arbitrary string identifier) is fired.
+      If you have a large number of different events on a page, the convention is to use colons to
+      namespace them: <tt>"poll:start"</tt>, or <tt>"change:selection"</tt>
+    </p>
+
+    <p>
+      Callbacks bound to the special
+      <tt>"all"</tt> event will be triggered when any event occurs, and are passed
+      the name of the event as the first argument. For example, to proxy all events
+      from one object to another:
+    </p>
+
+<pre>
+proxy.bind("all", function(eventName) {
+  object.trigger(eventName);
+});
+</pre>
+
+    <p id="Events-unbind">
+      <b class="header">unbind</b><code>object.unbind([event], [callback])</code>
+      <br />
+      Remove a previously-bound <b>callback</b> function from an object. If no
+      callback is specified, all callbacks for the <b>event</b> will be
+      removed. If no event is specified, <i>all</i> event callbacks on the object
+      will be removed.
+    </p>
+
+<pre>
+object.unbind("change", onChange);  // Removes just the onChange callback.
+
+object.unbind("change");            // Removes all "change" callbacks.
+
+object.unbind();                    // Removes all callbacks on object.
+</pre>
+
+    <p id="Events-trigger">
+      <b class="header">trigger</b><code>object.trigger(event, [*args])</code>
+      <br />
+      Trigger callbacks for the given <b>event</b>. Subsequent arguments to
+      <b>trigger</b> will be passed along to the event callbacks.
+    </p>
+
+    <h2 id="Model">Backbone.Model</h2>
+
+    <p>
+      <b>Models</b> are the heart of any JavaScript application, containing
+      the interactive data as well as a large part of the logic surrounding it:
+      conversions, validations, computed properties, and access control. You
+      extend <b>Backbone.Model</b> with your domain-specific methods, and
+      <b>Model</b> provides a basic set of functionality for managing changes.
+    </p>
+
+    <p>
+      The following is a contrived example, but it demonstrates defining a model
+      with a custom method, setting an attribute, and firing an event keyed
+      to changes in that specific attribute.
+      After running this code once, <tt>sidebar</tt> will be
+      available in your browser's console, so you can play around with it.
+    </p>
+
+<pre class="runnable">
+var Sidebar = Backbone.Model.extend({
+  promptColor: function() {
+    var cssColor = prompt("Please enter a CSS color:");
+    this.set({color: cssColor});
+  }
+});
+
+window.sidebar = new Sidebar;
+
+sidebar.bind('change:color', function(model, color) {
+  $('#sidebar').css({background: color});
+});
+
+sidebar.set({color: 'white'});
+
+sidebar.promptColor();
+</pre>
+
+    <p id="Model-extend">
+      <b class="header">extend</b><code>Backbone.Model.extend(properties, [classProperties])</code>
+      <br />
+      To create a <b>Model</b> class of your own, you extend <b>Backbone.Model</b>
+      and provide instance <b>properties</b>, as well as optional
+      <b>classProperties</b> to be attached directly to the constructor function.
+    </p>
+
+    <p>
+      <b>extend</b> correctly sets up the prototype chain, so subclasses created
+      with <b>extend</b> can be further extended and subclassed as far as you like.
+    </p>
+
+<pre>
+var Note = Backbone.Model.extend({
+
+  initialize: function() { ... },
+
+  author: function() { ... },
+
+  allowedToEdit: function(account) { ... },
+
+  coordinates: function() { ... }
+
+});
+</pre>
+
+    <p class="warning">
+        Brief aside on <tt>super</tt>: JavaScript does not provide
+        a simple way to call super — the function of the same name defined
+        higher on the prototype chain. If you override a core function like
+        <tt>set</tt>, or <tt>save</tt>, and you want to invoke the
+        parent object's implementation, you'll have to explicitly call it, along these lines:
+    </p>
+
+<pre>
+var Note = Backbone.Model.extend({
+  set: function(attributes, options) {
+    Backbone.Model.prototype.set.call(this, attributes, options);
+    ...
+  }
+});
+</pre>
+
+    <p id="Model-constructor">
+      <b class="header">constructor / initialize</b><code>new Model([attributes])</code>
+      <br />
+      When creating an instance of a model, you can pass in the initial values
+      of the <b>attributes</b>, which will be <a href="#Model-set">set</a> on the
+      model. If you define an <b>initialize</b> function, it will be invoked when
+      the model is created.
+    </p>
+
+<pre>
+new Book({
+  title: "One Thousand and One Nights",
+  author: "Scheherazade"
+});
+</pre>
+
+    <p id="Model-get">
+      <b class="header">get</b><code>model.get(attribute)</code>
+      <br />
+      Get the current value of an attribute from the model. For example:
+      <tt>note.get("title")</tt>
+    </p>
+    
+    <p id="Model-escape">
+      <b class="header">escape</b><code>model.escape(attribute)</code>
+      <br />
+      Similar to <a href="#Model-get">get</a>, but returns the HTML-escaped version
+      of a model's attribute. If you're interpolating data from the model into
+      HTML, using <b>escape</b> to retrieve attributes will prevent 
+      <a href="http://en.wikipedia.org/wiki/Cross-site_scripting">XSS</a> attacks.
+    </p>
+    
+<pre class="runnable">
+var hacker = new Backbone.Model({
+  name: "<script>alert('xss')</script>"
+});
+
+alert(hacker.escape('name'));
+</pre>
+
+    <p id="Model-set">
+      <b class="header">set</b><code>model.set(attributes, [options])</code>
+      <br />
+      Set a hash of attributes (one or many) on the model. If any of the attributes
+      change the models state, a <tt>"change"</tt> event will be triggered, unless
+      <tt>{silent: true}</tt> is passed as an option. Change events for specific
+      attributes are also triggered, and you can bind to those as well, for example:
+      <tt>change:title</tt>, and <tt>change:content</tt>.
+    </p>
+
+<pre>
+note.set({title: "October 12", content: "Lorem Ipsum Dolor Sit Amet..."});
+</pre>
+
+    <p>
+      If the model has a <a href="#Model-validate">validate</a> method,
+      it will be validated before the attributes are set, no changes will
+      occur if the validation fails, and <b>set</b> will return <tt>false</tt>.
+      You may also pass an <tt>error</tt>
+      callback in the options, which will be invoked instead of triggering an
+      <tt>"error"</tt> event, should validation fail.
+    </p>
+
+    <p id="Model-unset">
+      <b class="header">unset</b><code>model.unset(attribute, [options])</code>
+      <br />
+      Remove an attribute by deleting it from the internal attributes hash.
+      Fires a <tt>"change"</tt> event unless <tt>silent</tt> is passed as an option.
+    </p>
+
+    <p id="Model-clear">
+      <b class="header">clear</b><code>model.clear([options])</code>
+      <br />
+      Removes all attributes from the model. Fires a <tt>"change"</tt> event unless
+      <tt>silent</tt> is passed as an option.
+    </p>
+
+    <p id="Model-id">
+      <b class="header">id</b><code>model.id</code>
+      <br />
+      A special property of models, the <b>id</b> is an arbitrary string
+      (integer id or UUID). If you set the <b>id</b> in the
+      attributes hash, it will be copied onto the model as a direct property.
+      Models can be retrieved by id from collections, and the id is used to generate
+      model URLs by default.
+    </p>
+
+    <p id="Model-cid">
+      <b class="header">cid</b><code>model.cid</code>
+      <br />
+      A special property of models, the <b>cid</b> or client id is a unique identifier
+      automatically assigned to all models when they're first created. Client ids
+      are handy when the model has not yet been saved to the server, and does not
+      yet have its eventual true <b>id</b>, but already needs to be visible in the UI.
+      Client ids take the form: <tt>c1, c2, c3 ...</tt>
+    </p>
+
+    <p id="Model-attributes">
+      <b class="header">attributes</b><code>model.attributes</code>
+      <br />
+      The <b>attributes</b> property is the internal hash containing the model's
+      state. Please use <a href="#Model-set">set</a> to update the attributes instead of modifying
+      them directly. If you'd like to retrieve and munge a copy of the model's
+      attributes, use <a href="#Model-toJSON">toJSON</a> instead.
+    </p>
+
+    <p id="Model-defaults">
+      <b class="header">defaults</b><code>model.defaults</code>
+      <br />
+      The <b>defaults</b> hash can be used to specify the default attributes
+      for your model. When creating an instance of the model, any unspecified
+      attributes will be set to their default value.
+    </p>
+
+<pre class="runnable">
+var Meal = Backbone.Model.extend({
+  defaults: {
+    "appetizer":  "caesar salad",
+    "entree":     "ravioli",
+    "dessert":    "cheesecake"
+  }
+});
+
+alert("Dessert will be " + (new Meal).get('dessert'));
+</pre>
+
+    <p id="Model-toJSON">
+      <b class="header">toJSON</b><code>model.toJSON()</code>
+      <br />
+      Return a copy of the model's <a href="#Model-attributes">attributes</a> for JSON stringification.
+      This can be used for persistence, serialization, or for augmentation before
+      being handed off to a view. The name of this method is a bit confusing, as
+      it doesn't actually return a JSON string — but I'm afraid that it's
+      the way that the <a href="https://developer.mozilla.org/en/JSON#toJSON()_method">JavaScript API for <b>JSON.stringify</b> works</a>.
+    </p>
+
+<pre class="runnable">
+var artist = new Backbone.Model({
+  firstName: "Wassily",
+  lastName: "Kandinsky"
+});
+
+artist.set({birthday: "December 16, 1866"});
+
+alert(JSON.stringify(artist));
+</pre>
+
+    <p id="Model-fetch">
+      <b class="header">fetch</b><code>model.fetch([options])</code>
+      <br />
+      Refreshes the model's state from the server. Useful if the model has never
+      been populated with data, or if you'd like to ensure that you have the
+      latest server state. A <tt>"change"</tt> event will be triggered if the
+      server's state differs from the current attributes. Accepts
+      <tt>success</tt> and <tt>error</tt> callbacks in the options hash, which
+      are passed <tt>(model, response)</tt> as arguments.
+    </p>
+
+<pre>
+// Poll every 10 seconds to keep the channel model up-to-date.
+setInterval(function() {
+  channel.fetch();
+}, 10000);
+</pre>
+
+    <p class="warning">
+      <b>Cautionary Note:</b> When fetching or saving a model, make sure that the model is part of
+      a collection with a <a href="#Collection-url">url</a> property specified,
+      or that the model itself has a complete <a href="#Model-url">url</a> function
+      of its own, so that the request knows where to go.
+    </p>
+
+    <p id="Model-save">
+      <b class="header">save</b><code>model.save(attributes, [options])</code>
+      <br />
+      Save a model to your database (or alternative persistence layer),
+      by delegating to <a href="#Sync">Backbone.sync</a>. If the model has a <a href="#Model-validate">validate</a>
+      method, and validation fails, the model will not be saved. If the model
+      <a href="#Model-isNew">isNew</a>, the save will be a <tt>"create"</tt>
+      (HTTP <tt>POST</tt>), if the model already
+      exists on the server, the save will be an <tt>"update"</tt> (HTTP <tt>PUT</tt>). Accepts
+      <tt>success</tt> and <tt>error</tt> callbacks in the options hash, which
+      are passed <tt>(model, response)</tt> as arguments. The <tt>error</tt> callback will
+      also be invoked if the model has a <tt>validate</tt> method, and validation fails.
+    </p>
+
+    <p>
+      In the following example, notice how because the model has never been
+      saved previously, our overridden version of <tt>Backbone.sync</tt> receives a <tt>"create"</tt> request.
+    </p>
+
+<pre class="runnable">
+Backbone.sync = function(method, model) {
+  alert(method + ": " + JSON.stringify(model));
+};
+
+var book = new Backbone.Model({
+  title: "The Rough Riders",
+  author: "Theodore Roosevelt"
+});
+
+book.save();
+</pre>
+
+    <p id="Model-destroy">
+      <b class="header">destroy</b><code>model.destroy([options])</code>
+      <br />
+      Destroys the model on the server by delegating an HTTP <tt>DELETE</tt>
+      request to <a href="#Sync">Backbone.sync</a>. Accepts
+      <tt>success</tt> and <tt>error</tt> callbacks in the options hash.
+    </p>
+
+<pre>
+book.destroy({success: function(model, response) {
+  ...
+}});
+</pre>
+
+    <p id="Model-validate">
+      <b class="header">validate</b><code>model.validate(attributes)</code>
+      <br />
+      This method is left undefined, and you're encouraged to override it with
+      your custom validation logic, if you have any that can be performed
+      in JavaScript. <b>validate</b> is called before <tt>set</tt> and
+      <tt>save</tt>, and is passed the attributes that are about to be updated.
+      If the model and attributes are valid, don't return anything from <b>validate</b>;
+      if the attributes are invalid, return an error of your choosing. It
+      can be as simple as a string error message to be displayed, or a complete
+      error object that describes the error programmatically. <tt>set</tt> and
+      <tt>save</tt> will not continue if <b>validate</b> returns an error.
+      Failed validations trigger an <tt>"error"</tt> event.
+    </p>
+
+<pre class="runnable">
+var Chapter = Backbone.Model.extend({
+  validate: function(attrs) {
+    if (attrs.end < attrs.start) {
+      return "can't end before it starts";
+    }
+  }
+});
+
+var one = new Chapter({
+  title : "Chapter One: The Beginning"
+});
+
+one.bind("error", function(model, error) {
+  alert(model.get("title") + " " + error);
+});
+
+one.set({
+  start: 15,
+  end:   10
+});
+</pre>
+
+    <p>
+      <tt>"error"</tt> events are useful for providing coarse-grained error
+      messages at the model or collection level, but if you have a specific view
+      that can better handle the error, you may override and suppress the event
+      by passing an <tt>error</tt> callback directly:
+    </p>
+
+<pre>
+account.set({access: "unlimited"}, {
+  error: function(model, error) {
+    alert(error);
+  }
+});
+</pre>
+
+    <p id="Model-url">
+      <b class="header">url</b><code>model.url()</code>
+      <br />
+      Returns the relative URL where the model's resource would be located on
+      the server. If your models are located somewhere else, override this method
+      with the correct logic. Generates URLs of the form: <tt>"/[collection]/[id]"</tt>.
+    </p>
+
+    <p>
+      Delegates to <a href="#Collection-url">Collection#url</a> to generate the
+      URL, so make sure that you have it defined.
+      A model with an id of <tt>101</tt>, stored in a
+      <a href="#Collection">Backbone.Collection</a> with a <tt>url</tt> of <tt>"/notes"</tt>,
+      would have this URL: <tt>"/notes/101"</tt>
+    </p>
+
+    <p id="Model-parse">
+      <b class="header">parse</b><code>model.parse(response)</code>
+      <br />
+      <b>parse</b> is called whenever a model's data is returned by the
+      server, in <a href="#Model-fetch">fetch</a>, and <a href="#Model-save">save</a>.
+      The function is passed the raw <tt>response</tt> object, and should return
+      the attributes hash to be <a href="#Model-set">set</a> on the model. The
+      default implementation is a no-op, simply passing through the JSON response.
+      Override this if you need to work with a preexisting API, or better namespace
+      your responses.
+    </p>
+
+    <p>
+      If you're working with a Rails backend, you'll notice that Rails' default
+      <tt>to_json</tt> implementation includes a model's attributes under a
+      namespace. To disable this behavior for seamless Backbone integration, set:
+    </p>
+
+<pre>
+ActiveRecord::Base.include_root_in_json = false
+</pre>
+
+    <p id="Model-clone">
+      <b class="header">clone</b><code>model.clone()</code>
+      <br />
+      Returns a new instance of the model with identical attributes.
+    </p>
+
+    <p id="Model-isNew">
+      <b class="header">isNew</b><code>model.isNew()</code>
+      <br />
+      Has this model been saved to the server yet? If the model does not yet have
+      an <tt>id</tt>, it is considered to be new.
+    </p>
+
+    <p id="Model-change">
+      <b class="header">change</b><code>model.change()</code>
+      <br />
+      Manually trigger the <tt>"change"</tt> event.
+      If you've been passing <tt>{silent: true}</tt> to the <a href="#Model-set">set</a> function in order to
+      aggregate rapid changes to a model, you'll want to call <tt>model.change()</tt>
+      when you're all finished.
+    </p>
+
+    <p id="Model-hasChanged">
+      <b class="header">hasChanged</b><code>model.hasChanged([attribute])</code>
+      <br />
+      Has the model changed since the last <tt>"change"</tt> event? If an <b>attribute</b>
+      is passed, returns <tt>true</tt> if that specific attribute has changed.
+    </p>
+
+<pre>
+book.bind("change", function() {
+  if (book.hasChanged("title")) {
+    ...
+  }
+});
+</pre>
+
+    <p id="Model-changedAttributes">
+      <b class="header">changedAttributes</b><code>model.changedAttributes([attributes])</code>
+      <br />
+      Retrieve a hash of only the model's attributes that have changed. Optionally,
+      an external <b>attributes</b> hash can be passed in, returning
+      the attributes in that hash which differ from the model. This can be used
+      to figure out which portions of a view should be updated, or what calls
+      need to be made to sync the changes to the server.
+    </p>
+
+    <p id="Model-previous">
+      <b class="header">previous</b><code>model.previous(attribute)</code>
+      <br />
+      During a <tt>"change"</tt> event, this method can be used to get the
+      previous value of a changed attribute.
+    </p>
+
+<pre class="runnable">
+var bill = new Backbone.Model({
+  name: "Bill Smith"
+});
+
+bill.bind("change:name", function(model, name) {
+  alert("Changed name from " + bill.previous("name") + " to " + name);
+});
+
+bill.set({name : "Bill Jones"});
+</pre>
+
+    <p id="Model-previousAttributes">
+      <b class="header">previousAttributes</b><code>model.previousAttributes()</code>
+      <br />
+      Return a copy of the model's previous attributes. Useful for getting a
+      diff between versions of a model, or getting back to a valid state after
+      an error occurs.
+    </p>
+
+    <h2 id="Collection">Backbone.Collection</h2>
+
+    <p>
+      Collections are ordered sets of models. You can to bind <tt>"change"</tt> events
+      to be notified when any model in the collection has been modified,
+      listen for <tt>"add"</tt> and <tt>"remove"</tt> events, <tt>fetch</tt>
+      the collection from the server, and use a full suite of
+      <a href="#Collection-Underscore-Methods">Underscore.js methods</a>.
+    </p>
+
+    <p>
+      Collections may also listen for changes to specific attributes in their
+      models, for example: <tt>Documents.bind("change:selected", ...)</tt>
+    </p>
+
+    <p id="Collection-extend">
+      <b class="header">extend</b><code>Backbone.Collection.extend(properties, [classProperties])</code>
+      <br />
+      To create a <b>Collection</b> class of your own, extend <b>Backbone.Collection</b>,
+      providing instance <b>properties</b>, as well as optional <b>classProperties</b> to be attached
+      directly to the collection's constructor function.
+    </p>
+
+    <p id="Collection-model">
+      <b class="header">model</b><code>collection.model</code>
+      <br />
+      Override this property to specify the model class that the collection
+      contains. If defined, you can pass raw attributes objects (and arrays) to
+      <a href="#Collection-add">add</a>, <a href="#Collection-create">create</a>,
+      and <a href="#Collection-refresh">refresh</a>, and the attributes will be
+      converted into a model of the proper type.
+    </p>
+
+<pre>
+var Library = Backbone.Collection.extend({
+  model: Book
+});
+</pre>
+
+    <p id="Collection-constructor">
+      <b class="header">constructor / initialize</b><code>new Collection([models], [options])</code>
+      <br />
+      When creating a Collection, you may choose to pass in the initial array of <b>models</b>.
+      The collection's <a href="#Collection-comparator">comparator</a> function
+      may be included as an option. If you define an <b>initialize</b> function, it will be
+      invoked when the collection is created.
+    </p>
+
+<pre>
+var tabs = new TabSet([tab1, tab2, tab3]);
+</pre>
+
+    <p id="Collection-models">
+      <b class="header">models</b><code>collection.models</code>
+      <br />
+      Raw access to the JavaScript array of models inside of the collection. Usually you'll
+      want to use <tt>get</tt>, <tt>at</tt>, or the <b>Underscore methods</b>
+      to access model objects, but occasionally a direct reference to the array
+      is desired.
+    </p>
+
+    <p id="Collection-toJSON">
+      <b class="header">toJSON</b><code>collection.toJSON()</code>
+      <br />
+      Return an array containing the attributes hash of each model in the
+      collection. This can be used to serialize and persist the
+      collection as a whole. The name of this method is a bit confusing, because
+      it conforms to
+      <a href="https://developer.mozilla.org/en/JSON#toJSON()_method">JavaScript's JSON API</a>.
+    </p>
+
+<pre class="runnable">
+var collection = new Backbone.Collection([
+  {name: "Tim", age: 5},
+  {name: "Ida", age: 26},
+  {name: "Rob", age: 55}
+]);
+
+alert(JSON.stringify(collection));
+</pre>
+
+    <p id="Collection-Underscore-Methods">
+      <b class="header">Underscore Methods (25)</b>
+      <br />
+      Backbone proxies to <b>Underscore.js</b> to provide 25 iteration functions
+      on <b>Backbone.Collection</b>. They aren't all documented here, but
+      you can take a look at the Underscore documentation for the full details…
+    </p>
+
+    <ul>
+      <li><a href="http://documentcloud.github.com/underscore/#each">forEach (each)</a></li>
+      <li><a href="http://documentcloud.github.com/underscore/#map">map</a></li>
+      <li><a href="http://documentcloud.github.com/underscore/#reduce">reduce (foldl, inject)</a></li>
+      <li><a href="http://documentcloud.github.com/underscore/#reduceRight">reduceRight (foldr)</a></li>
+      <li><a href="http://documentcloud.github.com/underscore/#detect">find (detect)</a></li>
+      <li><a href="http://documentcloud.github.com/underscore/#select">filter (select)</a></li>
+      <li><a href="http://documentcloud.github.com/underscore/#reject">reject</a></li>
+      <li><a href="http://documentcloud.github.com/underscore/#all">every (all)</a></li>
+      <li><a href="http://documentcloud.github.com/underscore/#any">some (any)</a></li>
+      <li><a href="http://documentcloud.github.com/underscore/#include">include</a></li>
+      <li><a href="http://documentcloud.github.com/underscore/#invoke">invoke</a></li>
+      <li><a href="http://documentcloud.github.com/underscore/#max">max</a></li>
+      <li><a href="http://documentcloud.github.com/underscore/#min">min</a></li>
+      <li><a href="http://documentcloud.github.com/underscore/#sortBy">sortBy</a></li>
+      <li><a href="http://documentcloud.github.com/underscore/#sortedIndex">sortedIndex</a></li>
+      <li><a href="http://documentcloud.github.com/underscore/#toArray">toArray</a></li>
+      <li><a href="http://documentcloud.github.com/underscore/#size">size</a></li>
+      <li><a href="http://documentcloud.github.com/underscore/#first">first</a></li>
+      <li><a href="http://documentcloud.github.com/underscore/#rest">rest</a></li>
+      <li><a href="http://documentcloud.github.com/underscore/#last">last</a></li>
+      <li><a href="http://documentcloud.github.com/underscore/#without">without</a></li>
+      <li><a href="http://documentcloud.github.com/underscore/#indexOf">indexOf</a></li>
+      <li><a href="http://documentcloud.github.com/underscore/#lastIndexOf">lastIndexOf</a></li>
+      <li><a href="http://documentcloud.github.com/underscore/#isEmpty">isEmpty</a></li>
+      <li><a href="http://documentcloud.github.com/underscore/#chain">chain</a></li>
+    </ul>
+
+<pre>
+Books.each(function(book) {
+  book.publish();
+});
+
+var titles = Books.map(function(book) {
+  return book.get("title");
+});
+
+var publishedBooks = Books.filter(function(book) {
+  return book.get("published") === true;
+});
+
+var alphabetical = Books.sortBy(function(book) {
+  return book.author.get("name").toLowerCase();
+});
+</pre>
+
+    <p id="Collection-add">
+      <b class="header">add</b><code>collection.add(models, [options])</code>
+      <br />
+      Add a model (or an array of models) to the collection. Fires an <tt>"add"</tt>
+      event, which you can pass <tt>{silent: true}</tt> to suppress. If a
+      <a href="#Collection-model">model</a> property is defined, you may also pass
+      raw attributes objects.
+    </p>
+
+<pre class="runnable">
+var ships = new Backbone.Collection;
+
+ships.bind("add", function(ship) {
+  alert("Ahoy " + ship.get("name") + "!");
+});
+
+ships.add([
+  {name: "Flying Dutchman"},
+  {name: "Black Pearl"}
+]);
+</pre>
+
+    <p id="Collection-remove">
+      <b class="header">remove</b><code>collection.remove(models, [options])</code>
+      <br />
+      Remove a model (or an array of models) from the collection. Fires a
+      <tt>"remove"</tt> event, which you can use <tt>silent</tt>
+      to suppress.
+    </p>
+
+    <p id="Collection-get">
+      <b class="header">get</b><code>collection.get(id)</code>
+      <br />
+      Get a model from a collection, specified by <b>id</b>.
+    </p>
+
+<pre>
+var book = Library.get(110);
+</pre>
+
+    <p id="Collection-getByCid">
+      <b class="header">getByCid</b><code>collection.getByCid(cid)</code>
+      <br />
+      Get a model from a collection, specified by client id. The client id
+      is the <tt>.cid</tt> property of the model, automatically assigned whenever
+      a model is created. Useful for models which have not yet been saved to
+      the server, and do not yet have true ids.
+    </p>
+
+    <p id="Collection-at">
+      <b class="header">at</b><code>collection.at(index)</code>
+      <br />
+      Get a model from a collection, specified by index. Useful if your collection
+      is sorted, and if your collection isn't sorted, <b>at</b> will still
+      retrieve models in insertion order.
+    </p>
+
+    <p id="Collection-length">
+      <b class="header">length</b><code>collection.length</code>
+      <br />
+      Like an array, a Collection maintains a <tt>length</tt> property, counting
+      the number of models it contains.
+    </p>
+
+    <p id="Collection-comparator">
+      <b class="header">comparator</b><code>collection.comparator</code>
+      <br />
+      By default there is no <b>comparator</b> function on a collection.
+      If you define a comparator, it will be used to maintain
+      the collection in sorted order. This means that as models are added,
+      they are inserted at the correct index in <tt>collection.models</tt>.
+      Comparator functions take a model and return a numeric or string value
+      by which the model should be ordered relative to others.
+    </p>
+
+    <p>
+      Note how even though all of the chapters in this example are added backwards,
+      they come out in the proper order:
+    </p>
+
+<pre class="runnable">
+var Chapter  = Backbone.Model;
+var chapters = new Backbone.Collection;
+
+chapters.comparator = function(chapter) {
+  return chapter.get("page");
+};
+
+chapters.add(new Chapter({page: 9, title: "The End"}));
+chapters.add(new Chapter({page: 5, title: "The Middle"}));
+chapters.add(new Chapter({page: 1, title: "The Beginning"}));
+
+alert(chapters.pluck('title'));
+</pre>
+
+    <p class="warning">
+      Brief aside: This comparator function is different than JavaScript's regular
+      "sort", which must return <tt>0</tt>, <tt>1</tt>, or <tt>-1</tt>,
+      and is more similar to a <tt>sortBy</tt> — a much nicer API.
+    </p>
+
+    <p id="Collection-sort">
+      <b class="header">sort</b><code>collection.sort([options])</code>
+      <br />
+      Force a collection to re-sort itself. You don't need to call this under
+      normal circumstances, as a collection with a <a href="#Collection-comparator">comparator</a> function
+      will maintain itself in proper sort order at all times. Calling <b>sort</b>
+      triggers the collection's <tt>"refresh"</tt> event, unless silenced by passing
+      <tt>{silent: true}</tt>
+    </p>
+
+    <p id="Collection-pluck">
+      <b class="header">pluck</b><code>collection.pluck(attribute)</code>
+      <br />
+      Pluck an attribute from each model in the collection. Equivalent to calling
+      <tt>map</tt>, and returning a single attribute from the iterator.
+    </p>
+
+<pre class="runnable">
+var stooges = new Backbone.Collection([
+  new Backbone.Model({name: "Curly"}),
+  new Backbone.Model({name: "Larry"}),
+  new Backbone.Model({name: "Moe"})
+]);
+
+var names = stooges.pluck("name");
+
+alert(JSON.stringify(names));
+</pre>
+
+    <p id="Collection-url">
+      <b class="header">url</b><code>collection.url or collection.url()</code>
+      <br />
+      Set the <b>url</b> property (or function) on a collection to reference
+      its location on the server. Models within the collection will use <b>url</b>
+      to construct URLs of their own.
+    </p>
+
+<pre>
+var Notes = Backbone.Collection.extend({
+  url: '/notes'
+});
+
+// Or, something more sophisticated:
+
+var Notes = Backbone.Collection.extend({
+  url: function() {
+    return this.document.url() + '/notes';
+  }
+});
+</pre>
+
+    <p id="Collection-parse">
+      <b class="header">parse</b><code>collection.parse(response)</code>
+      <br />
+      <b>parse</b> is called by Backbone whenever a collection's models are
+      returned by the server, in <a href="#Collection-fetch">fetch</a>.
+      The function is passed the raw <tt>response</tt> object, and should return
+      the array of model attributes to be <a href="#Collection-add">added</a>
+      to the collection. The default implementation is a no-op, simply passing
+      through the JSON response. Override this if you need to work with a
+      preexisting API, or better namespace your responses.
+    </p>
+
+<pre>
+var Tweets = Backbone.Collection.extend({
+  // The Twitter Search API returns tweets under "results".
+  parse: function(response) {
+    return response.results;
+  }
+});
+</pre>
+
+    <p id="Collection-fetch">
+      <b class="header">fetch</b><code>collection.fetch([options])</code>
+      <br />
+      Fetch the default set of models for this collection from the server,
+      refreshing the collection when they arrive. The <b>options</b> hash takes
+      <tt>success</tt> and <tt>error</tt>
+      callbacks which will be passed <tt>(collection, response)</tt> as arguments.
+      When the model data returns from the server, the collection will
+      <a href="#Collection-refresh">refresh</a>.
+      Delegates to <a href="#Sync">Backbone.sync</a>
+      under the covers, for custom persistence strategies.
+      The server handler for <b>fetch</b> requests should return a JSON array of
+      models.
+    </p>
+
+<pre class="runnable">
+Backbone.sync = function(method, model) {
+  alert(method + ": " + model.url);
+};
+
+var Accounts = new Backbone.Collection;
+Accounts.url = '/accounts';
+
+Accounts.fetch();
+</pre>
+
+    <p>
+      Note that <b>fetch</b> should not be used to populate collections on
+      page load — all models needed at load time should already be
+      bootstrapped in to place. <b>fetch</b> is intended for lazily-loading models
+      for interfaces that are not needed immediately: for example, documents
+      with collections of notes that may be toggled open and closed.
+    </p>
+
+    <p id="Collection-refresh">
+      <b class="header">refresh</b><code>collection.refresh(models, [options])</code>
+      <br />
+      Adding and removing models one at a time is all well and good, but sometimes
+      you have so many models to change that you'd rather just update the collection
+      in bulk. Use <b>refresh</b> to replace a collection with a new list
+      of models (or attribute hashes), triggering a single <tt>"refresh"</tt> event
+      at the end. Pass <tt>{silent: true}</tt> to suppress the <tt>"refresh"</tt> event.
+    </p>
+
+    <p>
+      Here's an example using <b>refresh</b> to bootstrap a collection during initial page load,
+      in a Rails application.
+    </p>
+
+<pre>
+<script>
+  Accounts.refresh(<%= @accounts.to_json %>);
+</script>
+</pre>
+
+    <p id="Collection-create">
+      <b class="header">create</b><code>collection.create(attributes, [options])</code>
+      <br />
+      Convenience to create a new instance of a model within a collection.
+      Equivalent to instantiating a model with a hash of attributes,
+      saving the model to the server, and adding the model to the set after being
+      successfully created. Returns
+      the model, or <tt>false</tt> if a validation error prevented the
+      model from being created. In order for this to work, your should set the
+      <a href="#Collection-model">model</a> property of the collection.
+    </p>
+
+<pre>
+var Library = Backbone.Collection.extend({
+  model: Book
+});
+
+var NYPL = new Library;
+
+var othello = NYPL.create({
+  title: "Othello",
+  author: "William Shakespeare"
+});
+</pre>
+
+    <h2 id="Controller">Backbone.Controller</h2>
+
+    <p>
+      Web applications often choose to change their URL fragment (<tt>#fragment</tt>)
+      in order to provide shareable, bookmarkable URLs for an Ajax-heavy application.
+      <b>Backbone.Controller</b> provides methods for routing client-side URL
+      fragments, and connecting them to actions and events.
+    </p>
+
+    <p class="warning">
+      Backbone controllers do not yet make use of HTML5 <b>pushState</b> and
+      <b>replaceState</b>. Currently, <b>pushState</b> and <b>replaceState</b>
+      need special handling on the server-side, cause you to mint duplicate URLs,
+      and have an incomplete API. We may start supporting them in the future
+      when these issues have been resolved.
+    </p>
+
+    <p>
+      During page load, after your application has finished creating all of its controllers,
+      be sure to call <tt>Backbone.history.start()</tt> to route the initial URL.
+    </p>
+
+    <p id="Controller-extend">
+      <b class="header">extend</b><code>Backbone.Controller.extend(properties, [classProperties])</code>
+      <br />
+      Get started by creating a custom controller class. You'll
+      want to define actions that are triggered when certain URL fragments are
+      matched, and provide a <a href="#Controller-routes">routes</a> hash
+      that pairs routes to actions.
+    </p>
+
+<pre>
+var Workspace = Backbone.Controller.extend({
+
+  routes: {
+    "help":                 "help",    // #help
+    "search/:query":        "search",  // #search/kiwis
+    "search/:query/p:page": "search"   // #search/kiwis/p7
+  },
+
+  help: function() {
+    ...
+  },
+
+  search: function(query, page) {
+    ...
+  }
+
+});
+</pre>
+
+    <p id="Controller-routes">
+      <b class="header">routes</b><code>controller.routes</code>
+      <br />
+      The routes hash maps URLs with parameters to functions on your controller,
+      similar to the <a href="#View">View</a>'s <a href="#View-delegateEvents">events hash</a>.
+      Routes can contain parameter parts, <tt>:param</tt>, which match a single URL
+      component between slashes; and splat parts <tt>*splat</tt>, which can match
+      any number of URL components.
+    </p>
+
+    <p>
+      For example, a route of <tt>"search/:query/p:page"</tt> will match
+      a fragment of <tt>#search/obama/p2</tt>, passing <tt>"obama"</tt>
+      and <tt>"2"</tt> to the action. A route of <tt>"file/*path"</tt> will
+      match <tt>#file/nested/folder/file.txt</tt>,
+      passing <tt>"nested/folder/file.txt"</tt> to the action.
+    </p>
+
+    <p>
+      When the visitor presses the back button, or enters a URL, and a particular
+      route is matched, the name of the action will be fired as an
+      <a href="#Events">event</a>, so that other objects can listen to the controller,
+      and be notified. In the following example, visiting <tt>#help/uploading</tt>
+      will fire a <tt>route:help</tt> event from the controller.
+    </p>
+
+<pre>
+routes: {
+  "help/:page":         "help",
+  "download/*path":     "download",
+  "folder/:name":       "openFolder",
+  "folder/:name-:mode": "openFolder"
+}
+</pre>
+
+<pre>
+controller.bind("route:help", function(page) {
+  ...
+});
+</pre>
+
+    <p id="Controller-constructor">
+      <b class="header">constructor / initialize</b><code>new Controller([options])</code>
+      <br />
+      When creating a new controller, you may pass its
+      <a href="#Controller-routes">routes</a> hash directly as an option, if you
+      choose. All <tt>options</tt> will also be passed to your <tt>initialize</tt>
+      function, if defined.
+    </p>
+
+    <p id="Controller-route">
+      <b class="header">route</b><code>controller.route(route, name, callback)</code>
+      <br />
+      Manually create a route for the controller, The <tt>route</tt> argument may
+      be a <a href="#Controller-routes">routing string</a> or regular expression.
+      Each matching capture from the route or regular expression will be passed as
+      an argument to the callback. The <tt>name</tt> argument will be triggered as
+      a <tt>"route:name"</tt> event whenever the route is matched.
+    </p>
+
+<pre>
+initialize: function(options) {
+
+  // Matches #page/10, passing "10"
+  this.route("page/:number", "page", function(number){ ... });
+
+  // Matches /117-a/b/c/open, passing "117-a/b/c"
+  this.route(/^(.*?)\/open$/, "open", function(id){ ... });
+
+}
+</pre>
+
+    <p id="Controller-saveLocation">
+      <b class="header">saveLocation</b><code>controller.saveLocation(fragment)</code>
+      <br />
+      Whenever you reach a point in your application that you'd like to save
+      as a URL, call <b>saveLocation</b> in order to update the URL fragment
+      without triggering a <tt>hashchange</tt> event. (If you would prefer to
+      trigger the event and routing, you can just set the hash directly.)
+    </p>
+
+<pre>
+openPage: function(pageNumber) {
+  this.document.pages.at(pageNumber).open();
+  this.saveLocation("page/" + pageNumber);
+}
+</pre>
+
+    <h2 id="History">Backbone.history</h2>
+
+    <p>
+      <b>History</b> serves as a global router (per frame) to handle <tt>hashchange</tt>
+      events, match the appropriate route, and trigger callbacks. You shouldn't
+      ever have to create one of these yourself — you should use the reference
+      to <tt>Backbone.history</tt> that will be created for you automatically if you make use
+      of <a href="#Controller">Controllers</a> with <a href="#Controller-routes">routes</a>.
+    </p>
+
+    <p id="History-start">
+      <b class="header">start</b><code>Backbone.history.start()</code>
+      <br />
+      When all of your <a href="#Controller">Controllers</a> have been created,
+      and all of the routes are set up properly, call <tt>Backbone.history.start()</tt>
+      to begin monitoring <tt>hashchange</tt> events, and dispatching routes.
+    </p>
+
+<pre>
+$(function(){
+  new WorkspaceController();
+  new HelpPaneController();
+  Backbone.history.start();
+});
+</pre>
+
+    <h2 id="Sync">Backbone.sync</h2>
+
+    <p>
+      <b>Backbone.sync</b> is the function the Backbone calls every time it
+      attempts to read or save a model to the server. By default, it uses
+      <tt>(jQuery/Zepto).ajax</tt> to make a RESTful JSON request. You can override
+      it in order to use a different persistence strategy, such as WebSockets,
+      XML transport, or Local Storage.
+    </p>
+
+    <p>
+      The method signature of <b>Backbone.sync</b> is <tt>sync(method, model, success, error)</tt>
+    </p>
+
+    <ul>
+      <li><b>method</b> – the CRUD method (<tt>"create"</tt>, <tt>"read"</tt>, <tt>"update"</tt>, or <tt>"delete"</tt>)</li>
+      <li><b>model</b> – the model to be saved (or collection to be read)</li>
+      <li><b>success({model: ...})</b> – a callback that should be fired if the request works</li>
+      <li><b>error({model: ...})</b> – a callback that should be fired if the request fails</li>
+    </ul>
+
+    <p>
+      With the default implementation, when <b>Backbone.sync</b> sends up a request to save
+      a model, its attributes will be passed, serialized as JSON, and sent in the HTTP body
+      with content-type <tt>application/json</tt>. When returning a JSON response,
+      send down the attributes of the  model that have been changed by the server, and need
+      to be updated on the client. When responding to a <tt>"read"</tt> request from a collection
+      (<a href="#Collection#fetch">Collection#fetch</a>), send down an array
+      of model attribute objects.
+    </p>
+
+    <p>
+      The default <b>sync</b> handler maps CRUD to REST like so:
+    </p>
+
+    <ul>
+      <li><b>create → POST   </b><tt>/collection</tt></li>
+      <li><b>read → GET   </b><tt>/collection[/id]</tt></li>
+      <li><b>update → PUT   </b><tt>/collection/id</tt></li>
+      <li><b>delete → DELETE   </b><tt>/collection/id</tt></li>
+    </ul>
+
+    <p>
+      As an example, a Rails handler responding to an <tt>"update"</tt> call from
+      <tt>Backbone</tt> might look like this: <i>(In real code, never use
+      </i><tt>update_attributes</tt><i> blindly, and always whitelist the attributes
+      you allow to be changed.)</i>
+    </p>
+
+<pre>
+def update
+  account = Account.find params[:id]
+  account.update_attributes params
+  render :json => account
+end
+</pre>
+
+    <p>
+      One more tip for Rails integration is to disable the default namespacing for
+      <tt>to_json</tt> calls on models by setting <tt>ActiveRecord::Base.include_root_in_json = false</tt>
+    </p>
+
+    <p id="Sync-emulateHTTP">
+      <b class="header">emulateHTTP</b><code>Backbone.emulateHTTP = true</code>
+      <br />
+      If you want to work with a legacy web server that doesn't support Backbones's
+      default REST/HTTP approach, you may choose to turn on <tt>Backbone.emulateHTTP</tt>.
+      Setting this option will fake <tt>PUT</tt> and <tt>DELETE</tt> requests with
+      a HTTP <tt>POST</tt>, and pass them under the <tt>_method</tt> parameter. Setting this option
+      will also set an <tt>X-HTTP-Method-Override</tt> header with the true method.
+    </p>
+
+<pre>
+Backbone.emulateHTTP = true;
+
+model.save();  // POST to "/collection/id", with "_method=PUT" + header.
+</pre>
+
+    <p id="Sync-emulateJSON">
+      <b class="header">emulateJSON</b><code>Backbone.emulateJSON = true</code>
+      <br />
+      If you're working with a legacy web server that can't handle requests
+      encoded as <tt>application/json</tt>, setting <tt>Backbone.emulateJSON = true;</tt>
+      will cause the JSON to be serialized under a <tt>model</tt> parameter, and
+      the request to be made with a <tt>application/x-www-form-urlencoded</tt>
+      mime type, as if from an HTML form.
+    </p>
+
+    <h2 id="View">Backbone.View</h2>
+
+    <p>
+      Backbone views are almost more convention than they are code — they
+      don't determine anything about your HTML or CSS for you, and can be used
+      with any JavaScript templating library.
+      The general idea is to organize your interface into logical views,
+      backed by models, each of which can be updated independently when the
+      model changes, without having to redraw the page. Instead of digging into
+      a JSON object, looking up an element in the DOM, and updating the HTML by hand,
+      you can bind your view's <tt>render</tt> function to the model's <tt>"change"</tt>
+      event — and now everywhere that
+      model data is displayed in the UI, it is always immediately up to date.
+    </p>
+
+    <p id="View-extend">
+      <b class="header">extend</b><code>Backbone.View.extend(properties, [classProperties])</code>
+      <br />
+      Get started with views by creating a custom view class. You'll want to
+      override the <a href="#View-render">render</a> function, specify your
+      declarative <a href="#View-delegateEvents">events</a>, and perhaps the
+      <tt>tagName</tt>, <tt>className</tt>, or <tt>id</tt> of the View's root
+      element.
+    </p>
+
+<pre>
+var DocumentRow = Backbone.View.extend({
+
+  tagName: "li",
+
+  className: "document-row",
+
+  events: {
+    "click .icon":          "open",
+    "click .button.edit":   "openEditDialog",
+    "click .button.delete": "destroy"
+  },
+
+  initialize: function() {
+    _.bindAll(this, "render");
+  },
+
+  render: function() {
+    ...
+  }
+
+});
+</pre>
+
+    <p id="View-constructor">
+      <b class="header">constructor / initialize</b><code>new View([options])</code>
+      <br />
+      When creating a new View, the options you pass are attached to the view
+      as <tt>this.options</tt>, for future reference. There are several special
+      options that, if passed, will be attached directly to the view:
+      <tt>model</tt>, <tt>collection</tt>,
+      <tt>el</tt>, <tt>id</tt>, <tt>className</tt>, and <tt>tagName</tt>.
+      If the view defines an <b>initialize</b> function, it will be called when
+      the view is first created. If you'd like to create a view that references
+      an element <i>already</i> in the DOM, pass in the element as an option:
+      <tt>new View({el: existingElement})</tt>
+    </p>
+
+<pre>
+var doc = Documents.first();
+
+new DocumentRow({
+  model: doc,
+  id: "document-row-" + doc.id
+});
+</pre>
+
+    <p id="View-el">
+      <b class="header">el</b><code>view.el</code>
+      <br />
+      All views have a DOM element at all times (the <b>el</b> property),
+      whether they've already been inserted into the page or not. In this
+      fashion, views can be rendered at any time, and inserted into the DOM all
+      at once, in order to get high-performance UI rendering with as few
+      reflows and repaints as possible.
+    </p>
+
+    <p>
+      <tt>this.el</tt> is created from the view's <tt>tagName</tt>, <tt>className</tt>,
+      and <tt>id</tt> properties, if specified. If not, <b>el</b> is an empty <tt>div</tt>.
+    </p>
+
+    <p id="View-dollar">
+      <b class="header">$ (jQuery or Zepto)</b><code>view.$(selector)</code>
+      <br />
+      If jQuery or Zepto is included on the page, each view has a
+      <b>$</b> function that runs queries scoped within the view's element. If you use this
+      scoped jQuery function, you don't have to use model ids as part of your query
+      to pull out specific elements in a list, and can rely much more on HTML class
+      attributes. It's equivalent to running: <tt>$(selector, this.el)</tt>
+    </p>
+
+<pre>
+ui.Chapter = Backbone.View.extend({
+  serialize : function() {
+    return {
+      title: this.$(".title").text(),
+      start: this.$(".start-page").text(),
+      end:   this.$(".end-page").text()
+    };
+  }
+});
+</pre>
+
+    <p id="View-render">
+      <b class="header">render</b><code>view.render()</code>
+      <br />
+      The default implementation of <b>render</b> is a no-op. Override this
+      function with your code that renders the view template from model data,
+      and updates <tt>this.el</tt> with the new HTML. A good
+      convention is to <tt>return this</tt> at the end of <b>render</b> to
+      enable chained calls.
+    </p>
+
+<pre>
+var Bookmark = Backbone.View.extend({
+  render: function() {
+    $(this.el).html(this.template(this.model.toJSON()));
+    return this;
+  }
+});
+</pre>
+
+    <p>
+      Backbone is agnostic with respect to your preferred method of HTML templating.
+      Your <b>render</b> function could even munge together an HTML string, or use
+      <tt>document.createElement</tt> to generate a DOM tree. However, we suggest
+      choosing a nice JavaScript templating library.
+      <a href="http://github.com/janl/mustache.js">Mustache.js</a>,
+      <a href="http://github.com/creationix/haml-js">Haml-js</a>, and
+      <a href="http://github.com/sstephenson/eco">Eco</a> are all fine alternatives.
+      Because <a href="http://documentcloud.github.com/underscore/">Underscore.js</a> is already on the page,
+      <a href="http://documentcloud.github.com/underscore/#template">_.template</a>
+      is available, and is an excellent choice if you've already XSS-sanitized
+      your interpolated data.
+    </p>
+
+    <p>
+      Whatever templating strategy you end up with, it's nice if you <i>never</i>
+      have to put strings of HTML in your JavaScript. At DocumentCloud, we
+      use <a href="http://documentcloud.github.com/jammit/">Jammit</a> in order
+      to package up JavaScript templates stored in <tt>/app/views</tt> as part
+      of our main <tt>core.js</tt> asset package.
+    </p>
+
+    <p id="View-remove">
+      <b class="header">remove</b><code>view.remove()</code>
+      <br />
+      Convenience function for removing the view from the DOM. Equivalent to calling
+      <tt>$(view.el).remove();</tt>
+    </p>
+
+    <p id="View-make">
+      <b class="header">make</b><code>view.make(tagName, [attributes], [content])</code>
+      <br />
+      Convenience function for creating a DOM element of the given type (<b>tagName</b>),
+      with optional attributes and HTML content. Used internally to create the
+      initial <tt>view.el</tt>.
+    </p>
+
+<pre class="runnable">
+var view = new Backbone.View;
+
+var el = view.make("b", {className: "bold"}, "Bold! ");
+
+$("#make-demo").append(el);
+</pre>
+
+<div id="make-demo"></div>
+
+    <p id="View-delegateEvents">
+      <b class="header">delegateEvents</b><code>delegateEvents([events])</code>
+      <br />
+      Uses jQuery's <tt>delegate</tt> function to provide declarative callbacks
+      for DOM events within a view.
+      If an <b>events</b> hash is not passed directly, uses <tt>this.events</tt>
+      as the source. Events are written in the format <tt>{"event selector": "callback"}</tt>.
+      Omitting the <tt>selector</tt> causes the event to be bound to the view's
+      root element (<tt>this.el</tt>). By default, <tt>delegateEvents</tt> is called
+      within the View's constructor for you, so if you have a simple <tt>events</tt>
+      hash, all of your DOM events will always already be connected, and you will
+      never have to call this function yourself.
+    </p>
+
+    <p>
+      Using <b>delegateEvents</b> provides a number of advantages over manually
+      using jQuery to bind events to child elements during <a href="#View-render">render</a>. All attached
+      callbacks are bound to the view before being handed off to jQuery, so when
+      the callbacks are invoked, <tt>this</tt> continues to refer to the view object. When
+      <b>delegateEvents</b> is run again, perhaps with a different <tt>events</tt>
+      hash, all callbacks are removed and delegated afresh — useful for
+      views which need to behave differently when in different modes.
+    </p>
+
+    <p>
+      A view that displays a document in a search result might look
+      something like this:
+    </p>
+
+<pre>
+var DocumentView = Backbone.View.extend({
+
+  events: {
+    "dblclick"                : "open",
+    "click .icon.doc"         : "select",
+    "contextmenu .icon.doc"   : "showMenu",
+    "click .show_notes"       : "toggleNotes",
+    "click .title .lock"      : "editAccessLevel",
+    "mouseover .title .date"  : "showTooltip"
+  },
+
+  render: function() {
+    $(this.el).html(this.template(this.model.toJSON()));
+    return this;
+  },
+
+  open: function() {
+    window.open(this.model.get("viewer_url"));
+  },
+
+  select: function() {
+    this.model.set({selected: true});
+  },
+
+  ...
+
+});
+</pre>
+
+    <h2 id="examples">Examples</h2>
+
+    <p>
+      <a href="http://jgn.me/">Jérôme Gravel-Niquet</a> has contributed a
+      <a href="examples/todos/index.html">Todo List application</a>
+      that is bundled in the repository as Backbone example. If you're wondering
+      where to get started with Backbone in general, take a moment to
+      <a href="docs/todos.html">read through the annotated source</a>. The app uses a
+      <a href="docs/backbone-localstorage.html">LocalStorage adapter</a>
+      to transparently save all of your todos within your browser, instead of
+      sending them to a server. Jérôme also has a version hosted at
+      <a href="http://localtodos.com/">localtodos.com</a> that uses a
+      <a href="http://github.com/jeromegn/backbone-mootools">MooTools-backed version of Backbone</a>
+      instead of jQuery.
+    </p>
+
+    <div style="text-align: center;">
+      <a href="examples/todos/index.html">
+        <img src="docs/images/todos.png" alt="Todos" style="margin: 10px auto;" />
+      </a>
+    </div>
+
+    <p>
+      The <a href="http://www.documentcloud.org/">DocumentCloud</a> workspace
+      is built on Backbone.js, with <i>Documents</i>, <i>Projects</i>,
+      <i>Notes</i>, and <i>Accounts</i> all as Backbone models and collections.
+    </p>
+
+    <div style="text-align: center;">
+      <img src="docs/images/dc-workspace.png" alt="DocumentCloud Workspace" style="margin: 10px auto;" />
+    </div>
+
+    <p>
+      <a href="http://bennolan.com/">Ben Nolan</a> created
+      <a href="http://bennolan.com/2010/11/24/backbone-jquery-demo.html">an example "Backbone Mobile" application</a>, combining Backbone.js
+      with <a href="http://jquerymobile.com/">jQuery Mobile</a>. You can
+      <a href="http://bennolan.com/science/backbone-mobile/">try the app</a>
+      in your browser, or view the
+      <a href="https://github.com/bnolan/backbone-mobile">source code</a> on Github.
+    </p>
+
+    <div style="text-align: center;">
+      <a href="http://bennolan.com/science/backbone-mobile/">
+        <img src="docs/images/backbone-mobile.png" alt="Backbone Mobile" style="margin: 10px auto;" />
+      </a>
+    </div>
+
+    <h2 id="changelog">Change Log</h2>
+
+    <p>
+      <b class="header">0.3.3</b> — <small><i>Dec 1, 2010</i></small><br />
+      Backbone.js now supports <a href="http://zeptojs.com">Zepto</a>, alongside
+      jQuery, as a framework for DOM manipulation and Ajax support.
+      Implemented <a href="#Model-escape">Model#escape</a>, to efficiently handle
+      attributes intended for HTML interpolation. When trying to persist a model,
+      failed requests will now trigger an <tt>"error"</tt> event. The 
+      ubiquitous <tt>options</tt> argument is now passed as the final argument
+      to all <tt>"change"</tt> events.
+    </p>
+
+    <p>
+      <b class="header">0.3.2</b> — <small><i>Nov 23, 2010</i></small><br />
+      Bugfix for IE7 + iframe-based "hashchange" events. <tt>sync</tt> may now be
+      overridden on a per-model, or per-collection basis. Fixed recursion error
+      when calling <tt>save</tt> with no changed attributes, within a
+      <tt>"change"</tt> event.
+    </p>
+
+    <p>
+      <b class="header">0.3.1</b> — <small><i>Nov 15, 2010</i></small><br />
+      All <tt>"add"</tt> and <tt>"remove"</tt> events are now sent through the
+      model, so that views can listen for them without having to know about the
+      collection. Added a <tt>remove</tt> method to <a href="#View">Backbone.View</a>.
+      <tt>toJSON</tt> is no longer called at all for <tt>'read'</tt> and <tt>'delete'</tt> requests.
+      Backbone routes are now able to load empty URL fragments.
+    </p>
+
+    <p>
+      <b class="header">0.3.0</b> — <small><i>Nov 9, 2010</i></small><br />
+      Backbone now has <a href="#Controller">Controllers</a> and
+      <a href="#History">History</a>, for doing client-side routing based on
+      URL fragments.
+      Added <tt>emulateHTTP</tt> to provide support for legacy servers that don't
+      do <tt>PUT</tt> and <tt>DELETE</tt>.
+      Added <tt>emulateJSON</tt> for servers that can't accept <tt>application/json</tt>
+      encoded requests.
+      Added <a href="#Model-clear">Model#clear</a>, which removes all attributes
+      from a model.
+      All Backbone classes may now be seamlessly inherited by CoffeeScript classes.
+    </p>
+
+    <p>
+      <b class="header">0.2.0</b> — <small><i>Oct 25, 2010</i></small><br />
+      Instead of requiring server responses to be namespaced under a <tt>model</tt>
+      key, now you can define your own <a href="#Model-parse">parse</a> method
+      to convert responses into attributes for Models and Collections.
+      The old <tt>handleEvents</tt> function is now named
+      <a href="#View-delegateEvents">delegateEvents</a>, and is automatically
+      called as part of the View's constructor.
+      Added a <a href="#Collection-toJSON">toJSON</a> function to Collections.
+      Added <a href="#Collection-chain">Underscore's chain</a> to Collections.
+    </p>
+
+    <p>
+      <b class="header">0.1.2</b> — <small><i>Oct 19, 2010</i></small><br />
+      Added a <a href="#Model-fetch">Model#fetch</a> method for refreshing the
+      attributes of single model from the server.
+      An <tt>error</tt> callback may now be passed to <tt>set</tt> and <tt>save</tt>
+      as an option, which will be invoked if validation fails, overriding the
+      <tt>"error"</tt> event.
+      You can now tell backbone to use the <tt>_method</tt> hack instead of HTTP
+      methods by setting <tt>Backbone.emulateHTTP = true</tt>.
+      Existing Model and Collection data is no longer sent up unnecessarily with
+      <tt>GET</tt> and <tt>DELETE</tt> requests. Added a <tt>rake lint</tt> task.
+      Backbone is now published as an <a href="http://npmjs.org">NPM</a> module.
+    </p>
+
+    <p>
+      <b class="header">0.1.1</b> — <small><i>Oct 14, 2010</i></small><br />
+      Added a convention for <tt>initialize</tt> functions to be called
+      upon instance construction, if defined. Documentation tweaks.
+    </p>
+
+    <p>
+      <b class="header">0.1.0</b> — <small><i>Oct 13, 2010</i></small><br />
+      Initial Backbone release.
+    </p>
+
+    <p>
+      <br />
+      <a href="http://documentcloud.org/" title="A DocumentCloud Project" style="background:none;">
+        <img src="http://jashkenas.s3.amazonaws.com/images/a_documentcloud_project.png" alt="A DocumentCloud Project" style="position:relative;left:-10px;" />
+      </a>
+    </p>
+
+  </div>
+
+  <script src="test/vendor/underscore-1.1.3.js"></script>
+  <script src="test/vendor/jquery-1.4.2.js"></script>
+  <script src="test/vendor/json2.js"></script>
+  <script src="backbone.js"></script>
+
+  <script>
+    // Set up the "play" buttons for each runnable code example.
+    $(function() {
+      $('.runnable').each(function() {
+        var code = this;
+        var button = $('<div class="run" title="Run"></div>');
+        $(button).insertBefore(code).bind('click', function(){
+          eval($(code).text());
+        });
+      });
+    });
+  </script>
+
+</body>
+</html>
diff --git a/debian/node_modules/bones/node_modules/backbone/package.json b/debian/node_modules/bones/node_modules/backbone/package.json
new file mode 100644
index 0000000..4f3a227
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/backbone/package.json
@@ -0,0 +1,27 @@
+{
+  "name": "backbone",
+  "description": "Give your JS App some Backbone with Models, Views, Collections, and Events.",
+  "url": "http://documentcloud.github.com/backbone/",
+  "keywords": [
+    "util",
+    "functional",
+    "server",
+    "client",
+    "browser"
+  ],
+  "author": {
+    "name": "Jeremy Ashkenas",
+    "email": "jeremy at documentcloud.org"
+  },
+  "contributors": [],
+  "dependencies": {
+    "underscore": ">=1.1.2"
+  },
+  "lib": ".",
+  "main": "backbone.js",
+  "version": "0.3.3",
+  "readme": "  ____             _     _                        _     \n |  _ \\           | |   | |                      (_)    \n | |_) | __ _  ___| | __| |__   ___  _ __   ___   _ ___ \n |  _ < / _` |/ __| |/ /| '_ \\ / _ \\| '_ \\ / _ \\ | / __|\n | |_) | (_| | (__|   < | |_) | (_) | | | |  __/_| \\__ \\\n |____/ \\__,_|\\___|_|\\_\\|_.__/ \\___/|_| |_|\\___(_) |___/\n                                                _/ |    \n                                               |__/\n(_'____ [...]
+  "readmeFilename": "README",
+  "_id": "backbone at 0.3.3",
+  "_from": "backbone at 0.3.3"
+}
diff --git a/debian/node_modules/bones/node_modules/express/.npmignore b/debian/node_modules/bones/node_modules/express/.npmignore
new file mode 100644
index 0000000..74bd365
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/.npmignore
@@ -0,0 +1,7 @@
+.git*
+docs/
+examples/
+support/
+test/
+testing.js
+.DS_Store
diff --git a/debian/node_modules/bones/node_modules/express/History.md b/debian/node_modules/bones/node_modules/express/History.md
new file mode 100644
index 0000000..95ea466
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/History.md
@@ -0,0 +1,823 @@
+
+2.5.11 / 2012-06-29 
+==================
+
+  * Fixed backport of req.protocol
+
+2.5.10 / 2012-06-15 
+==================
+
+  * Remove annoying engines field from package.json
+  * Backport support for trusting X-Forwarded-Proto
+  * use version of `package.json` for `express` command
+
+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 `<root>/_?<name>` 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 <root>/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/debian/node_modules/bones/node_modules/express/LICENSE b/debian/node_modules/bones/node_modules/express/LICENSE
new file mode 100644
index 0000000..36075a3
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/LICENSE
@@ -0,0 +1,22 @@
+(The MIT License)
+
+Copyright (c) 2009-2011 TJ Holowaychuk <tj at 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/debian/node_modules/bones/node_modules/express/Makefile b/debian/node_modules/bones/node_modules/express/Makefile
new file mode 100644
index 0000000..dfbfd67
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/Makefile
@@ -0,0 +1,29 @@
+
+DOCS = $(shell find docs/*.md)
+HTMLDOCS = $(DOCS:.md=.html)
+TESTS = $(shell find test/*.test.js)
+
+test:
+	@NODE_ENV=test ./node_modules/.bin/expresso $(TESTS)
+
+docs: $(HTMLDOCS)
+	@ echo "... generating TOC"
+	@./support/toc.js docs/guide.html
+
+%.html: %.md
+	@echo "... $< -> $@"
+	@markdown $< \
+	  | cat docs/layout/head.html - docs/layout/foot.html \
+	  > $@
+
+site:
+	rm -fr /tmp/docs \
+	  && cp -fr docs /tmp/docs \
+	  && git checkout gh-pages \
+  	&& cp -fr /tmp/docs/* . \
+		&& echo "done"
+
+docclean:
+	rm -f docs/*.{1,html}
+
+.PHONY: site test docs docclean
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/Readme.md b/debian/node_modules/bones/node_modules/express/Readme.md
new file mode 100644
index 0000000..d2c64c7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/Readme.md
@@ -0,0 +1,145 @@
+
+# Express
+      
+  Insanely fast (and small) server-side JavaScript web development framework
+  built on [node](http://nodejs.org) and [Connect](http://github.com/senchalabs/connect).
+  
+     var app = express.createServer();
+     
+     app.get('/', function(req, res){
+       res.send('Hello World');
+     });
+     
+     app.listen(3000);
+
+## Installation
+
+    $ npm install express
+
+or to access the `express(1)` executable install globally:
+
+    $ 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 -d
+
+ Start the server:
+
+    $ node app.js
+
+## Features
+
+  * Robust routing
+  * Redirection helpers
+  * Dynamic view helpers
+  * Content negotiation
+  * Focus on high performance
+  * View rendering and partials support
+  * Environment based configuration
+  * Session based flash notifications
+  * Built on [Connect](http://github.com/senchalabs/connect)
+  * High test coverage
+  * Executable for generating applications quickly
+  * Application level view options
+
+Via Connect:
+
+  * Session support
+  * Cache API
+  * Mime helpers
+  * ETag support
+  * Persistent flash notifications
+  * Cookie support
+  * JSON-RPC
+  * Logging
+  * and _much_ more!
+
+## Contributors
+
+The following are the major contributors of Express (in no specific order).
+
+  * TJ Holowaychuk ([visionmedia](http://github.com/visionmedia))
+  * Ciaran Jessup ([ciaranj](http://github.com/ciaranj))
+  * Aaron Heckmann ([aheckmann](http://github.com/aheckmann))
+  * Guillermo Rauch ([guille](http://github.com/guille))
+
+## More Information
+
+  * #express on freenode
+  * [express-expose](http://github.com/visionmedia/express-expose) expose objects, functions, modules and more to client-side js with ease
+  * [express-configure](http://github.com/visionmedia/express-configuration) async configuration support
+  * [express-messages](http://github.com/visionmedia/express-messages) flash notification rendering helper
+  * [express-namespace](http://github.com/visionmedia/express-namespace) namespaced route support
+  * [express-params](https://github.com/visionmedia/express-params) param pre-condition functions
+  * [express-mongoose](https://github.com/LearnBoost/express-mongoose) plugin for easy rendering of Mongoose async Query results
+  * Follow [tjholowaychuk](http://twitter.com/tjholowaychuk) on twitter for updates
+  * [Google Group](http://groups.google.com/group/express-js) for discussion
+  * Visit the [Wiki](http://github.com/visionmedia/express/wiki)
+  * [日本語ドキュメンテーション](http://hideyukisaito.com/doc/expressjs/) by [hideyukisaito](https://github.com/hideyukisaito)
+  * Screencast - [Introduction](http://bit.ly/eRYu0O)
+  * Screencast - [View Partials](http://bit.ly/dU13Fx)
+  * Screencast - [Route Specific Middleware](http://bit.ly/hX4IaH)
+  * Screencast - [Route Path Placeholder Preconditions](http://bit.ly/eNqmVs)
+
+## Node Compatibility
+
+Express 1.x is compatible with node 0.2.x and connect < 1.0.
+
+Express 2.x is compatible with node 0.4.x or 0.6.x, and connect 1.x
+
+Express 3.x (master) will be compatible with node 0.6.x and connect 2.x
+
+## Viewing Examples
+
+First install the dev dependencies to install all the example / test suite deps:
+
+    $ npm install
+
+then run whichever tests you want:
+
+    $ node examples/jade/app.js
+
+## 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
+
+## License 
+
+(The MIT License)
+
+Copyright (c) 2009-2011 TJ Holowaychuk <tj at 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/debian/node_modules/bones/node_modules/express/bin/express b/debian/node_modules/bones/node_modules/express/bin/express
new file mode 100755
index 0000000..367be59
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/bin/express
@@ -0,0 +1,423 @@
+#!/usr/bin/env node
+
+/**
+ * Module dependencies.
+ */
+
+var fs = require('fs')
+  , os = require('os')
+  , exec = require('child_process').exec
+  , mkdirp = require('mkdirp');
+
+/**
+ * Package information.
+ */
+
+var pkg = JSON.parse(fs.readFileSync(__dirname + '/../package.json'));
+
+/**
+ * Framework version.
+ */
+
+var version = pkg.version;
+
+/**
+ * Add session support.
+ */
+
+var sessions = false;
+
+/**
+ * CSS engine to utilize.
+ */
+
+var cssEngine;
+
+/**
+ * End-of-line code.
+ */
+
+var eol = os.platform
+  ? ('win32' == os.platform() ? '\r\n' : '\n')
+  : '\n';
+
+/**
+ * Template engine to utilize.
+ */
+
+var templateEngine = 'jade';
+
+/**
+ * Usage documentation.
+ */
+
+var usage = ''
+  + '\n'
+  + '  Usage: express [options] [path]\n'
+  + '\n'
+  + '  Options:\n'
+  + '    -s, --sessions           add session support\n'
+  + '    -t, --template <engine>  add template <engine> support (jade|ejs). default=jade\n'
+  + '    -c, --css <engine>       add stylesheet <engine> support (stylus). default=plain css\n'
+  + '    -v, --version            output framework version\n'
+  + '    -h, --help               output help information\n'
+  ;
+
+/**
+ * Routes index template.
+ */
+
+var index = [
+    ''
+  , '/*'
+  , ' * GET home page.'
+  , ' */'
+  , ''
+  , 'exports.index = function(req, res){'
+  , '  res.render(\'index\', { title: \'Express\' })'
+  , '};'
+].join(eol);
+
+/**
+ * Jade layout template.
+ */
+
+var jadeLayout = [
+    '!!!'
+  , 'html'
+  , '  head'
+  , '    title= title'
+  , '    link(rel=\'stylesheet\', href=\'/stylesheets/style.css\')'
+  , '  body!= body'
+].join(eol);
+
+/**
+ * Jade index template.
+ */
+
+var jadeIndex = [
+    'h1= title'
+  , 'p Welcome to #{title}'
+].join(eol);
+
+/**
+ * EJS layout template.
+ */
+
+var ejsLayout = [
+    '<!DOCTYPE html>'
+  , '<html>'
+  , '  <head>'
+  , '    <title><%= title %></title>'
+  , '    <link rel=\'stylesheet\' href=\'/stylesheets/style.css\' />'
+  , '  </head>'
+  , '  <body>'
+  , '    <%- body %>'
+  , '  </body>'
+  , '</html>'
+].join(eol);
+
+/**
+ * EJS index template.
+ */
+
+var ejsIndex = [
+    '<h1><%= title %></h1>'
+  , '<p>Welcome to <%= title %></p>'
+  ].join(eol);
+
+/**
+ * Default css template.
+ */
+
+var css = [
+    '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\');'
+  , ''
+  , 'var app = module.exports = express.createServer();'
+  , ''
+  , '// Configuration'
+  , ''
+  , 'app.configure(function(){'
+  , '  app.set(\'views\', __dirname + \'/views\');'
+  , '  app.set(\'view engine\', \':TEMPLATE\');'
+  , '  app.use(express.bodyParser());'
+  , '  app.use(express.methodOverride());{sess}{css}'
+  , '  app.use(app.router);'
+  , '  app.use(express.static(__dirname + \'/public\'));'
+  , '});'
+  , ''
+  , 'app.configure(\'development\', function(){'
+  , '  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));'
+  , '});'
+  , ''
+  , 'app.configure(\'production\', function(){'
+  , '  app.use(express.errorHandler());'
+  , '});'
+  , ''
+  , '// Routes'
+  , ''
+  , 'app.get(\'/\', routes.index);'
+  , ''
+  , 'app.listen(3000, function(){'
+  , '  console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);'
+  , '});'
+  , ''
+].join(eol);
+
+// Parse arguments
+
+var args = process.argv.slice(2)
+  , path = '.';
+
+while (args.length) {
+  var arg = args.shift();
+  switch (arg) {
+    case '-h':
+    case '--help':
+      abort(usage);
+      break;
+    case '-v':
+    case '--version':
+      abort(version);
+      break;
+    case '-s':
+    case '--session':
+    case '--sessions':
+      sessions = true;
+      break;
+    case '-c':
+    case '--css':
+      args.length
+        ? (cssEngine = args.shift())
+        : abort('--css requires an argument');
+      break;
+    case '-t':
+    case '--template':
+      args.length
+        ? (templateEngine = args.shift())
+        : abort('--template requires an argument');
+      break;
+    default:
+        path = arg;
+  }
+}
+
+// Generate application
+
+(function createApplication(path) {
+  emptyDirectory(path, function(empty){
+    if (empty) {
+      createApplicationAt(path);
+    } else {
+      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('   dont forget to install dependencies:');
+    console.log('   $ cd %s && npm install', path);
+    console.log();
+  });
+
+  mkdir(path, function(){
+    mkdir(path + '/public');
+    mkdir(path + '/public/javascripts');
+    mkdir(path + '/public/images');
+    mkdir(path + '/public/stylesheets', function(){
+      switch (cssEngine) {
+        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);
+    });
+
+    mkdir(path + '/views', function(){
+      switch (templateEngine) {
+        case 'ejs':
+          write(path + '/views/layout.ejs', ejsLayout);
+          write(path + '/views/index.ejs', ejsIndex);
+          break;
+        case 'jade':
+          write(path + '/views/layout.jade', jadeLayout);
+          write(path + '/views/index.jade', jadeIndex);
+          break;
+      }
+    });
+
+    // CSS Engine support
+    switch (cssEngine) {
+      case 'stylus':
+        app = app.replace('{css}', eol + '  app.use(require(\'stylus\').middleware({ src: __dirname + \'/public\' }));');
+        break;
+      default:
+        app = app.replace('{css}', '');
+    }
+
+    // Session support
+    app = app.replace('{sess}', sessions
+      ? eol + '  app.use(express.cookieParser());' + eol + '  app.use(express.session({ secret: \'your secret here\' }));'
+      : '');
+
+    // Template support
+    app = app.replace(':TEMPLATE', templateEngine);
+
+    // package.json
+    var json = '{' + eol;
+    json += '    "name": "application-name"' + eol;
+    json += '  , "version": "0.0.1"' + eol;
+    json += '  , "private": true' + eol;
+    json += '  , "dependencies": {' + eol;
+    json += '      "express": "' + version + '"' + eol;
+    if (cssEngine) json += '    , "' + cssEngine + '": ">= 0.0.1"' + eol;
+    if (templateEngine) json += '    , "' + templateEngine + '": ">= 0.0.1"' + eol;
+    json += '  }' + eol;
+    json += '}';
+
+
+    write(path + '/package.json', json);
+    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);
+}
+
+/**
+ * Prompt confirmation with the given `msg`.
+ *
+ * @param {String} msg
+ * @param {Function} fn
+ */
+
+function confirm(msg, fn) {
+  prompt(msg, function(val){
+    fn(/^ *y(es)?/i.test(val));
+  });
+}
+
+/**
+ * Prompt input with the given `msg` and callback `fn`.
+ *
+ * @param {String} msg
+ * @param {Function} fn
+ */
+
+function prompt(msg, fn) {
+  // prompt
+  if (' ' == msg[msg.length - 1]) {
+    process.stdout.write(msg);
+  } else {
+    console.log(msg);
+  }
+
+  // stdin
+  process.stdin.setEncoding('ascii');
+  process.stdin.once('data', function(data){
+    fn(data);
+  }).resume();
+}
+
+/**
+ * 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/debian/node_modules/bones/node_modules/express/index.js b/debian/node_modules/bones/node_modules/express/index.js
new file mode 100644
index 0000000..8d81ea7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/index.js
@@ -0,0 +1,2 @@
+
+module.exports = require('./lib/express');
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/lib/express.js b/debian/node_modules/bones/node_modules/express/lib/express.js
new file mode 100644
index 0000000..7ea451d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/lib/express.js
@@ -0,0 +1,79 @@
+
+/*!
+ * Express
+ * Copyright(c) 2010 TJ Holowaychuk <tj at vision-media.ca>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var connect = require('connect')
+  , HTTPSServer = require('./https')
+  , HTTPServer = require('./http')
+  , Route = require('./router/route')
+
+/**
+ * Re-export connect auto-loaders.
+ * 
+ * This prevents the need to `require('connect')` in order
+ * to access core middleware, so for example `express.logger()` instead
+ * of `require('connect').logger()`.
+ */
+
+var exports = module.exports = connect.middleware;
+
+/**
+ * Framework version.
+ */
+
+exports.version = '2.5.11';
+
+/**
+ * Shortcut for `new Server(...)`.
+ *
+ * @param {Function} ...
+ * @return {Server}
+ * @api public
+ */
+
+exports.createServer = function(options){
+  if ('object' == typeof options) {
+    return new HTTPSServer(options, Array.prototype.slice.call(arguments, 1));
+  } else {
+    return new HTTPServer(Array.prototype.slice.call(arguments));
+  }
+};
+
+/**
+ * Expose constructors.
+ */
+
+exports.HTTPServer = HTTPServer;
+exports.HTTPSServer = HTTPSServer;
+exports.Route = Route;
+
+/**
+ * View extensions.
+ */
+
+exports.View =
+exports.view = require('./view');
+
+/**
+ * Response extensions.
+ */
+
+require('./response');
+
+/**
+ * Request extensions.
+ */
+
+require('./request');
+
+// Error handler title
+
+exports.errorHandler.title = 'Express';
+
diff --git a/debian/node_modules/bones/node_modules/express/lib/http.js b/debian/node_modules/bones/node_modules/express/lib/http.js
new file mode 100644
index 0000000..da2158f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/lib/http.js
@@ -0,0 +1,582 @@
+/*!
+ * Express - HTTPServer
+ * Copyright(c) 2010 TJ Holowaychuk <tj at vision-media.ca>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var qs = require('qs')
+  , connect = require('connect')
+  , router = require('./router')
+  , Router = require('./router')
+  , view = require('./view')
+  , toArray = require('./utils').toArray
+  , methods = router.methods.concat('del', 'all')
+  , url = require('url')
+  , utils = connect.utils;
+
+/**
+ * Expose `HTTPServer`.
+ */
+
+exports = module.exports = HTTPServer;
+
+/**
+ * Server proto.
+ */
+
+var app = HTTPServer.prototype;
+
+/**
+ * Initialize a new `HTTPServer` with optional `middleware`.
+ *
+ * @param {Array} middleware
+ * @api public
+ */
+
+function HTTPServer(middleware){
+  connect.HTTPServer.call(this, []);
+  this.init(middleware);
+};
+
+/**
+ * Inherit from `connect.HTTPServer`.
+ */
+
+app.__proto__ = connect.HTTPServer.prototype;
+
+/**
+ * Initialize the server.
+ *
+ * @param {Array} middleware
+ * @api private
+ */
+
+app.init = function(middleware){
+  var self = this;
+  this.cache = {};
+  this.settings = {};
+  this.redirects = {};
+  this.isCallbacks = {};
+  this._locals = {};
+  this.dynamicViewHelpers = {};
+  this.errorHandlers = [];
+
+  this.set('env', process.env.NODE_ENV || 'development');
+
+  // expose objects to each other
+  this.use(function(req, res, next){
+    req.query = req.query || {};
+    res.setHeader('X-Powered-By', 'Express');
+    req.app = res.app = self;
+    req.res = res;
+    res.req = req;
+    req.next = next;
+    // assign req.query
+    if (req.url.indexOf('?') > 0) {
+      var query = url.parse(req.url).query;
+      req.query = qs.parse(query);
+    }
+    next();
+  });
+
+  // apply middleware
+  if (middleware) middleware.forEach(self.use.bind(self));
+
+  // router
+  this.routes = new Router(this);
+  this.__defineGetter__('router', function(){
+    this.__usedRouter = true;
+    return self.routes.middleware;
+  });
+
+  // default locals
+  this.locals({
+      settings: this.settings
+    , app: this
+  });
+
+  // default development configuration
+  this.configure('development', function(){
+    this.enable('hints');
+  });
+
+  // default production configuration
+  this.configure('production', function(){
+    this.enable('view cache');
+  });
+
+  // register error handlers on "listening"
+  // so that they disregard definition position.
+  this.on('listening', this.registerErrorHandlers.bind(this));
+
+  // route manipulation methods
+  methods.forEach(function(method){
+    self.lookup[method] = function(path){
+      return self.routes.lookup(method, path);
+    };
+
+    self.match[method] = function(path){
+      return self.routes.match(method, path);
+    };
+
+    self.remove[method] = function(path){
+      return self.routes.lookup(method, path).remove();
+    };
+  });
+
+  // del -> delete
+  self.lookup.del = self.lookup.delete;
+  self.match.del = self.match.delete;
+  self.remove.del = self.remove.delete;
+};
+
+/**
+ * Remove routes matching the given `path`.
+ *
+ * @param {Route} path
+ * @return {Boolean}
+ * @api public
+ */
+
+app.remove = function(path){
+  return this.routes.lookup('all', path).remove();
+};
+
+/**
+ * Lookup routes defined with a path
+ * equivalent to `path`.
+ *
+ * @param {Stirng} path
+ * @return {Array}
+ * @api public
+ */
+
+app.lookup = function(path){
+  return this.routes.lookup('all', path);
+};
+
+/**
+ * Lookup routes matching the given `url`.
+ *
+ * @param {Stirng} url
+ * @return {Array}
+ * @api public
+ */
+
+app.match = function(url){
+  return this.routes.match('all', url);
+};
+
+/**
+ * When using the vhost() middleware register error handlers.
+ */
+
+app.onvhost = function(){
+  this.registerErrorHandlers();
+};
+
+/**
+ * Register error handlers.
+ *
+ * @return {Server} for chaining
+ * @api public
+ */
+
+app.registerErrorHandlers = function(){
+  this.errorHandlers.forEach(function(fn){
+    this.use(function(err, req, res, next){
+      fn.apply(this, arguments);
+    });
+  }, this);
+  return this;
+};
+
+/**
+ * Proxy `connect.HTTPServer#use()` to apply settings to
+ * mounted applications.
+ *
+ * @param {String|Function|Server} route
+ * @param {Function|Server} middleware
+ * @return {Server} for chaining
+ * @api public
+ */
+
+app.use = function(route, middleware){
+  var app, base, handle;
+
+  if ('string' != typeof route) {
+    middleware = route, route = '/';
+  }
+
+  // express app
+  if (middleware.handle && middleware.set) app = middleware;
+
+  // restore .app property on req and res
+  if (app) {
+    app.route = route;
+    middleware = function(req, res, next) {
+      var orig = req.app;
+      app.handle(req, res, function(err){
+        req.app = res.app = orig;
+        next(err);
+      });
+    };
+  }
+
+  connect.HTTPServer.prototype.use.call(this, route, middleware);
+
+  // mounted an app, invoke the hook
+  // and adjust some settings
+  if (app) {
+    base = this.set('basepath') || this.route;
+    if ('/' == base) base = '';
+    base = base + (app.set('basepath') || app.route);
+    app.set('basepath', base);
+    app.parent = this;
+    if (app.__mounted) app.__mounted.call(app, this);
+  }
+
+  return this;
+};
+
+/**
+ * Assign a callback `fn` which is called
+ * when this `Server` is passed to `Server#use()`.
+ *
+ * Examples:
+ *
+ *    var app = express.createServer()
+ *      , blog = express.createServer();
+ *
+ *    blog.mounted(function(parent){
+ *      // parent is app
+ *      // "this" is blog
+ *    });
+ *
+ *    app.use(blog);
+ *
+ * @param {Function} fn
+ * @return {Server} for chaining
+ * @api public
+ */
+
+app.mounted = function(fn){
+  this.__mounted = fn;
+  return this;
+};
+
+/**
+ * See: view.register.
+ *
+ * @return {Server} for chaining
+ * @api public
+ */
+
+app.register = function(){
+  view.register.apply(this, arguments);
+  return this;
+};
+
+/**
+ * Register the given view helpers `obj`. This method
+ * can be called several times to apply additional helpers.
+ *
+ * @param {Object} obj
+ * @return {Server} for chaining
+ * @api public
+ */
+
+app.helpers =
+app.locals = function(obj){
+  utils.merge(this._locals, obj);
+  return this;
+};
+
+/**
+ * Register the given dynamic view helpers `obj`. This method
+ * can be called several times to apply additional helpers.
+ *
+ * @param {Object} obj
+ * @return {Server} for chaining
+ * @api public
+ */
+
+app.dynamicHelpers = function(obj){
+  utils.merge(this.dynamicViewHelpers, obj);
+  return this;
+};
+
+/**
+ * Map the given param placeholder `name`(s) to the given callback(s).
+ *
+ * Param mapping is used to provide pre-conditions to routes
+ * which us normalized placeholders. This callback has the same
+ * signature as regular middleware, for example below when ":userId"
+ * is used this function will be invoked in an attempt to load the user.
+ *
+ *      app.param('userId', 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'));
+ *          }
+ *        });
+ *      });
+ *
+ * Passing a single function allows you to map logic
+ * to the values passed to `app.param()`, for example
+ * this is useful to provide coercion support in a concise manner.
+ *
+ * The following example maps regular expressions to param values
+ * ensuring that they match, otherwise passing control to the next
+ * route:
+ *
+ *      app.param(function(name, regexp){
+ *        if (regexp instanceof RegExp) {
+ *          return function(req, res, next, val){
+ *            var captures;
+ *            if (captures = regexp.exec(String(val))) {
+ *              req.params[name] = captures;
+ *              next();
+ *            } else {
+ *              next('route');
+ *            }
+ *          }
+ *        }
+ *      });
+ *
+ * We can now use it as shown below, where "/commit/:commit" expects
+ * that the value for ":commit" is at 5 or more digits. The capture
+ * groups are then available as `req.params.commit` as we defined
+ * in the function above.
+ *
+ *    app.param('commit', /^\d{5,}$/);
+ *
+ * For more of this useful functionality take a look
+ * at [express-params](http://github.com/visionmedia/express-params).
+ *
+ * @param {String|Array|Function} name
+ * @param {Function} fn
+ * @return {Server} 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.routes.param(name);
+  // single
+  } else {
+    if (':' == name[0]) name = name.substr(1);
+    fns.forEach(function(fn){
+      self.routes.param(name, fn);
+    });
+  }
+
+  return this;
+};
+
+/**
+ * Assign a custom exception handler callback `fn`.
+ * These handlers are always _last_ in the middleware stack.
+ *
+ * @param {Function} fn
+ * @return {Server} for chaining
+ * @api public
+ */
+
+app.error = function(fn){
+  this.errorHandlers.push(fn);
+  return this;
+};
+
+/**
+ * Register the given callback `fn` for the given `type`.
+ *
+ * @param {String} type
+ * @param {Function} fn
+ * @return {Server} for chaining
+ * @api public
+ */
+
+app.is = function(type, fn){
+  if (!fn) return this.isCallbacks[type];
+  this.isCallbacks[type] = fn;
+  return this;
+};
+
+/**
+ * Assign `setting` to `val`, or return `setting`'s value.
+ * Mounted servers inherit their parent server's settings.
+ *
+ * @param {String} setting
+ * @param {String} val
+ * @return {Server|Mixed} for chaining, or the setting value
+ * @api public
+ */
+
+app.set = function(setting, val){
+  if (val === undefined) {
+    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;
+  }
+};
+
+/**
+ * Check if `setting` is enabled.
+ *
+ * @param {String} setting
+ * @return {Boolean}
+ * @api public
+ */
+
+app.enabled = function(setting){
+  return !!this.set(setting);
+};
+
+/**
+ * Check if `setting` is disabled.
+ *
+ * @param {String} setting
+ * @return {Boolean}
+ * @api public
+ */
+
+app.disabled = function(setting){
+  return !this.set(setting);
+};
+
+/**
+ * Enable `setting`.
+ *
+ * @param {String} setting
+ * @return {Server} for chaining
+ * @api public
+ */
+
+app.enable = function(setting){
+  return this.set(setting, true);
+};
+
+/**
+ * Disable `setting`.
+ *
+ * @param {String} setting
+ * @return {Server} for chaining
+ * @api public
+ */
+
+app.disable = function(setting){
+  return this.set(setting, false);
+};
+
+/**
+ * Redirect `key` to `url`.
+ *
+ * @param {String} key
+ * @param {String} url
+ * @return {Server} for chaining
+ * @api public
+ */
+
+app.redirect = function(key, url){
+  this.redirects[key] = url;
+  return this;
+};
+
+/**
+ * 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
+ *    });
+ *
+ * @param {String} env...
+ * @param {Function} fn
+ * @return {Server} for chaining
+ * @api public
+ */
+
+app.configure = function(env, fn){
+  var envs = 'all'
+    , args = toArray(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 `.route(VERB, ...)`.
+ */
+
+methods.forEach(function(method){
+  app[method] = function(path){
+    if (1 == arguments.length) return this.routes.lookup(method, path);
+    var args = [method].concat(toArray(arguments));
+    if (!this.__usedRouter) this.use(this.router);
+    return this.routes._route.apply(this.routes, args);
+  }
+});
+
+/**
+ * Special-cased "all" method, applying the given route `path`,
+ * middleware, and callback to _every_ HTTP method.
+ *
+ * @param {String} path
+ * @param {Function} ...
+ * @return {Server} for chaining
+ * @api public
+ */
+
+app.all = function(path){
+  var args = arguments;
+  if (1 == args.length) return this.routes.lookup('all', path);
+  methods.forEach(function(method){
+    if ('all' == method || 'del' == method) return;
+    app[method].apply(this, args);
+  }, this);
+  return this;
+};
+
+// del -> delete alias
+
+app.del = app.delete;
+
diff --git a/debian/node_modules/bones/node_modules/express/lib/https.js b/debian/node_modules/bones/node_modules/express/lib/https.js
new file mode 100644
index 0000000..8a8c008
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/lib/https.js
@@ -0,0 +1,52 @@
+
+/*!
+ * Express - HTTPSServer
+ * Copyright(c) 2010 TJ Holowaychuk <tj at vision-media.ca>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var connect = require('connect')
+  , HTTPServer = require('./http')
+  , https = require('https');
+
+/**
+ * Expose `HTTPSServer`.
+ */
+
+exports = module.exports = HTTPSServer;
+
+/**
+ * Server proto.
+ */
+
+var app = HTTPSServer.prototype;
+
+/**
+ * Initialize a new `HTTPSServer` with the 
+ * given `options`, and optional `middleware`.
+ *
+ * @param {Object} options
+ * @param {Array} middleware
+ * @api public
+ */
+
+function HTTPSServer(options, middleware){
+  connect.HTTPSServer.call(this, options, []);
+  this.init(middleware);
+};
+
+/**
+ * Inherit from `connect.HTTPSServer`.
+ */
+
+app.__proto__ = connect.HTTPSServer.prototype;
+
+// mixin HTTPServer methods
+
+Object.keys(HTTPServer.prototype).forEach(function(method){
+  app[method] = HTTPServer.prototype[method];
+});
diff --git a/debian/node_modules/bones/node_modules/express/lib/request.js b/debian/node_modules/bones/node_modules/express/lib/request.js
new file mode 100644
index 0000000..4138afe
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/lib/request.js
@@ -0,0 +1,357 @@
+
+/*!
+ * Express - request
+ * Copyright(c) 2010 TJ Holowaychuk <tj at vision-media.ca>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var http = require('http')
+  , req = http.IncomingMessage.prototype
+  , utils = require('./utils')
+  , parse = require('url').parse
+  , mime = require('mime');
+
+/**
+ * Default flash formatters.
+ *
+ * @type Object
+ */
+
+var flashFormatters = exports.flashFormatters = {
+  s: function(val){
+    return String(val);
+  }
+};
+
+/**
+ * Return request header or optional default.
+ *
+ * The `Referrer` header field is special-cased,
+ * both `Referrer` and `Referer` will yield are
+ * interchangeable.
+ *
+ * Examples:
+ *
+ *     req.header('Content-Type');
+ *     // => "text/plain"
+ *     
+ *     req.header('content-type');
+ *     // => "text/plain"
+ *     
+ *     req.header('Accept');
+ *     // => undefined
+ *     
+ *     req.header('Accept', 'text/html');
+ *     // => "text/html"
+ *
+ * @param {String} name
+ * @param {String} defaultValue
+ * @return {String} 
+ * @api public
+ */
+
+req.header = function(name, defaultValue){
+  switch (name = name.toLowerCase()) {
+    case 'referer':
+    case 'referrer':
+      return this.headers.referrer
+        || this.headers.referer
+        || defaultValue;
+    default:
+      return this.headers[name] || defaultValue;
+  }
+};
+
+/**
+ * Get `field`'s `param` value, defaulting to ''.
+ *
+ * Examples:
+ *
+ *     req.get('content-disposition', 'filename');
+ *     // => "something.png"
+ *
+ * @param {String} field
+ * @param {String} param
+ * @return {String}
+ * @api public
+ */
+
+req.get = function(field, param){
+  var val = this.header(field);
+  if (!val) return '';
+  var regexp = new RegExp(param + ' *= *(?:"([^"]+)"|([^;]+))', 'i');
+  if (!regexp.exec(val)) return '';
+  return RegExp.$1 || RegExp.$2;
+};
+
+/**
+ * Short-hand for `require('url').parse(req.url).pathname`.
+ *
+ * @return {String}
+ * @api public
+ */
+
+req.__defineGetter__('path', function(){
+  return parse(this.url).pathname;
+});
+
+/**
+ * Check if the _Accept_ header is present, and includes the given `type`.
+ *
+ * When the _Accept_ header is not present `true` is returned. Otherwise
+ * the given `type` is matched by an exact match, and then subtypes. You
+ * may pass the subtype such as "html" which is then converted internally
+ * to "text/html" using the mime lookup table.
+ *
+ * Examples:
+ * 
+ *     // Accept: text/html
+ *     req.accepts('html');
+ *     // => true
+ *
+ *     // Accept: text/*; application/json
+ *     req.accepts('html');
+ *     req.accepts('text/html');
+ *     req.accepts('text/plain');
+ *     req.accepts('application/json');
+ *     // => true
+ *
+ *     req.accepts('image/png');
+ *     req.accepts('png');
+ *     // => false
+ *
+ * @param {String} type
+ * @return {Boolean}
+ * @api public
+ */
+
+req.accepts = function(type){
+  var accept = this.header('Accept');
+
+  // normalize extensions ".json" -> "json"
+  if (type && '.' == type[0]) type = type.substr(1);
+
+  // when Accept does not exist, or contains '*/*' return true
+  if (!accept || ~accept.indexOf('*/*')) {
+    return true;
+  } else if (type) {
+    // allow "html" vs "text/html" etc
+    if (!~type.indexOf('/')) type = mime.lookup(type);
+
+    // check if we have a direct match
+    if (~accept.indexOf(type)) return true;
+
+    // check if we have type/*
+    type = type.split('/')[0] + '/*';
+    return !!~accept.indexOf(type);
+  } else {
+    return false;
+  }
+};
+
+/**
+ * Return the value of param `name` when present or `defaultValue`.
+ *
+ *  - Checks route placeholders, ex: _/user/:id_
+ *  - Checks query string params, ex: ?id=12
+ *  - Checks urlencoded body params, ex: id=12
+ *
+ * To utilize urlencoded 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){
+  // route params like /user/:id
+  if (this.params && this.params.hasOwnProperty(name) && undefined !== this.params[name]) {
+    return this.params[name]; 
+  }
+  // query string params
+  if (undefined !== this.query[name]) {
+    return this.query[name]; 
+  }
+  // request body params via connect.bodyParser
+  if (this.body && undefined !== this.body[name]) {
+    return this.body[name];
+  }
+  return defaultValue;
+};
+
+/**
+ * Queue flash `msg` of the given `type`.
+ *
+ * Examples:
+ *
+ *      req.flash('info', 'email sent');
+ *      req.flash('error', 'email delivery failed');
+ *      req.flash('info', 'email re-sent');
+ *      // => 2
+ *
+ *      req.flash('info');
+ *      // => ['email sent', 'email re-sent']
+ *
+ *      req.flash('info');
+ *      // => []
+ *
+ *      req.flash();
+ *      // => { error: ['email delivery failed'], info: [] }
+ *
+ * Formatting:
+ *
+ * Flash notifications also support arbitrary formatting support.
+ * For example you may pass variable arguments to `req.flash()`
+ * and use the %s specifier to be replaced by the associated argument:
+ *
+ *     req.flash('info', 'email has been sent to %s.', userName);
+ *
+ * To add custom formatters use the `exports.flashFormatters` object.
+ *
+ * @param {String} type
+ * @param {String} msg
+ * @return {Array|Object|Number}
+ * @api public
+ */
+
+req.flash = function(type, msg){
+  if (this.session === undefined) throw Error('req.flash() requires sessions');
+  var msgs = this.session.flash = this.session.flash || {};
+  if (type && msg) {
+    var i = 2
+      , args = arguments
+      , formatters = this.app.flashFormatters || {};
+    formatters.__proto__ = flashFormatters;
+    msg = utils.miniMarkdown(msg);
+    msg = msg.replace(/%([a-zA-Z])/g, function(_, format){
+      var formatter = formatters[format];
+      if (formatter) return formatter(utils.escape(args[i++]));
+    });
+    return (msgs[type] = msgs[type] || []).push(msg);
+  } else if (type) {
+    var arr = msgs[type];
+    delete msgs[type];
+    return arr || [];
+  } else {
+    this.session.flash = {};
+    return msgs;
+  }
+};
+
+/**
+ * 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');
+ *      // => true
+ *     
+ *      // When Content-Type is application/json
+ *      req.is('json');
+ *      req.is('application/json');
+ *      // => true
+ *     
+ *      req.is('html');
+ *      // => false
+ * 
+ * Ad-hoc callbacks can also be registered with Express, to perform
+ * assertions again the request, for example if we need an expressive
+ * way to check if our incoming request is an image, we can register "an image"
+ * callback:
+ * 
+ *       app.is('an image', function(req){
+ *         return 0 == req.headers['content-type'].indexOf('image');
+ *       });
+ *       
+ *  Now within our route callbacks, we can use to to assert content types
+ *  such as "image/jpeg", "image/png", etc.
+ * 
+ *      app.post('/image/upload', function(req, res, next){
+ *        if (req.is('an image')) {
+ *          // do something
+ *        } else {
+ *          next();
+ *        }
+ *      });
+ * 
+ * @param {String} type
+ * @return {Boolean}
+ * @api public
+ */
+
+req.is = function(type){
+  var fn = this.app.is(type);
+  if (fn) return fn(this);
+  var ct = this.headers['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);
+};
+
+// Callback for isXMLHttpRequest / xhr
+
+function isxhr() {
+  return this.header('X-Requested-With', '').toLowerCase() === 'xmlhttprequest';
+}
+
+/**
+ * Check if the request was an _XMLHttpRequest_.
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+req.__defineGetter__('isXMLHttpRequest', isxhr);
+req.__defineGetter__('xhr', isxhr);
+
+/**
+ * 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.set('trust proxy');
+  return this.connection.encrypted
+    ? 'https'
+    : trustProxy
+      ? (this.header('X-Forwarded-Proto') || 'http')
+      : 'http';
+});
+
+/**
+ * Short-hand for:
+ *
+ *    req.protocol == 'https'
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+req.__defineGetter__('secure', function(){
+  return 'https' == this.protocol;
+});
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/lib/response.js b/debian/node_modules/bones/node_modules/express/lib/response.js
new file mode 100644
index 0000000..0174950
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/lib/response.js
@@ -0,0 +1,459 @@
+
+/*!
+ * Express - response
+ * Copyright(c) 2010 TJ Holowaychuk <tj at vision-media.ca>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var fs = require('fs')
+  , http = require('http')
+  , path = require('path')
+  , connect = require('connect')
+  , utils = connect.utils
+  , parseRange = require('./utils').parseRange
+  , res = http.ServerResponse.prototype
+  , send = connect.static.send
+  , mime = require('mime')
+  , basename = path.basename
+  , join = path.join;
+
+/**
+ * Send a response with the given `body` and optional `headers` and `status` code.
+ *
+ * Examples:
+ *
+ *     res.send();
+ *     res.send(new Buffer('wahoo'));
+ *     res.send({ some: 'json' });
+ *     res.send('<p>some html</p>');
+ *     res.send('Sorry, cant find that', 404);
+ *     res.send('text', { 'Content-Type': 'text/plain' }, 201);
+ *     res.send(404);
+ *
+ * @param {String|Object|Number|Buffer} body or status
+ * @param {Object|Number} headers or status
+ * @param {Number} status
+ * @return {ServerResponse}
+ * @api public
+ */
+
+res.send = function(body, headers, status){
+  // allow status as second arg
+  if ('number' == typeof headers) {
+    status = headers,
+    headers = null;
+  }
+
+  // default status
+  status = status || this.statusCode;
+
+  // allow 0 args as 204
+  if (!arguments.length || undefined === body) status = 204;
+
+  // determine content type
+  switch (typeof body) {
+    case 'number':
+      if (!this.header('Content-Type')) {
+        this.contentType('.txt');
+      }
+      body = http.STATUS_CODES[status = body];
+      break;
+    case 'string':
+      if (!this.header('Content-Type')) {
+        this.charset = this.charset || 'utf-8';
+        this.contentType('.html');
+      }
+      break;
+    case 'boolean':
+    case 'object':
+      if (Buffer.isBuffer(body)) {
+        if (!this.header('Content-Type')) {
+          this.contentType('.bin');
+        }
+      } else {
+        return this.json(body, headers, status);
+      }
+      break;
+  }
+
+  // populate Content-Length
+  if (undefined !== body && !this.header('Content-Length')) {
+    this.header('Content-Length', Buffer.isBuffer(body)
+      ? body.length
+      : Buffer.byteLength(body));
+  }
+
+  // merge headers passed
+  if (headers) {
+    var fields = Object.keys(headers);
+    for (var i = 0, len = fields.length; i < len; ++i) {
+      var field = fields[i];
+      this.header(field, headers[field]);
+    }
+  }
+
+  // strip irrelevant headers
+  if (204 == status || 304 == status) {
+    this.removeHeader('Content-Type');
+    this.removeHeader('Content-Length');
+    body = '';
+  }
+
+  // respond
+  this.statusCode = status;
+  this.end('HEAD' == this.req.method ? null : body);
+  return this;
+};
+
+/**
+ * Send JSON response with `obj`, optional `headers`, and optional `status`.
+ *
+ * Examples:
+ *
+ *     res.json(null);
+ *     res.json({ user: 'tj' });
+ *     res.json('oh noes!', 500);
+ *     res.json('I dont have that', 404);
+ *
+ * @param {Mixed} obj
+ * @param {Object|Number} headers or status
+ * @param {Number} status
+ * @return {ServerResponse}
+ * @api public
+ */
+
+res.json = function(obj, headers, status){
+  var body = JSON.stringify(obj)
+    , callback = this.req.query.callback
+    , jsonp = this.app.enabled('jsonp callback');
+
+  this.charset = this.charset || 'utf-8';
+  this.header('Content-Type', 'application/json');
+
+  if (callback && jsonp) {
+    this.header('Content-Type', 'text/javascript');
+    body = callback.replace(/[^\w$.]/g, '') + '(' + body + ');';
+  }
+
+  return this.send(body, headers, status);
+};
+
+/**
+ * Set status `code`.
+ *
+ * @param {Number} code
+ * @return {ServerResponse}
+ * @api public
+ */
+
+res.status = function(code){
+  this.statusCode = code;
+  return this;
+};
+
+/**
+ * Transfer the file at the given `path`. Automatically sets 
+ * the _Content-Type_ response header field. `next()` is called
+ * when `path` is a directory, or when an error occurs.
+ *
+ * Options:
+ *
+ *   - `maxAge` defaulting to 0
+ *   - `root`   root directory for relative filenames
+ *
+ * @param {String} path
+ * @param {Object|Function} options or fn
+ * @param {Function} fn
+ * @api public
+ */
+
+res.sendfile = function(path, options, fn){
+  var next = this.req.next;
+  options = options || {};
+
+  // support function as second arg
+  if ('function' == typeof options) {
+    fn = options;
+    options = {};
+  }
+
+  options.path = encodeURIComponent(path);
+  options.callback = fn;
+  send(this.req, this, next, options);
+};
+
+/**
+ * Set _Content-Type_ response header passed through `mime.lookup()`.
+ *
+ * Examples:
+ *
+ *     var filename = 'path/to/image.png';
+ *     res.contentType(filename);
+ *     // res.headers['Content-Type'] is now "image/png"
+ *
+ *     res.contentType('.html');
+ *     res.contentType('html');
+ *     res.contentType('json');
+ *     res.contentType('png');
+ *
+ * @param {String} type
+ * @return {String} the resolved mime type
+ * @api public
+ */
+
+res.contentType = function(type){
+  return this.header('Content-Type', mime.lookup(type));
+};
+
+/**
+ * Set _Content-Disposition_ header to _attachment_ with optional `filename`.
+ *
+ * @param {String} filename
+ * @return {ServerResponse}
+ * @api public
+ */
+
+res.attachment = function(filename){
+  if (filename) this.contentType(filename);
+  this.header('Content-Disposition', filename
+    ? 'attachment; filename="' + basename(filename) + '"'
+    : 'attachment');
+  return this;
+};
+
+/**
+ * Transfer the file at the given `path`, with optional 
+ * `filename` as an attachment and optional callback `fn(err)`,
+ * and optional `fn2(err)` which is invoked when an error has
+ * occurred after header has been sent.
+ *
+ * @param {String} path
+ * @param {String|Function} filename or fn
+ * @param {Function} fn
+ * @param {Function} fn2
+ * @api public
+ */
+
+res.download = function(path, filename, fn, fn2){
+  var self = this;
+
+  // support callback as second arg
+  if ('function' == typeof filename) {
+    fn2 = fn;
+    fn = filename;
+    filename = null;
+  }
+
+  // transfer the file
+  this.attachment(filename || path).sendfile(path, function(err){
+    var sentHeader = self._header;
+    if (err) {
+      if (!sentHeader) self.removeHeader('Content-Disposition');
+      if (sentHeader) {
+        fn2 && fn2(err);
+      } else if (fn) {
+        fn(err);
+      } else {
+        self.req.next(err);
+      }
+    } else if (fn) {
+      fn();
+    }
+  });
+};
+
+/**
+ * Set or get response header `name` with optional `val`.
+ *
+ * @param {String} name
+ * @param {String} val
+ * @return {ServerResponse} for chaining
+ * @api public
+ */
+
+res.header = function(name, val){
+  if (1 == arguments.length) return this.getHeader(name);
+  this.setHeader(name, val);
+  return this;
+};
+
+/**
+ * Clear cookie `name`.
+ *
+ * @param {String} name
+ * @param {Object} options
+ * @api public
+ */
+
+res.clearCookie = function(name, options){
+  var opts = { expires: new Date(1) };
+  this.cookie(name, '', options
+    ? utils.merge(options, opts)
+    : opts);
+};
+
+/**
+ * Set cookie `name` to `val`, with the given `options`.
+ *
+ * Options:
+ *
+ *    - `maxAge`   max-age in milliseconds, converted to `expires`
+ *    - `path`     defaults to the "basepath" setting which is typically "/"
+ *
+ * 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} val
+ * @param {Options} options
+ * @api public
+ */
+
+res.cookie = function(name, val, options){
+  options = options || {};
+  if ('maxAge' in options) options.expires = new Date(Date.now() + options.maxAge);
+  if (undefined === options.path) options.path = this.app.set('basepath');
+  var cookie = utils.serializeCookie(name, val, options);
+  this.header('Set-Cookie', cookie);
+};
+
+/**
+ * Redirect to the given `url` with optional response `status`
+ * defauling to 302.
+ *
+ * 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 the application's
+ * "basepath" setting. Express also supports "basepath" out of the box,
+ * which can be set via `app.set('basepath', '/blog');`, and defaults
+ * to '/'.
+ *
+ * Redirect Mapping:
+ * 
+ *  To extend the redirect mapping capabilities that Express provides,
+ *  we may use the `app.redirect()` method:
+ * 
+ *     app.redirect('google', 'http://google.com');
+ * 
+ *  Now in a route we may call:
+ *
+ *     res.redirect('google');
+ *
+ *  We may also map dynamic redirects:
+ *
+ *      app.redirect('comments', function(req, res){
+ *          return '/post/' + req.params.id + '/comments';
+ *      });
+ *
+ *  So now we may do the following, and the redirect will dynamically adjust to
+ *  the context of the request. If we called this route with _GET /post/12_ our
+ *  redirect _Location_ would be _/post/12/comments_.
+ *
+ *      app.get('/post/:id', function(req, res){
+ *        res.redirect('comments');
+ *      });
+ *
+ *  Unless an absolute `url` is given, the app's mount-point
+ *  will be respected. For example if we redirect to `/posts`,
+ *  and our app is mounted at `/blog` we will redirect to `/blog/posts`.
+ *
+ * @param {String} url
+ * @param {Number} code
+ * @api public
+ */
+
+res.redirect = function(url, status){
+  var app = this.app
+    , req = this.req
+    , base = app.set('basepath') || app.route
+    , status = status || 302
+    , head = 'HEAD' == req.method
+    , body;
+
+  // Setup redirect map
+  var map = {
+      back: req.header('Referrer', base)
+    , home: base
+  };
+
+  // Support custom redirect map
+  map.__proto__ = app.redirects;
+
+  // Attempt mapped redirect
+  var mapped = 'function' == typeof map[url]
+    ? map[url](req, this)
+    : map[url];
+
+  // Perform redirect
+  url = mapped || url;
+
+  // Relative
+  if (!~url.indexOf('://')) {
+    // Respect mount-point
+    if ('/' != base && 0 != url.indexOf(base)) url = base + url;
+
+    // Absolute
+    var host = req.headers.host;
+    url = req.protocol + '://' + host + url;
+  }
+
+  // Support text/{plain,html} by default
+  if (req.accepts('html')) {
+    body = '<p>' + http.STATUS_CODES[status] + '. Redirecting to <a href="' + url + '">' + url + '</a></p>';
+    this.header('Content-Type', 'text/html');
+  } else {
+    body = http.STATUS_CODES[status] + '. Redirecting to ' + url;
+    this.header('Content-Type', 'text/plain');
+  }
+
+  // Respond
+  this.statusCode = status;
+  this.header('Location', url);
+  this.end(head ? null : body);
+};
+
+/**
+ * Assign the view local variable `name` to `val` or return the
+ * local previously assigned to `name`.
+ *
+ * @param {String} name
+ * @param {Mixed} val
+ * @return {Mixed} val
+ * @api public
+ */
+
+res.local = function(name, val){
+  this._locals = this._locals || {};
+  return undefined === val
+    ? this._locals[name]
+    : this._locals[name] = val;
+};
+
+/**
+ * Assign several locals with the given `obj`,
+ * or return the locals.
+ *
+ * @param {Object} obj
+ * @return {Object|Undefined}
+ * @api public
+ */
+
+res.locals =
+res.helpers = function(obj){
+  if (obj) {
+    for (var key in obj) {
+      this.local(key, obj[key]);
+    }
+  } else {
+    return this._locals;
+  }
+};
diff --git a/debian/node_modules/bones/node_modules/express/lib/router/collection.js b/debian/node_modules/bones/node_modules/express/lib/router/collection.js
new file mode 100644
index 0000000..991a9a2
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/lib/router/collection.js
@@ -0,0 +1,53 @@
+
+/*!
+ * Express - router - Collection
+ * Copyright(c) 2010 TJ Holowaychuk <tj at vision-media.ca>
+ * MIT Licensed
+ */
+
+/**
+ * Expose `Collection`.
+ */
+
+module.exports = Collection;
+
+/**
+ * Initialize a new route `Collection`
+ * with the given `router`.
+ * 
+ * @param {Router} router
+ * @api private
+ */
+
+function Collection(router) {
+  Array.apply(this, arguments);
+  this.router = router;
+}
+
+/**
+ * Inherit from `Array.prototype`.
+ */
+
+Collection.prototype.__proto__ = Array.prototype;
+
+/**
+ * Remove the routes in this collection.
+ *
+ * @return {Collection} of routes removed
+ * @api public
+ */
+
+Collection.prototype.remove = function(){
+  var router = this.router
+    , len = this.length
+    , ret = new Collection(this.router);
+
+  for (var i = 0; i < len; ++i) {
+    if (router.remove(this[i])) {
+      ret.push(this[i]);
+    }
+  }
+
+  return ret;
+};
+
diff --git a/debian/node_modules/bones/node_modules/express/lib/router/index.js b/debian/node_modules/bones/node_modules/express/lib/router/index.js
new file mode 100644
index 0000000..ff1498b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/lib/router/index.js
@@ -0,0 +1,398 @@
+
+/*!
+ * Express - Router
+ * Copyright(c) 2010 TJ Holowaychuk <tj at vision-media.ca>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Route = require('./route')
+  , Collection = require('./collection')
+  , utils = require('../utils')
+  , parse = require('url').parse
+  , toArray = utils.toArray;
+
+/**
+ * Expose `Router` constructor.
+ */
+
+exports = module.exports = Router;
+
+/**
+ * Expose HTTP methods.
+ */
+
+var methods = exports.methods = require('./methods');
+
+/**
+ * Initialize a new `Router` with the given `app`.
+ * 
+ * @param {express.HTTPServer} app
+ * @api private
+ */
+
+function Router(app) {
+  var self = this;
+  this.app = app;
+  this.routes = {};
+  this.params = {};
+  this._params = [];
+
+  this.middleware = function(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;
+};
+
+/**
+ * Return a `Collection` of all routes defined.
+ *
+ * @return {Collection}
+ * @api public
+ */
+
+Router.prototype.all = function(){
+  return this.find(function(){
+    return true;
+  });
+};
+
+/**
+ * Remove the given `route`, returns
+ * a bool indicating if the route was present
+ * or not.
+ *
+ * @param {Route} route
+ * @return {Boolean}
+ * @api public
+ */
+
+Router.prototype.remove = function(route){
+  var routes = this.routes[route.method]
+    , len = routes.length;
+
+  for (var i = 0; i < len; ++i) {
+    if (route == routes[i]) {
+      routes.splice(i, 1);
+      return true;
+    }
+  }
+};
+
+/**
+ * Return routes with route paths matching `path`.
+ *
+ * @param {String} method
+ * @param {String} path
+ * @return {Collection}
+ * @api public
+ */
+
+Router.prototype.lookup = function(method, path){
+  return this.find(function(route){
+    return path == route.path
+      && (route.method == method
+      || method == 'all');
+  });
+};
+
+/**
+ * Return routes with regexps that match the given `url`.
+ *
+ * @param {String} method
+ * @param {String} url
+ * @return {Collection}
+ * @api public
+ */
+
+Router.prototype.match = function(method, url){
+  return this.find(function(route){
+    return route.match(url)
+      && (route.method == method
+      || method == 'all');
+  });
+};
+
+/**
+ * Find routes based on the return value of `fn`
+ * which is invoked once per route.
+ *
+ * @param {Function} fn
+ * @return {Collection}
+ * @api public
+ */
+
+Router.prototype.find = function(fn){
+  var len = methods.length
+    , ret = new Collection(this)
+    , method
+    , routes
+    , route;
+
+  for (var i = 0; i < len; ++i) {
+    method = methods[i];
+    routes = this.routes[method];
+    if (!routes) continue;
+    for (var j = 0, jlen = routes.length; j < jlen; ++j) {
+      route = routes[j];
+      if (fn(route)) ret.push(route);
+    }
+  }
+
+  return ret;
+};
+
+/**
+ * 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;
+
+  // route dispatch
+  (function pass(i, err){
+    var paramCallbacks
+      , paramIndex = 0
+      , paramVal
+      , route
+      , keys
+      , key
+      , ret;
+
+    // match next route
+    function nextRoute(err) {
+      pass(req._route_index + 1, err);
+    }
+
+    // match route
+    req.route = route = self._match(req, i);
+
+    // implied OPTIONS
+    if (!route && 'OPTIONS' == req.method) return self._options(req, res);
+
+    // no route
+    if (!route) return next(err);
+
+    // 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) {
+          fn(req, res, callbacks);
+        } else {
+          nextRoute(err);
+        }
+      } catch (err) {
+        callbacks(err);
+      }
+    }
+  })(0);
+};
+
+/**
+ * Respond to __OPTIONS__ method.
+ *
+ * @param {IncomingMessage} req
+ * @param {ServerResponse} res
+ * @api private
+ */
+
+Router.prototype._options = function(req, res){
+  var path = parse(req.url).pathname
+    , body = this._optionsFor(path).join(',');
+  res.send(body, { Allow: body });
+};
+
+/**
+ * Return an array of HTTP verbs or "options" for `path`.
+ *
+ * @param {String} path
+ * @return {Array}
+ * @api private
+ */
+
+Router.prototype._optionsFor = function(path){
+  var self = this;
+  return methods.filter(function(method){
+    var routes = self.routes[method];
+    if (!routes || 'options' == method) return;
+    for (var i = 0, len = routes.length; i < len; ++i) {
+      if (routes[i].match(path)) return true;
+    }
+  }).map(function(method){
+    return method.toUpperCase();
+  });
+};
+
+/**
+ * Attempt to match a route for `req`
+ * starting from offset `i`.
+ *
+ * @param {IncomingMessage} req
+ * @param {Number} i
+ * @return {Route}
+ * @api private
+ */
+
+Router.prototype._match = function(req, i){
+  var method = req.method.toLowerCase()
+    , url = parse(req.url)
+    , path = url.pathname
+    , routes = this.routes
+    , captures
+    , route
+    , keys;
+
+  // pass HEAD to GET routes
+  if ('head' == method) method = 'get';
+
+  // routes for this method
+  if (routes = routes[method]) {
+
+    // matching routes
+    for (var len = routes.length; i < len; ++i) {
+      route = routes[i];
+      if (captures = route.match(path)) {
+        keys = route.keys;
+        route.params = [];
+
+        // params from capture groups
+        for (var j = 1, jlen = captures.length; j < jlen; ++j) {
+          var key = keys[j-1]
+            , val = 'string' == typeof captures[j]
+              ? decodeURIComponent(captures[j])
+              : captures[j];
+          if (key) {
+            route.params[key.name] = val;
+          } else {
+            route.params.push(val);
+          }
+        }
+
+        // all done
+        req._route_index = i;
+        return route;
+      }
+    }
+  }
+};
+
+/**
+ * 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 app = this.app
+    , callbacks = utils.flatten(toArray(arguments, 2));
+
+  // ensure path was given
+  if (!path) throw new Error('app.' + method + '() requires a path');
+
+  // create the route
+  var route = new Route(method, path, callbacks, {
+      sensitive: app.enabled('case sensitive routes')
+    , strict: app.enabled('strict routing')
+  });
+
+  // add it
+  (this.routes[method] = this.routes[method] || [])
+    .push(route);
+  return this;
+};
diff --git a/debian/node_modules/bones/node_modules/express/lib/router/methods.js b/debian/node_modules/bones/node_modules/express/lib/router/methods.js
new file mode 100644
index 0000000..71a969a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/lib/router/methods.js
@@ -0,0 +1,79 @@
+
+/*!
+ * Express - router - methods
+ * Copyright(c) 2010 TJ Holowaychuk <tj at vision-media.ca>
+ * MIT Licensed
+ */
+
+/**
+ * Hypertext Transfer Protocol -- HTTP/1.1 
+ * http://www.ietf.org/rfc/rfc2616.txt
+ */
+
+var RFC2616 = ['OPTIONS', 'GET', 'POST', 'PUT', 'DELETE', 'TRACE', 'CONNECT'];
+
+/**
+ * HTTP Extensions for Distributed Authoring -- WEBDAV
+ * http://www.ietf.org/rfc/rfc2518.txt
+ */
+
+var RFC2518 = ['PROPFIND', 'PROPPATCH', 'MKCOL', 'COPY', 'MOVE', 'LOCK', 'UNLOCK'];
+
+/**
+ * Versioning Extensions to WebDAV 
+ * http://www.ietf.org/rfc/rfc3253.txt
+ */
+
+var RFC3253 = ['VERSION-CONTROL', 'REPORT', 'CHECKOUT', 'CHECKIN', 'UNCHECKOUT', 'MKWORKSPACE', 'UPDATE', 'LABEL', 'MERGE', 'BASELINE-CONTROL', 'MKACTIVITY'];
+
+/**
+ * Ordered Collections Protocol (WebDAV) 
+ * http://www.ietf.org/rfc/rfc3648.txt
+ */
+
+var RFC3648 = ['ORDERPATCH'];
+
+/**
+ * Web Distributed Authoring and Versioning (WebDAV) Access Control Protocol 
+ * http://www.ietf.org/rfc/rfc3744.txt
+ */
+
+var RFC3744 = ['ACL'];
+
+/**
+ * Web Distributed Authoring and Versioning (WebDAV) SEARCH
+ * http://www.ietf.org/rfc/rfc5323.txt
+ */
+
+var RFC5323 = ['SEARCH'];
+
+/**
+ * PATCH Method for HTTP 
+ * http://www.ietf.org/rfc/rfc5789.txt
+ */
+
+var RFC5789 = ['PATCH'];
+
+/**
+ * PURGE Method for caching reverse-proxy
+ * http://wiki.squid-cache.org/SquidFaq/OperatingSquid#How_can_I_purge_an_object_from_my_cache.3F
+ * https://www.varnish-cache.org/docs/trunk/tutorial/purging.html
+ */
+
+var CACHE_PURGE = ['PURGE'];
+
+/**
+ * Expose the methods.
+ */
+
+module.exports = [].concat(
+    RFC2616
+  , RFC2518
+  , RFC3253
+  , RFC3648
+  , RFC3744
+  , RFC5323
+  , RFC5789
+  , CACHE_PURGE).map(function(method){
+    return method.toLowerCase();
+  });
diff --git a/debian/node_modules/bones/node_modules/express/lib/router/route.js b/debian/node_modules/bones/node_modules/express/lib/router/route.js
new file mode 100644
index 0000000..7f2965c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/lib/router/route.js
@@ -0,0 +1,88 @@
+
+/*!
+ * Express - router - Route
+ * Copyright(c) 2010 TJ Holowaychuk <tj at vision-media.ca>
+ * MIT Licensed
+ */
+
+/**
+ * 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 = normalize(path
+    , this.keys = []
+    , options.sensitive
+    , options.strict);
+}
+
+/**
+ * Check if this route matches `path` and return captures made.
+ *
+ * @param {String} path
+ * @return {Array}
+ * @api private
+ */
+
+Route.prototype.match = function(path){
+  return this.regexp.exec(path);
+};
+
+/**
+ * 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} path
+ * @param  {Array} keys
+ * @param  {Boolean} sensitive
+ * @param  {Boolean} strict
+ * @return {RegExp}
+ * @api private
+ */
+
+function normalize(path, keys, sensitive, strict) {
+  if (path instanceof RegExp) return path;
+  path = path
+    .concat(strict ? '' : '/?')
+    .replace(/\/\(/g, '(?:/')
+    .replace(/(\/)?(\.)?:(\w+)(?:(\(.*?\)))?(\?)?/g, function(_, slash, format, key, capture, optional){
+      keys.push({ name: key, optional: !! optional });
+      slash = slash || '';
+      return ''
+        + (optional ? '' : slash)
+        + '(?:'
+        + (optional ? slash : '')
+        + (format || '') + (capture || (format && '([^/.]+?)' || '([^/]+?)')) + ')'
+        + (optional || '');
+    })
+    .replace(/([\/.])/g, '\\$1')
+    .replace(/\*/g, '(.*)');
+  return new RegExp('^' + path + '$', sensitive ? '' : 'i');
+}
diff --git a/debian/node_modules/bones/node_modules/express/lib/utils.js b/debian/node_modules/bones/node_modules/express/lib/utils.js
new file mode 100644
index 0000000..d579f7c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/lib/utils.js
@@ -0,0 +1,152 @@
+
+/*!
+ * Express - Utils
+ * Copyright(c) 2010 TJ Holowaychuk <tj at vision-media.ca>
+ * MIT Licensed
+ */
+
+/**
+ * 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;
+};
+
+/**
+ * Merge object `b` with `a` giving precedence to
+ * values in object `a`.
+ *
+ * @param {Object} a
+ * @param {Object} b
+ * @return {Object} a
+ * @api private
+ */
+
+exports.union = function(a, b){
+  if (a && b) {
+    var keys = Object.keys(b)
+      , len = keys.length
+      , key;
+    for (var i = 0; i < len; ++i) {
+      key = keys[i];
+      if (!a.hasOwnProperty(key)) {
+        a[key] = b[key];
+      }
+    }
+  }
+  return a;
+};
+
+/**
+ * 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;
+};
+
+/**
+ * Parse mini markdown implementation.
+ * The following conversions are supported,
+ * primarily for the "flash" middleware:
+ *
+ *    _foo_ or *foo* become <em>foo</em>
+ *    __foo__ or **foo** become <strong>foo</strong>
+ *    [A](B) becomes <a href="B">A</a>
+ *
+ * @param {String} str
+ * @return {String}
+ * @api private
+ */
+
+exports.miniMarkdown = function(str){
+  return String(str)
+    .replace(/(__|\*\*)(.*?)\1/g, '<strong>$2</strong>')
+    .replace(/(_|\*)(.*?)\1/g, '<em>$2</em>')
+    .replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2">$1</a>');
+};
+
+/**
+ * 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, '<')
+    .replace(/>/g, '>');
+};
+
+/**
+ * Parse "Range" header `str` relative to the given file `size`.
+ *
+ * @param {Number} size
+ * @param {String} str
+ * @return {Array}
+ * @api private
+ */
+
+exports.parseRange = function(size, str){
+  var valid = true;
+  var arr = str.substr(6).split(',').map(function(range){
+    var range = range.split('-')
+      , start = parseInt(range[0], 10)
+      , end = parseInt(range[1], 10);
+
+    // -500
+    if (isNaN(start)) {
+      start = size - end;
+      end = size - 1;
+    // 500-
+    } else if (isNaN(end)) {
+      end = size - 1;
+    }
+
+    // Invalid
+    if (isNaN(start) || isNaN(end) || start > end) valid = false;
+
+    return { start: start, end: end };
+  });
+  return valid ? arr : undefined;
+};
+
+/**
+ * Fast alternative to `Array.prototype.slice.call()`.
+ *
+ * @param {Arguments} args
+ * @param {Number} n
+ * @return {Array}
+ * @api public
+ */
+
+exports.toArray = function(args, i){
+  var arr = []
+    , len = args.length
+    , i = i || 0;
+  for (; i < len; ++i) arr.push(args[i]);
+  return arr;
+};
diff --git a/debian/node_modules/bones/node_modules/express/lib/view.js b/debian/node_modules/bones/node_modules/express/lib/view.js
new file mode 100644
index 0000000..5258249
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/lib/view.js
@@ -0,0 +1,460 @@
+
+/*!
+ * Express - view
+ * Copyright(c) 2010 TJ Holowaychuk <tj at vision-media.ca>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var path = require('path')
+  , extname = path.extname
+  , dirname = path.dirname
+  , basename = path.basename
+  , utils = require('connect').utils
+  , View = require('./view/view')
+  , partial = require('./view/partial')
+  , union = require('./utils').union
+  , merge = utils.merge
+  , http = require('http')
+  , res = http.ServerResponse.prototype;
+
+/**
+ * Expose constructors.
+ */
+
+exports = module.exports = View;
+
+/**
+ * Export template engine registrar.
+ */
+
+exports.register = View.register;
+
+/**
+ * Lookup and compile `view` with cache support by supplying
+ * both the `cache` object and `cid` string,
+ * followed by `options` passed to `exports.lookup()`.
+ *
+ * @param {String} view
+ * @param {Object} cache
+ * @param {Object} cid
+ * @param {Object} options
+ * @return {View}
+ * @api private
+ */
+
+exports.compile = function(view, cache, cid, options){
+  if (cache && cid && cache[cid]){
+    options.filename = cache[cid].path;
+    return cache[cid];
+  }
+
+  // lookup
+  view = exports.lookup(view, options);
+
+  // hints
+  if (!view.exists) {
+    if (options.hint) hintAtViewPaths(view.original, options);
+    var err = new Error('failed to locate view "' + view.original.view + '"');
+    err.view = view.original;
+    throw err;
+  }
+
+  // compile
+  options.filename = view.path;
+  view.fn = view.templateEngine.compile(view.contents, options);
+  cache[cid] = view;
+
+  return view;
+};
+
+/**
+ * Lookup `view`, returning an instanceof `View`.
+ *
+ * Options:
+ *
+ *   - `root` root directory path
+ *   - `defaultEngine` default template engine
+ *   - `parentView` parent `View` object
+ *   - `cache` cache object
+ *   - `cacheid` optional cache id
+ *
+ * Lookup:
+ *
+ *   - partial `_<name>`
+ *   - any `<name>/index`
+ *   - non-layout `../<name>/index`
+ *   - any `<root>/<name>`
+ *   - partial `<root>/_<name>`
+ *
+ * @param {String} view
+ * @param {Object} options
+ * @return {View}
+ * @api private
+ */
+
+exports.lookup = function(view, options){
+  var orig = view = new View(view, options)
+    , partial = options.isPartial
+    , layout = options.isLayout;
+
+  // Try _ prefix ex: ./views/_<name>.jade
+  // taking precedence over the direct path
+  if (partial) {
+    view = new View(orig.prefixPath, options);
+    if (!view.exists) view = orig;
+  }
+
+  // Try index ex: ./views/user/index.jade
+  if (!layout && !view.exists) view = new View(orig.indexPath, options);
+
+  // Try ../<name>/index ex: ../user/index.jade
+  // when calling partial('user') within the same dir
+  if (!layout && !view.exists) view = new View(orig.upIndexPath, options);
+
+  // Try root ex: <root>/user.jade
+  if (!view.exists) view = new View(orig.rootPath, options);
+
+  // Try root _ prefix ex: <root>/_user.jade
+  if (!view.exists && partial) view = new View(view.prefixPath, options);
+
+  view.original = orig;
+  return view;
+};
+
+/**
+ * Partial render helper.
+ *
+ * @api private
+ */
+
+function renderPartial(res, view, options, parentLocals, parent){
+  var collection, object, locals;
+
+  if (options) {
+    // collection
+    if (options.collection) {
+      collection = options.collection;
+      delete options.collection;
+    } else if ('length' in options) {
+      collection = options;
+      options = {};
+    }
+
+    // locals
+    if (options.locals) {
+      locals = options.locals;
+      delete options.locals;
+    }
+
+    // object
+    if ('Object' != options.constructor.name) {
+      object = options;
+      options = {};
+    } else if (undefined != options.object) {
+      object = options.object;
+      delete options.object;
+    }
+  } else {
+    options = {};
+  }
+
+  // Inherit locals from parent
+  union(options, parentLocals);
+
+  // Merge locals
+  if (locals) merge(options, locals);
+
+  // Partials dont need layouts
+  options.isPartial = true;
+  options.layout = false;
+
+  // Deduce name from view path
+  var name = options.as || partial.resolveObjectName(view);
+
+  // Render partial
+  function render(){
+    if (object) {
+      if ('string' == typeof name) {
+        options[name] = object;
+      } else if (name === global) {
+        merge(options, object);
+      }
+    }
+    return res.render(view, options, null, parent, true);
+  }
+
+  // Collection support
+  if (collection) {
+    var len = collection.length
+      , buf = ''
+      , keys
+      , key
+      , val;
+
+    options.collectionLength = len;
+
+    if ('number' == typeof len || Array.isArray(collection)) {
+      for (var i = 0; i < len; ++i) {
+        val = collection[i];
+        options.firstInCollection = i == 0;
+        options.indexInCollection = i;
+        options.lastInCollection = i == len - 1;
+        object = val;
+        buf += render();
+      }
+    } else {
+      keys = Object.keys(collection);
+      len = keys.length;
+      options.collectionLength = len;
+      options.collectionKeys = keys;
+      for (var i = 0; i < len; ++i) {
+        key = keys[i];
+        val = collection[key];
+        options.keyInCollection = key;
+        options.firstInCollection = i == 0;
+        options.indexInCollection = i;
+        options.lastInCollection = i == len - 1;
+        object = val;
+        buf += render();
+      }
+    }
+
+    return buf;
+  } else {
+    return render();
+  }
+};
+
+/**
+ * Render `view` partial with the given `options`. Optionally a
+ * callback `fn(err, str)` may be passed instead of writing to
+ * the socket.
+ *
+ * Options:
+ *
+ *   - `object` Single object with name derived from the view (unless `as` is present)
+ *
+ *   - `as` Variable name for each `collection` value, defaults to the view name.
+ *     * as: 'something' will add the `something` local variable
+ *     * as: this will use the collection value as the template context
+ *     * as: global will merge the collection value's properties with `locals`
+ *
+ *   - `collection` Array of objects, the name is derived from the view name itself.
+ *     For example _video.html_ will have a object _video_ available to it.
+ *
+ * @param  {String} view
+ * @param  {Object|Array|Function} options, collection, callback, or object
+ * @param  {Function} fn
+ * @return {String}
+ * @api public
+ */
+
+res.partial = function(view, options, fn){
+  var app = this.app
+    , options = options || {}
+    , viewEngine = app.set('view engine')
+    , parent = {};
+
+  // accept callback as second argument
+  if ('function' == typeof options) {
+    fn = options;
+    options = {};
+  }
+
+  // root "views" option
+  parent.dirname = app.set('views') || process.cwd() + '/views';
+
+  // utilize "view engine" option
+  if (viewEngine) parent.engine = viewEngine;
+
+  // render the partial
+  try {
+    var str = renderPartial(this, view, options, null, parent);
+  } catch (err) {
+    if (fn) {
+      fn(err);
+    } else {
+      this.req.next(err);
+    }
+    return;
+  }
+
+  // callback or transfer
+  if (fn) {
+    fn(null, str);
+  } else {
+    this.send(str);
+  }
+};
+
+/**
+ * Render `view` with the given `options` and optional callback `fn`.
+ * When a callback function is given a response will _not_ be made
+ * automatically, however otherwise a response of _200_ and _text/html_ is given.
+ *
+ * Options:
+ *
+ *  - `scope`     Template evaluation context (the value of `this`)
+ *  - `debug`     Output debugging information
+ *  - `status`    Response status code
+ *
+ * @param  {String} view
+ * @param  {Object|Function} options or callback function
+ * @param  {Function} fn
+ * @api public
+ */
+
+res.render = function(view, opts, fn, parent, sub){
+  // support callback function as second arg
+  if ('function' == typeof opts) {
+    fn = opts, opts = null;
+  }
+
+  try {
+    return this._render(view, opts, fn, parent, sub);
+  } catch (err) {
+    // callback given
+    if (fn) {
+      fn(err);
+    // unwind to root call to prevent multiple callbacks
+    } else if (sub) {
+      throw err;
+    // root template, next(err)
+    } else {
+      this.req.next(err);
+    }
+  }
+};
+
+// private render()
+
+res._render = function(view, opts, fn, parent, sub){
+  var options = {}
+    , self = this
+    , app = this.app
+    , helpers = app._locals
+    , dynamicHelpers = app.dynamicViewHelpers
+    , viewOptions = app.set('view options')
+    , root = app.set('views') || process.cwd() + '/views';
+
+  // cache id
+  var cid = app.enabled('view cache')
+    ? view + (parent ? ':' + parent.path : '')
+    : false;
+
+  // merge "view options"
+  if (viewOptions) merge(options, viewOptions);
+
+  // merge res._locals
+  if (this._locals) merge(options, this._locals);
+
+  // merge render() options
+  if (opts) merge(options, opts);
+
+  // merge render() .locals
+  if (opts && opts.locals) merge(options, opts.locals);
+
+  // status support
+  if (options.status) this.statusCode = options.status;
+
+  // capture attempts
+  options.attempts = [];
+
+  var partial = options.isPartial
+    , layout = options.layout;
+
+  // Layout support
+  if (true === layout || undefined === layout) {
+    layout = 'layout';
+  }
+
+  // Default execution scope to a plain object
+  options.scope = options.scope || {};
+
+  // Populate view
+  options.parentView = parent;
+
+  // "views" setting
+  options.root = root;
+
+  // "view engine" setting
+  options.defaultEngine = app.set('view engine');
+
+  // charset option
+  if (options.charset) this.charset = options.charset;
+
+  // Dynamic helper support
+  if (false !== options.dynamicHelpers) {
+    // cache
+    if (!this.__dynamicHelpers) {
+      this.__dynamicHelpers = {};
+      for (var key in dynamicHelpers) {
+        this.__dynamicHelpers[key] = dynamicHelpers[key].call(
+            this.app
+          , this.req
+          , this);
+      }
+    }
+
+    // apply
+    merge(options, this.__dynamicHelpers);
+  }
+
+  // Merge view helpers
+  union(options, helpers);
+
+  // Always expose partial() as a local
+  options.partial = function(path, opts){
+    return renderPartial(self, path, opts, options, view);
+  };
+
+  // View lookup
+  options.hint = app.enabled('hints');
+  view = exports.compile(view, app.cache, cid, options);
+
+  // layout helper
+  options.layout = function(path){
+    layout = path;
+  };
+
+  // render
+  var str = view.fn.call(options.scope, options);
+
+  // layout expected
+  if (layout) {
+    options.isLayout = true;
+    options.layout = false;
+    options.body = str;
+    this.render(layout, options, fn, view, true);
+  // partial return
+  } else if (partial) {
+    return str;
+  // render complete, and
+  // callback given
+  } else if (fn) {
+    fn(null, str);
+  // respond
+  } else {
+    this.send(str);
+  }
+}
+
+/**
+ * Hint at view path resolution, outputting the
+ * paths that Express has tried.
+ *
+ * @api private
+ */
+
+function hintAtViewPaths(view, options) {
+  console.error();
+  console.error('failed to locate view "' + view.view + '", tried:');
+  options.attempts.forEach(function(path){
+    console.error('  - %s', path);
+  });
+  console.error();
+}
diff --git a/debian/node_modules/bones/node_modules/express/lib/view/partial.js b/debian/node_modules/bones/node_modules/express/lib/view/partial.js
new file mode 100644
index 0000000..7d2f69b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/lib/view/partial.js
@@ -0,0 +1,40 @@
+
+/*!
+ * Express - view - Partial
+ * Copyright(c) 2010 TJ Holowaychuk <tj at vision-media.ca>
+ * MIT Licensed
+ */
+
+/**
+ * Memory cache.
+ */
+
+var cache = {};
+
+/**
+ * Resolve partial object name from the view path.
+ *
+ * Examples:
+ *
+ *   "user.ejs" becomes "user"
+ *   "forum thread.ejs" becomes "forumThread"
+ *   "forum/thread/post.ejs" becomes "post"
+ *   "blog-post.ejs" becomes "blogPost"
+ *
+ * @return {String}
+ * @api private
+ */
+
+exports.resolveObjectName = function(view){
+  return cache[view] || (cache[view] = view
+    .split('/')
+    .slice(-1)[0]
+    .split('.')[0]
+    .replace(/^_/, '')
+    .replace(/[^a-zA-Z0-9 ]+/g, ' ')
+    .split(/ +/).map(function(word, i){
+      return i
+        ? word[0].toUpperCase() + word.substr(1)
+        : word;
+    }).join(''));
+};
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/lib/view/view.js b/debian/node_modules/bones/node_modules/express/lib/view/view.js
new file mode 100644
index 0000000..7d9392c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/lib/view/view.js
@@ -0,0 +1,210 @@
+
+/*!
+ * Express - View
+ * Copyright(c) 2010 TJ Holowaychuk <tj at vision-media.ca>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var path = require('path')
+  , utils = require('../utils')
+  , extname = path.extname
+  , dirname = path.dirname
+  , basename = path.basename
+  , fs = require('fs')
+  , stat = fs.statSync;
+
+/**
+ * Expose `View`.
+ */
+
+exports = module.exports = View;
+
+/**
+ * Require cache.
+ */
+
+var cache = {};
+
+/**
+ * Initialize a new `View` with the given `view` path and `options`.
+ *
+ * @param {String} view
+ * @param {Object} options
+ * @api private
+ */
+
+function View(view, options) {
+  options = options || {};
+  this.view = view;
+  this.root = options.root;
+  this.relative = false !== options.relative;
+  this.defaultEngine = options.defaultEngine;
+  this.parent = options.parentView;
+  this.basename = basename(view);
+  this.engine = this.resolveEngine();
+  this.extension = '.' + this.engine;
+  this.name = this.basename.replace(this.extension, '');
+  this.path = this.resolvePath();
+  this.dirname = dirname(this.path);
+  if (options.attempts) {
+    if (!~options.attempts.indexOf(this.path))
+      options.attempts.push(this.path);
+  }
+};
+
+/**
+ * Check if the view path exists.
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+View.prototype.__defineGetter__('exists', function(){
+  try {
+    stat(this.path);
+    return true;
+  } catch (err) {
+    return false;
+  }
+});
+
+/**
+ * Resolve view engine.
+ *
+ * @return {String}
+ * @api private
+ */
+
+View.prototype.resolveEngine = function(){
+  // Explicit
+  if (~this.basename.indexOf('.')) return extname(this.basename).substr(1);
+  // Inherit from parent
+  if (this.parent) return this.parent.engine;
+  // Default
+  return this.defaultEngine;
+};
+
+/**
+ * Resolve view path.
+ *
+ * @return {String}
+ * @api private
+ */
+
+View.prototype.resolvePath = function(){
+  var path = this.view;
+  // Implicit engine
+  if (!~this.basename.indexOf('.')) path += this.extension;
+  // Absolute
+  if (utils.isAbsolute(path)) return path;
+  // Relative to parent
+  if (this.relative && this.parent) return this.parent.dirname + '/' + path;
+  // Relative to root
+  return this.root
+    ? this.root + '/' + path
+    : path;
+};
+
+/**
+ * Get view contents. This is a one-time hit, so we
+ * can afford to be sync.
+ *
+ * @return {String}
+ * @api public
+ */
+
+View.prototype.__defineGetter__('contents', function(){
+  return fs.readFileSync(this.path, 'utf8');
+});
+
+/**
+ * Get template engine api, cache exports to reduce
+ * require() calls.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+View.prototype.__defineGetter__('templateEngine', function(){
+  var ext = this.extension;
+  return cache[ext] || (cache[ext] = require(this.engine));
+});
+
+/**
+ * Return root path alternative.
+ *
+ * @return {String}
+ * @api public
+ */
+
+View.prototype.__defineGetter__('rootPath', function(){
+  this.relative = false;
+  return this.resolvePath();
+});
+
+/**
+ * Return index path alternative.
+ *
+ * @return {String}
+ * @api public
+ */
+
+View.prototype.__defineGetter__('indexPath', function(){
+  return this.dirname
+    + '/' + this.basename.replace(this.extension, '')
+    + '/index' + this.extension;
+});
+
+/**
+ * Return ../<name>/index path alternative.
+ *
+ * @return {String}
+ * @api public
+ */
+
+View.prototype.__defineGetter__('upIndexPath', function(){
+  return this.dirname + '/../' + this.name + '/index' + this.extension;
+});
+
+/**
+ * Return _ prefix path alternative
+ *
+ * @return {String}
+ * @api public
+ */
+
+View.prototype.__defineGetter__('prefixPath', function(){
+  return this.dirname + '/_' + this.basename;
+});
+
+/**
+ * Register the given template engine `exports`
+ * as `ext`. For example we may wish to map ".html"
+ * files to jade:
+ *
+ *    app.register('.html', require('jade'));
+ *
+ * or
+ *
+ *    app.register('html', require('jade'));
+ *
+ * This is also useful for libraries that may not
+ * match extensions correctly. For example my haml.js
+ * library is installed from npm as "hamljs" so instead
+ * of layout.hamljs, we can register the engine as ".haml":
+ *
+ *    app.register('.haml', require('haml-js'));
+ *
+ * @param {String} ext
+ * @param {Object} obj
+ * @api public
+ */
+
+exports.register = function(ext, exports) {
+  if ('.' != ext[0]) ext = '.' + ext;
+  cache[ext] = exports;
+};
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/.npmignore b/debian/node_modules/bones/node_modules/express/node_modules/connect/.npmignore
new file mode 100644
index 0000000..b04a224
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/.npmignore
@@ -0,0 +1,11 @@
+*.markdown
+*.md
+.git*
+Makefile
+benchmarks/
+docs/
+examples/
+install.sh
+support/
+test/
+.DS_Store
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/LICENSE b/debian/node_modules/bones/node_modules/express/node_modules/connect/LICENSE
new file mode 100644
index 0000000..0c5d22d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/LICENSE
@@ -0,0 +1,24 @@
+(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/debian/node_modules/bones/node_modules/express/node_modules/connect/index.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/index.js
new file mode 100644
index 0000000..7477048
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/index.js
@@ -0,0 +1,2 @@
+
+module.exports = require('./lib/connect');
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/cache.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/cache.js
new file mode 100644
index 0000000..4aa026e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/cache.js
@@ -0,0 +1,81 @@
+
+/*!
+ * 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, invalid LRU
+  if (len > this.limit) this.remove(this.keys.shift());
+
+  var arr = this.store[key] = [];
+  arr.createdAt = new Date;
+  return arr;
+};
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/connect.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/connect.js
new file mode 100644
index 0000000..338d96f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/connect.js
@@ -0,0 +1,106 @@
+
+/*!
+ * Connect
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var HTTPServer = require('./http').Server
+  , HTTPSServer = require('./https').Server
+  , fs = require('fs');
+
+// node patches
+
+require('./patch');
+
+// expose createServer() as the module
+
+exports = module.exports = createServer;
+
+/**
+ * Framework version.
+ */
+
+exports.version = '1.9.2';
+
+/**
+ * Initialize a new `connect.HTTPServer` with the middleware
+ * passed to this function. When an object is passed _first_,
+ * we assume these are the tls options, and return a `connect.HTTPSServer`.
+ *
+ * Examples:
+ *
+ * An example HTTP server, accepting several middleware.
+ *
+ *     var server = connect.createServer(
+ *         connect.logger()
+ *       , connect.static(__dirname + '/public')
+ *     );
+ *
+ * An HTTPS server, utilizing the same middleware as above.
+ *
+ *     var server = connect.createServer(
+ *         { key: key, cert: cert }
+ *       , connect.logger()
+ *       , connect.static(__dirname + '/public')
+ *     );
+ *
+ * Alternatively with connect 1.0 we may omit `createServer()`.
+ *
+ *     connect(
+ *         connect.logger()
+ *       , connect.static(__dirname + '/public')
+ *     ).listen(3000);
+ *
+ * @param  {Object|Function} ...
+ * @return {Server}
+ * @api public
+ */
+
+function createServer() {
+  if ('object' == typeof arguments[0]) {
+    return new HTTPSServer(arguments[0], Array.prototype.slice.call(arguments, 1));
+  } else {
+    return new HTTPServer(Array.prototype.slice.call(arguments));
+  }
+};
+
+// support connect.createServer()
+
+exports.createServer = createServer;
+
+// auto-load getters
+
+exports.middleware = {};
+
+/**
+ * Auto-load bundled middleware with getters.
+ */
+
+fs.readdirSync(__dirname + '/middleware').forEach(function(filename){
+  if (/\.js$/.test(filename)) {
+    var name = filename.substr(0, filename.lastIndexOf('.'));
+    exports.middleware.__defineGetter__(name, function(){
+      return require('./middleware/' + name);
+    });
+  }
+});
+
+// expose utils
+
+exports.utils = require('./utils');
+
+// expose getters as first-class exports
+
+exports.utils.merge(exports, exports.middleware);
+
+// expose constructors
+
+exports.HTTPServer = HTTPServer;
+exports.HTTPSServer = HTTPSServer;
+
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/http.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/http.js
new file mode 100644
index 0000000..1d35f12
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/http.js
@@ -0,0 +1,218 @@
+
+/*!
+ * Connect - HTTPServer
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var http = require('http')
+  , parse = require('url').parse
+  , assert = require('assert')
+  , utils = require('./utils');
+
+// environment
+
+var env = process.env.NODE_ENV || 'development';
+
+/**
+ * Initialize a new `Server` with the given `middleware`.
+ *
+ * Examples:
+ *
+ *     var server = connect.createServer(
+ *         connect.favicon()
+ *       , connect.logger()
+ *       , connect.static(__dirname + '/public')
+ *     );
+ *
+ * @params {Array} middleware 
+ * @return {Server}
+ * @api public
+ */
+
+var Server = exports.Server = function HTTPServer(middleware) {
+  this.stack = [];
+  middleware.forEach(function(fn){
+    this.use(fn);
+  }, this);
+  http.Server.call(this, this.handle);
+};
+
+/**
+ * Inherit from `http.Server.prototype`.
+ */
+
+Server.prototype.__proto__ = http.Server.prototype;
+
+/**
+ * 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_.
+ *
+ * This is effectively the same as passing middleware to `connect.createServer()`,
+ * however provides a progressive api.
+ *
+ * Examples:
+ *
+ *      var server = connect.createServer();
+ *      server.use(connect.favicon());
+ *      server.use(connect.logger());
+ *      server.use(connect.static(__dirname + '/public'));
+ *
+ * If we wanted to prefix static files with _/public_, we could
+ * "mount" the `static()` middleware:
+ *
+ *      server.use('/public', connect.static(__dirname + '/public'));
+ *
+ * This api is chainable, meaning the following is valid:
+ *
+ *      connect.createServer()
+ *        .use(connect.favicon())
+ *        .use(connect.logger())
+ *        .use(connect.static(__dirname + '/public'))
+ *        .listen(3000);
+ *
+ * @param {String|Function} route or handle
+ * @param {Function} handle
+ * @return {Server}
+ * @api public
+ */
+
+Server.prototype.use = function(route, handle){
+  this.route = '/';
+
+  // default route to '/'
+  if ('string' != typeof route) {
+    handle = route;
+    route = '/';
+  }
+
+  // wrap sub-apps
+  if ('function' == typeof handle.handle) {
+    var server = handle;
+    server.route = route;
+    handle = function(req, res, next) {
+      server.handle(req, res, next);
+    };
+  }
+
+  // wrap vanilla http.Servers
+  if (handle instanceof http.Server) {
+    handle = handle.listeners('request')[0];
+  }
+
+  // normalize route to not trail with slash
+  if ('/' == route[route.length - 1]) {
+    route = route.substr(0, route.length - 1);
+  }
+
+  // add the middleware
+  this.stack.push({ route: route, handle: handle });
+
+  // allow chaining
+  return this;
+};
+
+/**
+ * Handle server requests, punting them down
+ * the middleware stack.
+ *
+ * @api private
+ */
+
+Server.prototype.handle = function(req, res, out) {
+  var writeHead = res.writeHead
+    , stack = this.stack
+    , removed = ''
+    , index = 0;
+
+  function next(err) {
+    var layer, path, c;
+    req.url = removed + req.url;
+    req.originalUrl = req.originalUrl || req.url;
+    removed = '';
+
+    layer = stack[index++];
+
+    // all done
+    if (!layer || res.headerSent) {
+      // but wait! we have a parent
+      if (out) return out(err);
+
+      // error
+      if (err) {
+        var msg = 'production' == env
+          ? 'Internal Server Error'
+          : err.stack || err.toString();
+
+        // output to stderr in a non-test env
+        if ('test' != env) console.error(err.stack || err.toString());
+
+        // unable to respond
+        if (res.headerSent) return req.socket.destroy();
+
+        res.statusCode = 500;
+        res.setHeader('Content-Type', 'text/plain');
+        if ('HEAD' == req.method) return res.end();
+        res.end(msg);
+      } else {
+        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 = parse(req.url).pathname;
+      if (undefined == path) path = '/';
+
+      // skip this layer if the route doesn't match.
+      if (0 != path.indexOf(layer.route)) 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 ('/' != req.url[0]) req.url = '/' + req.url;
+
+      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) {
+      if (e instanceof assert.AssertionError) {
+        console.error(e.stack + '\n');
+        next(e);
+      } else {
+        next(e);
+      }
+    }
+  }
+  next();
+};
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/https.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/https.js
new file mode 100644
index 0000000..9b09fa4
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/https.js
@@ -0,0 +1,47 @@
+
+/*!
+ * Connect - HTTPServer
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var HTTPServer = require('./http').Server
+  , https = require('https');
+
+/**
+ * Initialize a new `Server` with the given
+ *`options` and `middleware`. The HTTPS api
+ * is identical to the [HTTP](http.html) server,
+ * however TLS `options` must be provided before
+ * passing in the optional middleware.
+ *
+ * @params {Object} options
+ * @params {Array} middleawre
+ * @return {Server}
+ * @api public
+ */
+
+var Server = exports.Server = function HTTPSServer(options, middleware) {
+  this.stack = [];
+  middleware.forEach(function(fn){
+    this.use(fn);
+  }, this);
+  https.Server.call(this, options, this.handle);
+};
+
+/**
+ * Inherit from `http.Server.prototype`.
+ */
+
+Server.prototype.__proto__ = https.Server.prototype;
+
+// mixin HTTPServer methods
+
+Object.keys(HTTPServer.prototype).forEach(function(method){
+  Server.prototype[method] = HTTPServer.prototype[method];
+});
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/index.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/index.js
new file mode 100644
index 0000000..77b14c3
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/index.js
@@ -0,0 +1,46 @@
+
+/**
+ * # Connect
+ *
+ * Connect is a middleware framework for node,
+ * shipping with over 11 bundled middleware and a rich choice of
+ * [3rd-party middleware](https://github.com/senchalabs/connect/wiki).
+ *
+ * Installation:
+ * 
+ *     $ npm install connect
+ * 
+ * API:
+ *
+ *  - [connect](connect.html) general
+ *  - [http](http.html) http server
+ *  - [https](https.html) https server
+ *
+ * Middleware:
+ *
+ *  - [logger](middleware-logger.html) request logger with custom format support
+ *  - [csrf](middleware-csrf.html) Cross-site request forgery protection
+ *  - [basicAuth](middleware-basicAuth.html) basic http authentication
+ *  - [bodyParser](middleware-bodyParser.html) extensible request body parser
+ *  - [cookieParser](middleware-cookieParser.html) cookie parser
+ *  - [session](middleware-session.html) session management support with bundled [MemoryStore](middleware-session-memory.html)
+ *  - [compiler](middleware-compiler.html) static asset compiler (sass, less, coffee-script, etc)
+ *  - [methodOverride](middleware-methodOverride.html) faux HTTP method support
+ *  - [responseTime](middleware-responseTime.html) calculates response-time and exposes via X-Response-Time
+ *  - [router](middleware-router.html) provides rich Sinatra / Express-like routing
+ *  - [staticCache](middleware-staticCache.html) memory cache layer for the static() middleware
+ *  - [static](middleware-static.html) streaming static file server supporting `Range` and more
+ *  - [directory](middleware-directory.html) directory listing middleware
+ *  - [vhost](middleware-vhost.html) virtual host sub-domain mapping middleware
+ *  - [favicon](middleware-favicon.html) efficient favicon server (with default icon)
+ *  - [limit](middleware-limit.html) limit the bytesize of request bodies
+ *  - [profiler](middleware-profiler.html) request profiler reporting response-time, memory usage, etc
+ *  - [query](middleware-query.html) automatic querystring parser, populating `req.query`
+ *  - [errorHandler](middleware-errorHandler.html) flexible error handler
+ *
+ * Internals:
+ *
+ *  - connect [utilities](utils.html)
+ *  - node monkey [patches](patch.html)
+ *
+ */
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/basicAuth.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/basicAuth.js
new file mode 100644
index 0000000..3ff472b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/basicAuth.js
@@ -0,0 +1,93 @@
+
+/*!
+ * Connect - basicAuth
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var utils = require('../utils')
+  , unauthorized = utils.unauthorized
+  , badRequest = utils.badRequest;
+
+/**
+ * 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.remoteUser`. The final alternative is simply passing username / password
+ * strings.
+ *
+ * Examples:
+ *
+ *     connect(connect.basicAuth('username', 'password'));
+ *
+ *     connect(
+ *       connect.basicAuth(function(user, pass){
+ *         return 'tj' == user & 'wahoo' == pass;
+ *       })
+ *     );
+ *
+ *     connect(
+ *       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.remoteUser) return next();
+    if (!authorization) return unauthorized(res, realm);
+
+    var parts = authorization.split(' ')
+      , scheme = parts[0]
+      , credentials = new Buffer(parts[1], 'base64').toString().split(':');
+
+    if ('Basic' != scheme) return badRequest(res);
+
+    // async
+    if (callback.length >= 3) {
+      var pause = utils.pause(req);
+      callback(credentials[0], credentials[1], function(err, user){
+        if (err || !user)  return unauthorized(res, realm);
+        req.remoteUser = user;
+        next();
+        pause.resume();
+      });
+    // sync
+    } else {
+      if (callback(credentials[0], credentials[1])) {
+        req.remoteUser = credentials[0];
+        next();
+      } else {
+        unauthorized(res, realm);
+      }
+    }
+  }
+};
+
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js
new file mode 100644
index 0000000..a52568c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js
@@ -0,0 +1,196 @@
+
+/*!
+ * Connect - bodyParser
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var qs = require('qs')
+  , formidable = require('formidable');
+
+/**
+ * Extract the mime type from the given request's
+ * _Content-Type_ header.
+ *
+ * @param  {IncomingMessage} req
+ * @return {String}
+ * @api private
+ */
+
+function mime(req) {
+  var str = req.headers['content-type'] || '';
+  return str.split(';')[0];
+}
+
+/**
+ * Parse request bodies.
+ *
+ * By default _application/json_, _application/x-www-form-urlencoded_,
+ * and _multipart/form-data_ are supported, however you may map `connect.bodyParser.parse[contentType]`
+ * to a function receiving `(req, options, callback)`.
+ *
+ * Examples:
+ *
+ *      connect.createServer(
+ *          connect.bodyParser()
+ *        , function(req, res) {
+ *          res.end('viewing user ' + req.body.user.name);
+ *        }
+ *      );
+ *
+ *      $ curl -d 'user[name]=tj' http://localhost/
+ *      $ curl -d '{"user":{"name":"tj"}}' -H "Content-Type: application/json" http://localhost/
+ *
+ * Multipart req.files:
+ *
+ *   As a security measure files are stored in a separate object, stored
+ *   as `req.files`. This prevents attacks that may potentially alter
+ *   filenames, and depending on the application gain access to restricted files.
+ *
+ * Multipart configuration:
+ *
+ *  The `options` passed are provided to each parser function.
+ *  The _multipart/form-data_ parser merges these with formidable's
+ *  IncomingForm object, allowing you to tweak the upload directory,
+ *  size limits, etc. For example you may wish to retain the file extension
+ *  and change the upload directory:
+ *
+ *      server.use(bodyParser({ uploadDir: '/www/mysite.com/uploads' }));
+ *
+ *  View [node-formidable](https://github.com/felixge/node-formidable) for more information.
+ *
+ *  If you wish to use formidable directly within your app, and do not
+ *  desire this behaviour for multipart requests simply remove the
+ *  parser: 
+ *
+ *     delete connect.bodyParser.parse['multipart/form-data'];
+ *
+ *  Or
+ *
+ *     delete express.bodyParser.parse['multipart/form-data'];
+ *
+ * @param {Object} options
+ * @return {Function}
+ * @api public
+ */
+
+exports = module.exports = function bodyParser(options){
+  options = options || {};
+  return function bodyParser(req, res, next) {
+    if (req.body) return next();
+    req.body = {};
+
+    if ('GET' == req.method || 'HEAD' == req.method) return next();
+    var parser = exports.parse[mime(req)];
+    if (parser) {
+      parser(req, options, next);
+    } else {
+      next();
+    }
+  }
+};
+
+/**
+ * Parsers.
+ */
+
+exports.parse = {};
+
+/**
+ * Parse application/x-www-form-urlencoded.
+ */
+
+exports.parse['application/x-www-form-urlencoded'] = function(req, options, fn){
+  var buf = '';
+  req.setEncoding('utf8');
+  req.on('data', function(chunk){ buf += chunk });
+  req.on('end', function(){
+    try {
+      req.body = buf.length
+        ? qs.parse(buf)
+        : {};
+      fn();
+    } catch (err){
+      fn(err);
+    }
+  });
+};
+
+/**
+ * Parse application/json.
+ */
+
+exports.parse['application/json'] = function(req, options, fn){
+  var buf = '';
+  req.setEncoding('utf8');
+  req.on('data', function(chunk){ buf += chunk });
+  req.on('end', function(){
+    try {
+      req.body = buf.length
+        ? JSON.parse(buf)
+        : {};
+      fn();
+    } catch (err){
+      fn(err);
+    }
+  });
+};
+
+/**
+ * Parse multipart/form-data.
+ *
+ * TODO: make multiple support optional
+ * TODO: revisit "error" flag if it's a formidable bug
+ */
+
+exports.parse['multipart/form-data'] = function(req, options, fn){
+  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){
+    fn(err);
+    done = true;
+  });
+
+  form.on('end', function(){
+    if (done) return;
+    try {
+      req.body = qs.parse(data);
+      req.files = qs.parse(files);
+      fn();
+    } catch (err) {
+      fn(err);
+    }
+  });
+
+  form.parse(req);
+};
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/compiler.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/compiler.js
new file mode 100644
index 0000000..dc4dd66
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/compiler.js
@@ -0,0 +1,163 @@
+
+/*!
+ * Connect - compiler
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var fs = require('fs')
+  , path = require('path')
+  , parse = require('url').parse;
+
+/**
+ * Require cache.
+ */
+
+var cache = {};
+
+/**
+ * Setup compiler.
+ *
+ * Options:
+ *
+ *   - `src`     Source directory, defaults to **CWD**.
+ *   - `dest`    Destination directory, defaults `src`.
+ *   - `enable`  Array of enabled compilers.
+ *
+ * Compilers:
+ *
+ *   - `sass`   Compiles sass to css
+ *   - `less`   Compiles less to css
+ *   - `coffeescript`   Compiles coffee to js
+ *
+ * @param {Object} options
+ * @api public
+ */
+
+exports = module.exports = function compiler(options){
+  options = options || {};
+
+  var srcDir = options.src || process.cwd()
+    , destDir = options.dest || srcDir
+    , enable = options.enable;
+
+  if (!enable || enable.length === 0) {
+    throw new Error('compiler\'s "enable" option is not set, nothing will be compiled.');
+  }
+
+  return function compiler(req, res, next){
+    if ('GET' != req.method) return next();
+    var pathname = parse(req.url).pathname;
+    for (var i = 0, len = enable.length; i < len; ++i) {
+      var name = enable[i]
+        , compiler = compilers[name];
+      if (compiler.match.test(pathname)) {
+        var src = (srcDir + pathname).replace(compiler.match, compiler.ext)
+          , dest = destDir + pathname;
+
+        // Compare mtimes
+        fs.stat(src, function(err, srcStats){
+          if (err) {
+            if ('ENOENT' == err.code) {
+              next();
+            } else {
+              next(err);
+            }
+          } else {
+            fs.stat(dest, function(err, destStats){
+              if (err) {
+                // Oh snap! it does not exist, compile it
+                if ('ENOENT' == err.code) {
+                  compile();
+                } else {
+                  next(err);
+                }
+              } else {
+                // Source has changed, compile it
+                if (srcStats.mtime > destStats.mtime) {
+                  compile();
+                } else {
+                  // Defer file serving
+                  next();
+                }
+              }
+            });
+          }
+        });
+
+        // Compile to the destination
+        function compile() {
+          fs.readFile(src, 'utf8', function(err, str){
+            if (err) {
+              next(err);
+            } else {
+              compiler.compile(str, function(err, str){
+                if (err) {
+                  next(err);
+                } else {
+                  fs.writeFile(dest, str, 'utf8', function(err){
+                    next(err);
+                  });
+                }
+              });
+            }
+          });
+        }
+        return;
+      }
+    }
+    next();
+  };
+};
+
+/**
+ * Bundled compilers:
+ *
+ *  - [sass](http://github.com/visionmedia/sass.js) to _css_
+ *  - [less](http://github.com/cloudhead/less.js) to _css_
+ *  - [coffee](http://github.com/jashkenas/coffee-script) to _js_
+ */
+
+var compilers = exports.compilers = {
+  sass: {
+    match: /\.css$/,
+    ext: '.sass',
+    compile: function(str, fn){
+      var sass = cache.sass || (cache.sass = require('sass'));
+      try {
+        fn(null, sass.render(str));
+      } catch (err) {
+        fn(err);
+      }
+    }
+  },
+  less: {
+    match: /\.css$/,
+    ext: '.less',
+    compile: function(str, fn){
+      var less = cache.less || (cache.less = require('less'));
+      try {
+        less.render(str, fn);
+      } catch (err) {
+        fn(err);
+      }
+    }
+  },
+  coffeescript: {
+    match: /\.js$/,
+    ext: '.coffee',
+    compile: function(str, fn){
+      var coffee = cache.coffee || (cache.coffee = require('coffee-script'));
+      try {
+        fn(null, coffee.compile(str));
+      } catch (err) {
+        fn(err);
+      }
+    }
+  }
+};
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/compress.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/compress.js
new file mode 100644
index 0000000..addc5c9
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/compress.js
@@ -0,0 +1,146 @@
+
+/*!
+ * Connect - compress
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * Copyright(c) 2012 Nebojsa Sabovic
+ * 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){
+  var type = res.getHeader('Content-Type') || '';
+  return type.match(/json|text|javascript/);
+};
+
+/**
+ * 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){
+ *       var type = res.getHeader('Content-Type') || '';
+ *       return type.match(/json|text|javascript/);
+ *     };
+ *
+ * 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) {
+  var options = options || {}
+    , names = Object.keys(exports.methods)
+    , filter = options.filter || exports.filter;
+
+  return function(req, res, next){
+    var accept = req.headers['accept-encoding']
+      , write = res.write
+      , writeHead = res.writeHead
+      , end = res.end
+      , stream
+      , method;
+
+    // vary
+    res.setHeader('Vary', 'Accept-Encoding');
+
+    // proxy
+
+    res.write = function(chunk, encoding){
+      if (!this._header) this._implicitHeader();
+      return stream
+        ? stream.write(chunk, encoding)
+        : write.call(this, chunk, encoding);
+    };
+
+    res.end = function(chunk, encoding){
+      if (!this._header) {
+        this._implicitHeader();
+      }
+      if (chunk) this.write(chunk, encoding);
+      return stream
+        ? stream.end()
+        : end.call(this);
+    };
+
+    res.writeHead = function(){
+      res.writeHead = writeHead;
+
+      // default request filter, SHOULD use identity, head
+      if (filter(req, res) && accept && 'HEAD' != req.method) {
+        // default to gzip
+        if ('*' == accept.trim()) {
+          method = 'gzip';
+        } else {
+          for (var i = 0, len = names.length; i < len; ++i) {
+            if (~accept.indexOf(names[i])) {
+              method = names[i];
+              break;
+            }
+          }
+        }
+
+        // compression method
+        if (method) {
+          // compression stream
+          stream = exports.methods[method](options);
+
+          // header fields
+          res.setHeader('Content-Encoding', method);
+          res.removeHeader('Content-Length');
+          // WARNING: We do not strip content-length out of passed-in headers
+
+          // compression
+          stream.on('data', function(chunk){
+            write.call(res, chunk);
+          });
+
+          stream.on('end', function(){
+            end.call(res);
+          });
+
+          stream.on('drain', function() {
+            res.emit('drain');
+          });
+        }
+      }
+      return res.writeHead.apply(this, arguments);
+    };
+
+    next();
+  };
+}
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/cookieParser.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/cookieParser.js
new file mode 100644
index 0000000..d6b69de
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/cookieParser.js
@@ -0,0 +1,46 @@
+
+/*!
+ * Connect - cookieParser
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var utils = require('./../utils');
+
+/**
+ * Parse _Cookie_ header and populate `req.cookies`
+ * with an object keyed by the cookie names.
+ *
+ * Examples:
+ *
+ *     connect.createServer(
+ *         connect.cookieParser()
+ *       , function(req, res, next){
+ *         res.end(JSON.stringify(req.cookies));
+ *       }
+ *     );
+ *
+ * @return {Function}
+ * @api public
+ */
+
+module.exports = function cookieParser(){
+  return function cookieParser(req, res, next) {
+    var cookie = req.headers.cookie;
+    if (req.cookies) return next();
+    req.cookies = {};
+    if (cookie) {
+      try {
+        req.cookies = utils.parseCookie(cookie);
+      } catch (err) {
+        return next(err);
+      }
+    }
+    next();
+  };
+};
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/csrf.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/csrf.js
new file mode 100644
index 0000000..53347e7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/csrf.js
@@ -0,0 +1,105 @@
+
+/*!
+ * Connect - csrf
+ * Copyright(c) 2011 Sencha Inc.
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var utils = require('../utils')
+  , crypto = require('crypto');
+
+/**
+ * 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 which is re-generated per request.
+ *
+ * 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()`.
+ *
+ * Examples:
+ *
+ *      var form = '\n\
+ *        <form action="/" method="post">\n\
+ *          <input type="hidden" name="_csrf" value="{token}" />\n\
+ *          <input type="text" name="user[name]" value="{user}" />\n\
+ *          <input type="password" name="user[pass]" />\n\
+ *          <input type="submit" value="Login" />\n\
+ *        </form>\n\
+ *      '; 
+ *      
+ *      connect(
+ *          connect.cookieParser()
+ *        , connect.session({ secret: 'keyboard cat' })
+ *        , connect.bodyParser()
+ *        , connect.csrf()
+ *      
+ *        , function(req, res, next){
+ *          if ('POST' != req.method) return next();
+ *          req.session.user = req.body.user;
+ *          next();
+ *        }
+ *      
+ *        , function(req, res){
+ *          res.setHeader('Content-Type', 'text/html');
+ *          var body = form
+ *            .replace('{token}', req.session._csrf)
+ *            .replace('{user}', req.session.user && req.session.user.name || '');
+ *          res.end(body);
+ *        }
+ *      ).listen(3000);
+ *
+ * Options:
+ *
+ *    - `value` a function accepting the request, returning the token 
+ *
+ * @param {Object} options
+ * @api public
+ */
+
+module.exports = function csrf(options) {
+  var options = options || {}
+    , value = options.value || defaultValue;
+
+  return function(req, res, next){
+    // generate CSRF token
+    var token = req.session._csrf || (req.session._csrf = utils.uid(24));
+
+    // ignore GET (for now)
+    if ('GET' == req.method || 'HEAD' == req.method || 'OPTIONS' == req.method) return next();
+
+    // determine value
+    var val = value(req);
+
+    // check
+    if (val != token) return utils.forbidden(res);
+    
+    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']);
+}
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/directory.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/directory.js
new file mode 100644
index 0000000..df5b5e6
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/directory.js
@@ -0,0 +1,222 @@
+
+/*!
+ * 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 = {};
+
+/**
+ * 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) {
+    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)
+    if (~path.indexOf('\0')) return utils.badRequest(res);
+
+    // malicious path
+    if (0 != path.indexOf(root)) return utils.forbidden(res);
+
+    // 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;
+          }
+        }
+        utils.notAcceptable(res);
+      });
+    });
+  };
+};
+
+/**
+ * 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/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/errorHandler.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/errorHandler.js
new file mode 100644
index 0000000..f2fc44f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/errorHandler.js
@@ -0,0 +1,100 @@
+/*!
+ * Connect - errorHandler
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var utils = require('../utils')
+  , url = require('url')
+  , fs = require('fs');
+
+/**
+ * Flexible error handler, providing (_optional_) stack traces
+ * and error message responses for requests accepting text, html,
+ * or json.
+ *
+ * Options:
+ *
+ *   - `showStack`, `stack` respond with both the error message and stack trace. Defaults to `false`
+ *   - `showMessage`, `message`, respond with the exception message only. Defaults to `false`
+ *   - `dumpExceptions`, `dump`, dump exceptions to stderr (without terminating the process). Defaults to `false`
+ *
+ * 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.
+ *
+ * @param {Object} options
+ * @return {Function}
+ * @api public
+ */
+
+exports = module.exports = function errorHandler(options){
+  options = options || {};
+
+  // defaults
+  var showStack = options.showStack || options.stack
+    , showMessage = options.showMessage || options.message
+    , dumpExceptions = options.dumpExceptions || options.dump
+    , formatUrl = options.formatUrl;
+
+  return function errorHandler(err, req, res, next){
+    res.statusCode = 500;
+    if (dumpExceptions) console.error(err.stack);
+    if (showStack) {
+      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(/\{error\}/g, utils.escape(err.toString()));
+              res.setHeader('Content-Type', 'text/html');
+              res.end(html);
+          });
+        });
+      // json
+      } else if (~accept.indexOf('json')) {
+        var json = JSON.stringify({ error: err });
+        res.setHeader('Content-Type', 'application/json');
+        res.end(json);
+      // plain text
+      } else {
+        res.writeHead(500, { 'Content-Type': 'text/plain' });
+        res.end(err.stack);
+      }
+    } else {
+      var body = showMessage
+        ? err.toString()
+        : 'Internal Server Error';
+      res.setHeader('Content-Type', 'text/plain');
+      res.end(body);
+    }
+  };
+};
+
+/**
+ * Template title.
+ */
+
+exports.title = 'Connect';
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/favicon.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/favicon.js
new file mode 100644
index 0000000..8eeafba
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/favicon.js
@@ -0,0 +1,76 @@
+
+/*!
+ * Connect - favicon
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var fs = require('fs')
+  , utils = require('../utils');
+
+/**
+ * Favicon cache.
+ */
+
+var icon;
+
+/**
+ * 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:
+ *
+ *     connect.createServer(
+ *       connect.favicon()    
+ *     );
+ *
+ *     connect.createServer(
+ *       connect.favicon(__dirname + '/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;
+
+  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();
+    }
+  };
+};
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/limit.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/limit.js
new file mode 100644
index 0000000..a604ffb
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/limit.js
@@ -0,0 +1,80 @@
+
+/*!
+ * Connect - limit
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+/**
+ * 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.
+ *
+ * Examples:
+ *
+ *     var server = connect(
+ *       connect.limit('5.5mb')
+ *     ).listen(3000);
+ *
+ * @param {Number|String} bytes
+ * @return {Function}
+ * @api public
+ */
+
+module.exports = function limit(bytes){
+  if ('string' == typeof bytes) bytes = parse(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;
+
+    // deny the request
+    function deny() {
+      req.destroy();
+    }
+
+    // self-awareness
+    if (req._limit) return next();
+    req._limit = true;
+
+    // limit by content-length
+    if (len && len > bytes) {
+      res.statusCode = 413;
+      res.end('Request Entity Too Large');
+      return;
+    }
+
+    // limit
+    req.on('data', function(chunk){
+      received += chunk.length;
+      if (received > bytes) deny();
+    });
+
+    next();
+  };
+};
+
+/**
+ * Parse byte `size` string.
+ *
+ * @param {String} size
+ * @return {Number}
+ * @api private
+ */
+
+function parse(size) {
+  var parts = size.match(/^(\d+(?:\.\d+)?) *(kb|mb|gb)$/)
+    , n = parseFloat(parts[1])
+    , type = parts[2];
+
+  var map = {
+      kb: 1024
+    , mb: 1024 * 1024
+    , gb: 1024 * 1024 * 1024
+  };
+
+  return map[type] * n;
+}
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/logger.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/logger.js
new file mode 100644
index 0000000..75cc5aa
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/logger.js
@@ -0,0 +1,299 @@
+
+/*!
+ * Connect - logger
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+/**
+ * Log buffer.
+ */
+
+var buf = [];
+
+/**
+ * Default log buffer duration.
+ */
+
+var defaultBufferDuration = 1000;
+
+/**
+ * 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('dev')
+ *      connect.logger(':method :url - :referrer')
+ *      connect.logger(':req[content-type] -> :res[content-type]')
+ *      connect.logger(function(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(''), 'ascii');
+        buf.length = 0;
+      }
+    }, interval); 
+
+    // swap the stream
+    stream = {
+      write: function(str){
+        buf.push(str);
+      }
+    };
+  }
+
+  return function logger(req, res, next) {
+    req._startTime = new Date;
+
+    // mount safety
+    if (req._logging) return next();
+
+    // flag as logging
+    req._logging = true;
+
+    // immediate
+    if (immediate) {
+      var line = fmt(exports, req, res);
+      if (null == line) return;
+      stream.write(line + '\n', 'ascii');
+    } else {
+      // proxy end to output loggging
+      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', 'ascii');
+      };
+    }
+
+
+    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
+    , color = 32;
+
+  if (status >= 500) color = 31
+  else if (status >= 400) color = 33
+  else if (status >= 300) color = 36;
+
+  return '\033[90m' + req.method
+    + ' ' + req.originalUrl + ' '
+    + '\033[' + color + 'm' + res.statusCode
+    + ' \033[90m'
+    + (new Date - req._startTime)
+    + 'ms\033[0m';
+});
+
+// request url
+
+exports.token('url', function(req){
+  return req.originalUrl;
+});
+
+// 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){
+  return req.socket && (req.socket.remoteAddress || (req.socket.socket && req.socket.socket.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/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/methodOverride.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/methodOverride.js
new file mode 100644
index 0000000..db4e9f3
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/methodOverride.js
@@ -0,0 +1,38 @@
+
+/*!
+ * Connect - methodOverride
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+/**
+ * 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/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/profiler.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/profiler.js
new file mode 100644
index 0000000..b0b5bac
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/profiler.js
@@ -0,0 +1,100 @@
+
+/*!
+ * Connect - profiler
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+/**
+ * Profile the duration of a request.
+ *
+ * Typically this middleware should be utilized
+ * _above_ all others, as it proxies the `res.end()`
+ * method, being first allows it to encapsulate all
+ * other middleware.
+ *
+ * Example Output:
+ *
+ *      GET /
+ *      response time 2ms
+ *      memory rss 52.00kb
+ *      memory vsize 2.07mb
+ *      heap before 3.76mb / 8.15mb
+ *      heap after 3.80mb / 8.15mb
+ *
+ * @api public
+ */
+
+module.exports = function profiler(){
+  return function(req, res, next){
+    var end = res.end
+      , start = snapshot();
+
+    // state snapshot
+    function snapshot() {
+      return {
+          mem: process.memoryUsage()
+        , time: new Date
+      };
+    }
+
+    // proxy res.end()
+    res.end = function(data, encoding){
+      res.end = end;
+      res.end(data, encoding);
+      compare(req, start, snapshot())
+    };
+
+    next();
+  }
+};
+
+/**
+ * Compare `start` / `end` snapshots.
+ *
+ * @param {IncomingRequest} req
+ * @param {Object} start
+ * @param {Object} end
+ * @api private
+ */
+
+function compare(req, start, end) {
+  console.log();
+  row(req.method, req.url);
+  row('response time:', (end.time - start.time) + 'ms');
+  row('memory rss:', formatBytes(end.mem.rss - start.mem.rss));
+  row('memory vsize:', formatBytes(end.mem.vsize - start.mem.vsize));
+  row('heap before:', formatBytes(start.mem.heapUsed) + ' / ' + formatBytes(start.mem.heapTotal));
+  row('heap after:', formatBytes(end.mem.heapUsed) + ' / ' + formatBytes(end.mem.heapTotal));
+  console.log();
+}
+
+/**
+ * Row helper
+ *
+ * @param {String} key
+ * @param {String} val
+ * @api private
+ */
+
+function row(key, val) {
+  console.log('  \033[90m%s\033[0m \033[36m%s\033[0m', key, val);
+}
+
+/**
+ * Format byte-size.
+ *
+ * @param {Number} bytes
+ * @return {String}
+ * @api private
+ */
+
+function formatBytes(bytes) {
+  var kb = 1024
+    , mb = 1024 * kb
+    , gb = 1024 * mb;
+  if (bytes < kb) return bytes + 'b';
+  if (bytes < mb) return (bytes / kb).toFixed(2) + 'kb';
+  if (bytes < gb) return (bytes / mb).toFixed(2) + 'mb';
+  return (bytes / gb).toFixed(2) + 'gb';
+};
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/query.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/query.js
new file mode 100644
index 0000000..d3b1acd
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/query.js
@@ -0,0 +1,40 @@
+
+/*!
+ * Connect - query
+ * Copyright(c) 2011 TJ Holowaychuk
+ * Copyright(c) 2011 Sencha Inc.
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var qs = require('qs')
+  , parse = require('url').parse;
+
+/**
+ * Automatically parse the query-string when available,
+ * populating the `req.query` object.
+ *
+ * Examples:
+ *
+ *     connect(
+ *         connect.query()
+ *       , function(req, res){
+ *         res.end(JSON.stringify(req.query));
+ *       }
+ *     ).listen(3000);
+ *
+ * @return {Function}
+ * @api public
+ */
+
+module.exports = function query(){
+  return function query(req, res, next){
+    req.query = ~req.url.indexOf('?')
+      ? qs.parse(parse(req.url).query)
+      : {};
+    next();
+  };
+};
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/responseTime.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/responseTime.js
new file mode 100644
index 0000000..2b2133a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/responseTime.js
@@ -0,0 +1,34 @@
+
+/*!
+ * Connect - responseTime
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+/**
+ * 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 writeHead = res.writeHead
+      , start = new Date;
+
+    if (res._responseTime) return next();
+    res._responseTime = true;
+
+    // proxy writeHead to calculate duration
+    res.writeHead = function(status, headers){
+      var duration = new Date - start;
+      res.setHeader('X-Response-Time', duration + 'ms');
+      res.writeHead = writeHead;
+      res.writeHead(status, headers);
+    };
+
+    next();
+  };
+};
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/router.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/router.js
new file mode 100644
index 0000000..a07452e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/router.js
@@ -0,0 +1,379 @@
+
+/*!
+ * Connect - router
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var utils = require('../utils')
+  , parse = require('url').parse;
+
+/**
+ * Expose router.
+ */
+
+exports = module.exports = router;
+
+/**
+ * Supported HTTP / WebDAV methods.
+ */
+
+var _methods = exports.methods = [
+    'get'
+  , 'post'
+  , 'put'
+  , 'delete'
+  , 'connect'
+  , 'options'
+  , 'trace'
+  , 'copy'
+  , 'lock'
+  , 'mkcol'
+  , 'move'
+  , 'propfind'
+  , 'proppatch'
+  , 'unlock'
+  , 'report'
+  , 'mkactivity'
+  , 'checkout'
+  , 'merge'
+];
+
+/**
+ * Provides Sinatra and Express-like routing capabilities.
+ *
+ * Examples:
+ *
+ *     connect.router(function(app){
+ *       app.get('/user/:id', function(req, res, next){
+ *         // populates req.params.id
+ *       });
+ *       app.put('/user/:id', function(req, res, next){
+ *         // populates req.params.id
+ *       });
+ *     })
+ *
+ * @param {Function} fn
+ * @return {Function}
+ * @api public
+ */
+
+function router(fn){
+  var self = this
+    , methods = {}
+    , routes = {}
+    , params = {};
+
+  if (!fn) throw new Error('router provider requires a callback function');
+
+  // Generate method functions
+  _methods.forEach(function(method){
+    methods[method] = generateMethodFunction(method.toUpperCase());
+  });
+
+  // Alias del -> delete
+  methods.del = methods.delete;
+
+  // Apply callback to all methods
+  methods.all = function(){
+    var args = arguments;
+    _methods.forEach(function(name){
+      methods[name].apply(this, args);
+    });
+    return self;
+  };
+
+  // Register param callback
+  methods.param = function(name, fn){
+    params[name] = fn;
+  };
+      
+  fn.call(this, methods);
+
+  function generateMethodFunction(name) {
+    var localRoutes = routes[name] = routes[name] || [];
+    return function(path, fn){
+      var keys = []
+        , middleware = [];
+
+      // slice middleware
+      if (arguments.length > 2) {
+        middleware = Array.prototype.slice.call(arguments, 1, arguments.length);
+        fn = middleware.pop();
+        middleware = utils.flatten(middleware);
+      }
+
+      fn.middleware = middleware;
+
+      if (!path) throw new Error(name + ' route requires a path');
+      if (!fn) throw new Error(name + ' route ' + path + ' requires a callback');
+      var regexp = path instanceof RegExp
+        ? path
+        : normalizePath(path, keys);
+      localRoutes.push({
+          fn: fn
+        , path: regexp
+        , keys: keys
+        , orig: path
+        , method: name
+      });
+      return self;
+    };
+  }
+
+  function router(req, res, next){
+    var route
+      , self = this;
+
+    (function pass(i){
+      if (route = match(req, routes, i)) {
+        var i = 0
+          , keys = route.keys;
+
+        req.params = route.params;
+
+        // Param preconditions
+        (function param(err) {
+          try {
+            var key = keys[i++]
+              , val = req.params[key]
+              , fn = params[key];
+
+            if ('route' == err) {
+              pass(req._route_index + 1);
+            // Error
+            } else if (err) {
+              next(err);
+            // Param has callback
+            } else if (fn) {
+              // Return style
+              if (1 == fn.length) {
+                req.params[key] = fn(val);
+                param();
+              // Middleware style
+              } else {
+                fn(req, res, param, val);
+              }
+            // Finished processing params
+            } else if (!key) {
+              // route middleware
+              i = 0;
+              (function nextMiddleware(err){
+                var fn = route.middleware[i++];
+                if ('route' == err) {
+                  pass(req._route_index + 1);
+                } else if (err) {
+                  next(err);
+                } else if (fn) {
+                  fn(req, res, nextMiddleware);
+                } else {
+                  route.call(self, req, res, function(err){
+                    if (err) {
+                      next(err);
+                    } else {
+                      pass(req._route_index + 1);
+                    }
+                  });
+                }
+              })();
+            // More params
+            } else {
+              param();
+            }
+          } catch (err) {
+            next(err);
+          }
+        })();
+      } else if ('OPTIONS' == req.method) {
+        options(req, res, routes);
+      } else {
+        next();
+      }
+    })();
+  };
+
+  router.remove = function(path, method){
+    var fns = router.lookup(path, method);
+    fns.forEach(function(fn){
+      routes[fn.method].splice(fn.index, 1);
+    });
+  };
+
+  router.lookup = function(path, method, ret){
+    ret = ret || [];
+
+    // method specific lookup
+    if (method) {
+      method = method.toUpperCase();
+      if (routes[method]) {
+        routes[method].forEach(function(route, i){
+          if (path == route.orig) {
+            var fn = route.fn;
+            fn.regexp = route.path;
+            fn.keys = route.keys;
+            fn.path = route.orig;
+            fn.method = route.method;
+            fn.index = i;
+            ret.push(fn);
+          }
+        });
+      }
+    // global lookup
+    } else {
+      _methods.forEach(function(method){
+        router.lookup(path, method, ret);
+      });
+    }
+
+    return ret;
+  };
+
+  router.match = function(url, method, ret){
+    var ret = ret || []
+      , i = 0
+      , fn
+      , req;
+
+    // method specific matches
+    if (method) {
+      method = method.toUpperCase();
+      req = { url: url, method: method };
+      while (fn = match(req, routes, i)) {
+        i = req._route_index + 1;
+        ret.push(fn);
+      } 
+    // global matches
+    } else {
+      _methods.forEach(function(method){
+        router.match(url, method, ret);
+      });
+    }
+
+    return ret;
+  };
+
+  return router;
+}
+
+/**
+ * Respond to OPTIONS.
+ *
+ * @param {ServerRequest} req
+ * @param {ServerResponse} req
+ * @param {Array} routes
+ * @api private
+ */
+
+function options(req, res, routes) {
+  var pathname = parse(req.url).pathname
+    , body = optionsFor(pathname, routes).join(',');
+  res.writeHead(200, {
+      'Content-Length': body.length
+    , 'Allow': body
+  });
+  res.end(body);
+}
+
+/**
+ * Return OPTIONS array for the given `path`, matching `routes`.
+ *
+ * @param {String} path
+ * @param {Array} routes
+ * @return {Array}
+ * @api private
+ */
+
+function optionsFor(path, routes) {
+  return _methods.filter(function(method){
+    var arr = routes[method.toUpperCase()];
+    for (var i = 0, len = arr.length; i < len; ++i) {
+      if (arr[i].path.test(path)) return true;
+    }
+  }).map(function(method){
+    return method.toUpperCase();
+  });
+}
+
+/**
+ * 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} path
+ * @param  {Array} keys
+ * @return {RegExp}
+ * @api private
+ */
+
+function normalizePath(path, keys) {
+  path = path
+    .concat('/?')
+    .replace(/\/\(/g, '(?:/')
+    .replace(/(\/)?(\.)?:(\w+)(?:(\(.*?\)))?(\?)?/g, function(_, slash, format, key, capture, optional){
+      keys.push(key);
+      slash = slash || '';
+      return ''
+        + (optional ? '' : slash)
+        + '(?:'
+        + (optional ? slash : '')
+        + (format || '') + (capture || '([^/]+?)') + ')'
+        + (optional || '');
+    })
+    .replace(/([\/.])/g, '\\$1')
+    .replace(/\*/g, '(.+)');
+  return new RegExp('^' + path + '$', 'i');
+}
+
+/**
+ * Attempt to match the given request to
+ * one of the routes. When successful
+ * a route function is returned.
+ *
+ * @param  {ServerRequest} req
+ * @param  {Object} routes
+ * @return {Function}
+ * @api private
+ */
+
+function match(req, routes, i) {
+  var captures
+    , method = req.method
+    , i = i || 0;
+  if ('HEAD' == method) method = 'GET';
+  if (routes = routes[method]) {
+    var url = parse(req.url)
+      , pathname = url.pathname;
+    for (var len = routes.length; i < len; ++i) {
+      var route = routes[i]
+        , fn = route.fn
+        , path = route.path
+        , keys = fn.keys = route.keys;
+      if (captures = path.exec(pathname)) {
+        fn.method = method;
+        fn.params = [];
+        for (var j = 1, len = captures.length; j < len; ++j) {
+          var key = keys[j-1],
+            val = typeof captures[j] === 'string'
+              ? decodeURIComponent(captures[j])
+              : captures[j];
+          if (key) {
+            fn.params[key] = val;
+          } else {
+            fn.params.push(val);
+          }
+        }
+        req._route_index = i;
+        return fn;
+      }
+    }
+  }
+}
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/session.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/session.js
new file mode 100644
index 0000000..6616fad
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/session.js
@@ -0,0 +1,345 @@
+
+/*!
+ * Connect - session
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Session = require('./session/session')
+  , MemoryStore = require('./session/memory')
+  , Cookie = require('./session/cookie')
+  , Store = require('./session/store')
+  , utils = require('./../utils')
+  , parse = require('url').parse
+  , crypto = require('crypto');
+
+// 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 obviously only work within a single process.';
+
+/**
+ * Default finger-printing function.
+ */
+
+function defaultFingerprint(req) {
+  return '';
+};
+
+/**
+ * Paths to ignore.
+ */
+
+exports.ignore = [];
+
+/**
+ * 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()](middleware-cookieParser.html)
+ * middleware _before_ `session()`.
+ *
+ * Examples:
+ *
+ *     connect.createServer(
+ *         connect.cookieParser()
+ *       , connect.session({ secret: 'keyboard cat' })
+ *     );
+ *
+ * Options:
+ *
+ *   - `key`           cookie name defaulting to `connect.sid`
+ *   - `store`         Session store instance
+ *   - `fingerprint`   Custom fingerprint generating function
+ *   - `cookie`        Session cookie settings, defaulting to `{ path: '/', httpOnly: true, maxAge: 14400000 }`
+ *   - `secret`        Secret string used to compute hash
+ *
+ * Ignore Paths:
+ *
+ *  By default `/favicon.ico` is the only ignored path, all others
+ *  will utilize sessions, to manipulate the paths ignored, use
+ * `connect.session.ignore.push('/my/path')`. This works for _full_
+ *  pathnames only, not segments nor substrings.
+ *
+ *     connect.session.ignore.push('/robots.txt');
+ *
+ * ## 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(
+ *           connect.cookieParser()
+ *         , connect.session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }})
+ *         , connect.favicon()
+ *         , 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`, and `.lastAccess` properties. 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 update `req.session.lastAccess`,
+ * and 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'
+    , secret = options.secret
+    , store = options.store || new MemoryStore
+    , fingerprint = options.fingerprint || defaultFingerprint
+    , cookie = options.cookie;
+
+  // notify user that this store is not
+  // meant for a production environment
+  if ('production' == env && store instanceof MemoryStore) {
+    console.warn(warning);
+  }
+
+  // ensure secret is present
+  if (!secret) {
+    throw new Error('connect.session({ secret: "string" }) required for security');
+  }
+
+  // session hashing function
+  store.hash = function(req, base) {
+    return crypto
+      .createHmac('sha256', secret)
+      .update(base + fingerprint(req))
+      .digest('base64')
+      .replace(/=*$/, '');
+  };
+
+  // generates the new session
+  store.generate = function(req){
+    var base = utils.uid(24);
+    var sessionID = base + '.' + store.hash(req, base);
+    req.sessionID = sessionID;
+    req.session = new Session(req);
+    req.session.cookie = new Cookie(cookie);
+  };
+
+  return function session(req, res, next) {
+    // self-awareness
+    if (req.session) return next();
+
+    // parse url
+    var url = parse(req.url)
+      , path = url.pathname;
+
+    // ignorable paths
+    if (~exports.ignore.indexOf(path)) return next();
+
+    // expose store
+    req.sessionStore = store;
+
+    // proxy writeHead() to Set-Cookie
+    var writeHead = res.writeHead;
+    res.writeHead = function(status, headers){
+      if (req.session) {
+        var cookie = req.session.cookie;
+        // only send secure session cookies when there is a secure connection.
+        // proxySecure is a custom attribute to allow for a reverse proxy
+        // to handle SSL connections and to communicate to connect over HTTP that
+        // the incoming connection is secure.
+        var secured = cookie.secure && (req.connection.encrypted || req.connection.proxySecure);
+        if (secured || !cookie.secure) {
+          res.setHeader('Set-Cookie', cookie.serialize(key, req.sessionID));
+        }
+      }
+
+      res.writeHead = writeHead;
+      return res.writeHead(status, headers);
+    };
+
+    // proxy end() to commit the session
+    var end = res.end;
+    res.end = function(data, encoding){
+      res.end = end;
+      if (req.session) {
+        // HACK: ensure Set-Cookie for implicit writeHead()
+        if (!res._header) res._implicitHeader();
+        req.session.resetMaxAge();
+        req.session.save(function(){
+          res.end(data, encoding);
+        });
+      } else {
+        res.end(data, encoding);
+      }
+    };
+
+    // session hashing
+    function hash(base) {
+      return store.hash(req, base);
+    }
+
+    // generate the session
+    function generate() {
+      store.generate(req);
+    }
+
+    // get the sessionID from the cookie
+    req.sessionID = req.cookies[key];
+
+    // make a new session if the browser doesn't send a sessionID
+    if (!req.sessionID) {
+      generate();
+      next();
+      return;
+    }
+
+    // check the fingerprint
+    var parts = req.sessionID.split('.');
+    if (parts[1] != hash(parts[0])) {
+      generate();
+      next();
+      return;
+    }
+
+    // generate the session object
+    var pause = utils.pause(req);
+    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) {
+        if ('ENOENT' == err.code) {
+          generate();
+          next();
+        } else {
+          next(err);
+        }
+      // no session
+      } else if (!sess) {
+        generate();
+        next();
+      // populate req.session
+      } else {
+        store.createSession(req, sess);
+        next();
+      }
+    });
+  };
+};
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/session/cookie.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/session/cookie.js
new file mode 100644
index 0000000..793c2e9
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/session/cookie.js
@@ -0,0 +1,126 @@
+
+/*!
+ * Connect - session - Cookie
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var utils = require('../../utils');
+
+/**
+ * Initialize a new `Cookie` with the given `options`.
+ *
+ * @param {Object} options
+ * @api private
+ */
+
+var Cookie = module.exports = function Cookie(options) {
+  this.path = '/';
+  this.httpOnly = true;
+  this.maxAge = 14400000;
+  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 utils.serializeCookie(name, val, this.data);
+  },
+
+  /**
+   * Return JSON representation of this cookie.
+   *
+   * @return {Object}
+   * @api private
+   */
+  
+  toJSON: function(){
+    return this.data;
+  }
+};
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/session/memory.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/session/memory.js
new file mode 100644
index 0000000..ec569f5
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/session/memory.js
@@ -0,0 +1,131 @@
+
+/*!
+ * Connect - session - MemoryStore
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Store = require('./store')
+  , utils = require('../../utils')
+  , Session = require('./session');
+
+/**
+ * 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/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/session/session.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/session/session.js
new file mode 100644
index 0000000..4e7e1a6
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/session/session.js
@@ -0,0 +1,137 @@
+
+/*!
+ * Connect - session - Session
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var utils = require('../../utils')
+  , Cookie = require('./cookie');
+
+/**
+ * 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);
+  } else {
+    this.lastAccess = Date.now();
+  }
+};
+
+/**
+ * Update `.lastAccess` timestamp,
+ * and 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
+    .resetLastAccess()
+    .resetMaxAge();
+};
+
+/**
+ * Update `.lastAccess` timestamp.
+ *
+ * @return {Session} for chaining
+ * @api public
+ */
+
+Session.prototype.resetLastAccess = function(){
+  this.lastAccess = Date.now();
+  return this;
+};
+
+/**
+ * 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 or lastAccess 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/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/session/store.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/session/store.js
new file mode 100644
index 0000000..6a3d47d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/session/store.js
@@ -0,0 +1,87 @@
+
+/*!
+ * 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')
+  , utils = require('../../utils');
+
+/**
+ * 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, false);
+    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, update){
+  var expires = sess.cookie.expires
+    , orig = sess.cookie.originalMaxAge
+    , update = null == update ? true : false;
+  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);
+  if (update) req.session.resetLastAccess();
+  return req.session;
+};
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/static.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/static.js
new file mode 100644
index 0000000..b9c2c86
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/static.js
@@ -0,0 +1,225 @@
+
+/*!
+ * Connect - staticProvider
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var fs = require('fs')
+  , path = require('path')
+  , join = path.join
+  , basename = path.basename
+  , normalize = path.normalize
+  , utils = require('../utils')
+  , Buffer = require('buffer').Buffer
+  , parse = require('url').parse
+  , mime = require('mime');
+
+/**
+ * Static file server with the given `root` path.
+ *
+ * Examples:
+ *
+ *     var oneDay = 86400000;
+ *
+ *     connect(
+ *       connect.static(__dirname + '/public')
+ *     ).listen(3000);
+ *
+ *     connect(
+ *       connect.static(__dirname + '/public', { maxAge: oneDay })
+ *     ).listen(3000);
+ *
+ * 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
+ *
+ * @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');
+  options.root = root;
+
+  return function static(req, res, next) {
+    options.path = req.url;
+    options.getOnly = true;
+    send(req, res, next, options);
+  };
+};
+
+/**
+ * Expose mime module.
+ */
+
+exports.mime = mime;
+
+/**
+ * Respond with 416  "Requested Range Not Satisfiable"
+ *
+ * @param {ServerResponse} res
+ * @api private
+ */
+
+function invalidRange(res) {
+  var body = 'Requested Range Not Satisfiable';
+  res.setHeader('Content-Type', 'text/plain');
+  res.setHeader('Content-Length', body.length);
+  res.statusCode = 416;
+  res.end(body);
+}
+
+/**
+ * Attempt to tranfer the requseted file to `res`.
+ *
+ * @param {ServerRequest}
+ * @param {ServerResponse}
+ * @param {Function} next
+ * @param {Object} options
+ * @api private
+ */
+
+var send = exports.send = function(req, res, next, options){
+  options = options || {};
+  if (!options.path) throw new Error('path required');
+
+  // setup
+  var maxAge = options.maxAge || 0
+    , ranges = req.headers.range
+    , head = 'HEAD' == req.method
+    , get = 'GET' == req.method
+    , root = options.root ? normalize(options.root) : null
+    , redirect = false === options.redirect ? false : true
+    , getOnly = options.getOnly
+    , fn = options.callback
+    , hidden = options.hidden
+    , done;
+
+  // replace next() with callback when available
+  if (fn) next = fn;
+
+  // ignore non-GET requests
+  if (getOnly && !get && !head) return next();
+
+  // parse url
+  var url = parse(options.path)
+    , path = decodeURIComponent(url.pathname)
+    , type;
+
+  // null byte(s)
+  if (~path.indexOf('\0')) return utils.badRequest(res);
+
+  // when root is not given, consider .. malicious
+  if (!root && ~path.indexOf('..')) return utils.forbidden(res);
+
+  // join / normalize from optional root dir
+  path = normalize(join(root, path));
+
+  // malicious path
+  if (root && 0 != path.indexOf(root)) return fn
+    ? fn(new Error('Forbidden'))
+    : utils.forbidden(res);
+
+  // index.html support
+  if (normalize('/') == path[path.length - 1]) path += 'index.html';
+
+  // "hidden" file
+  if (!hidden && '.' == basename(path)[0]) return next();
+
+  fs.stat(path, function(err, stat){
+    // mime type
+    type = mime.lookup(path);
+
+    // ignore ENOENT
+    if (err) {
+      if (fn) return fn(err);
+      return 'ENOENT' == err.code
+        ? next()
+        : next(err);
+    // redirect directory in case index.html is present
+    } else if (stat.isDirectory()) {
+      if (!redirect) return next();
+      res.statusCode = 301;
+      res.setHeader('Location', url.pathname + '/');
+      res.end('Redirecting to ' + url.pathname + '/');
+      return;
+    }
+
+    // header fields
+    if (!res.getHeader('Date')) res.setHeader('Date', new Date().toUTCString());
+    if (!res.getHeader('Cache-Control')) res.setHeader('Cache-Control', 'public, max-age=' + (maxAge / 1000));
+    if (!res.getHeader('Last-Modified')) res.setHeader('Last-Modified', stat.mtime.toUTCString());
+    if (!res.getHeader('ETag')) res.setHeader('ETag', utils.etag(stat));
+    if (!res.getHeader('content-type')) {
+      var charset = mime.charsets.lookup(type);
+      res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : ''));
+    }
+    res.setHeader('Accept-Ranges', 'bytes');
+
+    // conditional GET support
+    if (utils.conditionalGET(req)) {
+      if (!utils.modified(req, res)) {
+        req.emit('static');
+        return utils.notModified(res);
+      }
+    }
+
+    var opts = {};
+    var chunkSize = stat.size;
+
+    // we have a Range request
+    if (ranges) {
+      ranges = utils.parseRange(stat.size, ranges);
+      // valid
+      if (ranges) {
+        // TODO: stream options
+        // TODO: multiple support
+        opts.start = ranges[0].start;
+        opts.end = ranges[0].end;
+        chunkSize = opts.end - opts.start + 1;
+        res.statusCode = 206;
+        res.setHeader('Content-Range', 'bytes '
+          + opts.start
+          + '-'
+          + opts.end
+          + '/'
+          + stat.size);
+      // invalid
+      } else {
+        return fn
+          ? fn(new Error('Requested Range Not Satisfiable'))
+          : invalidRange(res);
+      }
+    }
+
+    res.setHeader('Content-Length', chunkSize);
+
+    // transfer
+    if (head) return res.end();
+
+    // stream
+    var stream = fs.createReadStream(path, opts);
+    req.emit('static', stream);
+    stream.pipe(res);
+
+    // callback
+    if (fn) {
+      function callback(err) { done || fn(err); done = true }
+      req.on('close', callback);
+      stream.on('end', callback);
+    }
+  });
+};
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/staticCache.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/staticCache.js
new file mode 100644
index 0000000..9ea8eb7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/staticCache.js
@@ -0,0 +1,175 @@
+
+/*!
+ * Connect - staticCache
+ * Copyright(c) 2011 Sencha Inc.
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var http = require('http')
+  , utils = require('../utils')
+  , Cache = require('../cache')
+  , url = require('url')
+  , fs = require('fs');
+
+/**
+ * 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 {Type} name
+ * @return {Type}
+ * @api public
+ */
+
+module.exports = function staticCache(options){
+  var options = options || {}
+    , cache = new Cache(options.maxObjects || 128)
+    , maxlen = options.maxLength || 1024 * 256;
+
+  return function staticCache(req, res, next){
+    var path = url.parse(req.url).pathname
+      , ranges = req.headers.range
+      , hit = cache.get(path)
+      , hitCC
+      , uaCC
+      , header
+      , age;
+
+    // cache static
+    req.on('static', function(stream){
+      var headers = res._headers
+        , cc = utils.parseCacheControl(headers['cache-control'] || '')
+        , contentLength = headers['content-length']
+        , hit;
+
+      // ignore larger files
+      if (!contentLength || contentLength > maxlen) return;
+
+      // dont cache items we shouldn't be
+      if ( cc['no-cache']
+        || cc['no-store']
+        || cc['private']
+        || cc['must-revalidate']) return;
+
+      // if already in cache then validate
+      if (hit = cache.get(path)){
+        if (headers.etag == hit[0].etag) {
+          hit[0].date = new Date;
+          return;
+        } else {
+          cache.remove(path);
+        }
+      }
+
+      // validation notifiactions don't contain a steam
+      if (null == stream) return;
+
+      // add the cache object
+      var arr = cache.add(path);
+      arr.push(headers);
+
+      // store the chunks
+      stream.on('data', function(chunk){
+        arr.push(chunk);
+      });
+
+      // flag it as complete
+      stream.on('end', function(){
+        arr.complete = true;
+      });
+    });
+
+    // cache hit, doesnt support range requests
+    if (hit && hit.complete && !ranges) {
+      header = utils.merge({}, hit[0]);
+      header.Age = age = (new Date - new Date(header.date)) / 1000 | 0;
+      header.date = new Date().toUTCString();
+
+      // parse cache-controls
+      hitCC = utils.parseCacheControl(header['cache-control'] || '');
+      uaCC = utils.parseCacheControl(req.headers['cache-control'] || '');
+
+      // check if we must revalidate(bypass)
+      if (hitCC['no-cache'] || uaCC['no-cache']) return next();
+
+      // check freshness of entity
+      if (isStale(hitCC, age) || isStale(uaCC, age)) return next();
+
+      // conditional GET support
+      if (utils.conditionalGET(req)) {
+        if (!utils.modified(req, res, header)) {
+          header['content-length'] = 0;
+          res.writeHead(304, header);
+          return res.end();
+        }
+      }
+
+      // HEAD support
+      if ('HEAD' == req.method) {
+        header['content-length'] = 0;
+        res.writeHead(200, header);
+        return res.end();
+      }
+
+      // respond with cache
+      res.writeHead(200, header);
+
+      // backpressure
+      function write(i) {
+        var buf = hit[i];
+        if (!buf) return res.end();
+        if (false === res.write(buf)) {
+          res.once('drain', function(){
+            write(++i);
+          });
+        } else {
+          write(++i);
+        }
+      }
+
+      return write(1);
+    }
+
+    next();
+  }
+};
+
+/**
+ * Check if cache item is stale
+ *
+ * @param {Object} cc
+ * @param {Number} age
+ * @return {Boolean}
+ * @api private
+ */
+
+function isStale(cc, age) {
+  return cc['max-age'] && cc['max-age'] <= age;
+}
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/vhost.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/vhost.js
new file mode 100644
index 0000000..913d756
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/middleware/vhost.js
@@ -0,0 +1,44 @@
+
+/*!
+ * Connect - vhost
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+/**
+ * Setup vhost for the given `hostname` and `server`.
+ *
+ * Examples:
+ *
+ *     connect(
+ *       connect.vhost('foo.com',
+ *         connect.createServer(...middleware...)
+ *       ),
+ *       connect.vhost('bar.com',
+ *         connect.createServer(...middleware...)
+ *       )
+ *     );
+ *
+ * @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, '(.*?)') + '$');
+  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 (req.subdomains = regexp.exec(host)) {
+      req.subdomains = req.subdomains[0].split('.').slice(0, -1);
+      server.emit("request", req, res);
+    } else {
+      next();
+    }
+  };
+};
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/patch.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/patch.js
new file mode 100644
index 0000000..a6ff297
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/patch.js
@@ -0,0 +1,79 @@
+
+/*!
+ * Connect
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var http = require('http')
+  , res = http.OutgoingMessage.prototype;
+
+// original setHeader()
+
+var setHeader = res.setHeader;
+
+// original _renderHeaders()
+
+var _renderHeaders = res._renderHeaders;
+
+if (res._hasConnectPatch) return;
+
+/**
+ * Provide a public "header sent" flag
+ * until node does.
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+res.__defineGetter__('headerSent', function(){
+  return this._headerSent;
+});
+
+/**
+ * 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 `res.end()` to expose a 'header' event,
+ * allowing arbitrary augmentation before the header
+ * fields are written to the socket.
+ *
+ * NOTE: this _only_ supports node's progressive header
+ * field API aka `res.setHeader()`.
+ */
+
+res._renderHeaders = function(){
+  this.emit('header');
+  return _renderHeaders.call(this);
+};
+
+res._hasConnectPatch = true;
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/directory.html b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/directory.html
new file mode 100644
index 0000000..15164bb
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/directory.html
@@ -0,0 +1,75 @@
+<html>
+  <head>
+    <title>listing directory {directory}</title>
+    <style>{style}</style>
+    <script>
+      function $(id){
+        var el = 'string' == typeof id
+          ? document.getElementById(id)
+          : id;
+
+        el.on = function(event, fn){
+          if ('content loaded' == event) event = 'DOMContentLoaded';
+          el.addEventListener(event, fn, false);
+        };
+
+        el.all = function(selector){
+          return $(el.querySelectorAll(selector));
+        };
+
+        el.each = function(fn){
+          for (var i = 0, len = el.length; i < len; ++i) {
+            fn($(el[i]), i);
+          }
+        };
+
+        el.getClasses = function(){
+          return this.getAttribute('class').split(/\s+/);
+        };
+
+        el.addClass = function(name){
+          var classes = this.getAttribute('class');
+          el.setAttribute('class', classes
+            ? classes + ' ' + name
+            : name);
+        };
+
+        el.removeClass = function(name){
+          var classes = this.getClasses().filter(function(curr){
+            return curr != name;
+          });
+          this.setAttribute('class', classes);
+        };
+
+        return el;
+      }
+
+      function search() {
+        var str = $('search').value
+          , links = $('files').all('a');
+
+        links.each(function(link){
+          var text = link.textContent;
+
+          if ('..' == text) return;
+          if (str.length && ~text.indexOf(str)) {
+            link.addClass('highlight');
+          } else {
+            link.removeClass('highlight');
+          }
+        });
+      }
+
+      $(window).on('content loaded', function(){
+        $('search').on('keyup', search);
+      });
+    </script>
+  </head>
+  <body class="directory">
+    <input id="search" type="text" placeholder="Search" autocomplete="off" />
+    <div id="wrapper">
+      <h1>{linked-path}</h1>
+      {files}
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/error.html b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/error.html
new file mode 100644
index 0000000..34e0df5
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/error.html
@@ -0,0 +1,13 @@
+<html>
+  <head>
+    <title>{error}</title>
+    <style>{style}</style>
+  </head>
+  <body>
+    <div id="wrapper">
+      <h1>{title}</h1>
+      <h2><em>500</em> {error}</h2>
+      <ul id="stacktrace">{stack}</ul>
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/favicon.ico b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/favicon.ico
new file mode 100644
index 0000000..895fc96
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/favicon.ico differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page.png
new file mode 100755
index 0000000..03ddd79
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_add.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_add.png
new file mode 100755
index 0000000..d5bfa07
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_add.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_attach.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_attach.png
new file mode 100755
index 0000000..89ee2da
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_attach.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_code.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_code.png
new file mode 100755
index 0000000..f7ea904
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_code.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_copy.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_copy.png
new file mode 100755
index 0000000..195dc6d
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_copy.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_delete.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_delete.png
new file mode 100755
index 0000000..3141467
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_delete.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_edit.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_edit.png
new file mode 100755
index 0000000..046811e
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_edit.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_error.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_error.png
new file mode 100755
index 0000000..f07f449
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_error.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_excel.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_excel.png
new file mode 100755
index 0000000..eb6158e
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_excel.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_find.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_find.png
new file mode 100755
index 0000000..2f19388
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_find.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_gear.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_gear.png
new file mode 100755
index 0000000..8e83281
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_gear.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_go.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_go.png
new file mode 100755
index 0000000..80fe1ed
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_go.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_green.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_green.png
new file mode 100755
index 0000000..de8e003
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_green.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_key.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_key.png
new file mode 100755
index 0000000..d6626cb
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_key.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_lightning.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_lightning.png
new file mode 100755
index 0000000..7e56870
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_lightning.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_link.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_link.png
new file mode 100755
index 0000000..312eab0
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_link.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_paintbrush.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_paintbrush.png
new file mode 100755
index 0000000..246a2f0
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_paintbrush.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_paste.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_paste.png
new file mode 100755
index 0000000..968f073
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_paste.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_red.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_red.png
new file mode 100755
index 0000000..0b18247
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_red.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_refresh.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_refresh.png
new file mode 100755
index 0000000..cf347c7
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_refresh.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_save.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_save.png
new file mode 100755
index 0000000..caea546
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_save.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white.png
new file mode 100755
index 0000000..8b8b1ca
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_acrobat.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_acrobat.png
new file mode 100755
index 0000000..8f8095e
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_acrobat.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_actionscript.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_actionscript.png
new file mode 100755
index 0000000..159b240
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_actionscript.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_add.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_add.png
new file mode 100755
index 0000000..aa23dde
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_add.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_c.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_c.png
new file mode 100755
index 0000000..34a05cc
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_c.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_camera.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_camera.png
new file mode 100755
index 0000000..f501a59
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_camera.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_cd.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_cd.png
new file mode 100755
index 0000000..848bdaf
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_cd.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_code.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_code.png
new file mode 100755
index 0000000..0c76bd1
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_code.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_code_red.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_code_red.png
new file mode 100755
index 0000000..87a6914
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_code_red.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_coldfusion.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_coldfusion.png
new file mode 100755
index 0000000..c66011f
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_coldfusion.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_compressed.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_compressed.png
new file mode 100755
index 0000000..2b6b100
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_compressed.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_copy.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_copy.png
new file mode 100755
index 0000000..a9f31a2
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_copy.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_cplusplus.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_cplusplus.png
new file mode 100755
index 0000000..a87cf84
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_cplusplus.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_csharp.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_csharp.png
new file mode 100755
index 0000000..ffb8fc9
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_csharp.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_cup.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_cup.png
new file mode 100755
index 0000000..0a7d6f4
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_cup.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_database.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_database.png
new file mode 100755
index 0000000..bddba1f
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_database.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_delete.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_delete.png
new file mode 100755
index 0000000..af1ecaf
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_delete.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_dvd.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_dvd.png
new file mode 100755
index 0000000..4cc537a
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_dvd.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_edit.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_edit.png
new file mode 100755
index 0000000..b93e776
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_edit.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_error.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_error.png
new file mode 100755
index 0000000..9fc5a0a
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_error.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_excel.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_excel.png
new file mode 100755
index 0000000..b977d7e
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_excel.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_find.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_find.png
new file mode 100755
index 0000000..5818436
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_find.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_flash.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_flash.png
new file mode 100755
index 0000000..5769120
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_flash.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_freehand.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_freehand.png
new file mode 100755
index 0000000..8d719df
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_freehand.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_gear.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_gear.png
new file mode 100755
index 0000000..106f5aa
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_gear.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_get.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_get.png
new file mode 100755
index 0000000..e4a1ecb
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_get.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_go.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_go.png
new file mode 100755
index 0000000..7e62a92
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_go.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_h.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_h.png
new file mode 100755
index 0000000..e902abb
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_h.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_horizontal.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_horizontal.png
new file mode 100755
index 0000000..1d2d0a4
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_horizontal.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_key.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_key.png
new file mode 100755
index 0000000..d616484
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_key.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_lightning.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_lightning.png
new file mode 100755
index 0000000..7215d1e
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_lightning.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_link.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_link.png
new file mode 100755
index 0000000..bf7bd1c
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_link.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_magnify.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_magnify.png
new file mode 100755
index 0000000..f6b74cc
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_magnify.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_medal.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_medal.png
new file mode 100755
index 0000000..d3fffb6
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_medal.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_office.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_office.png
new file mode 100755
index 0000000..a65bcb3
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_office.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_paint.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_paint.png
new file mode 100755
index 0000000..23a37b8
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_paint.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_paintbrush.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_paintbrush.png
new file mode 100755
index 0000000..f907e44
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_paintbrush.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_paste.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_paste.png
new file mode 100755
index 0000000..5b2cbb3
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_paste.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_php.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_php.png
new file mode 100755
index 0000000..7868a25
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_php.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_picture.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_picture.png
new file mode 100755
index 0000000..134b669
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_picture.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_powerpoint.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_powerpoint.png
new file mode 100755
index 0000000..c4eff03
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_powerpoint.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_put.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_put.png
new file mode 100755
index 0000000..884ffd6
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_put.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_ruby.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_ruby.png
new file mode 100755
index 0000000..f59b7c4
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_ruby.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_stack.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_stack.png
new file mode 100755
index 0000000..44084ad
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_stack.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_star.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_star.png
new file mode 100755
index 0000000..3a1441c
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_star.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_swoosh.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_swoosh.png
new file mode 100755
index 0000000..e770829
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_swoosh.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_text.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_text.png
new file mode 100755
index 0000000..813f712
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_text.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_text_width.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_text_width.png
new file mode 100755
index 0000000..d9cf132
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_text_width.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_tux.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_tux.png
new file mode 100755
index 0000000..52699bf
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_tux.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_vector.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_vector.png
new file mode 100755
index 0000000..4a05955
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_vector.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_visualstudio.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_visualstudio.png
new file mode 100755
index 0000000..a0a433d
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_visualstudio.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_width.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_width.png
new file mode 100755
index 0000000..1eb8809
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_width.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_word.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_word.png
new file mode 100755
index 0000000..ae8ecbf
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_word.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_world.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_world.png
new file mode 100755
index 0000000..6ed2490
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_world.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_wrench.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_wrench.png
new file mode 100755
index 0000000..fecadd0
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_wrench.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_zip.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_zip.png
new file mode 100755
index 0000000..fd4bbcc
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_white_zip.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_word.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_word.png
new file mode 100755
index 0000000..834cdfa
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_word.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_world.png b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_world.png
new file mode 100755
index 0000000..b8895dd
Binary files /dev/null and b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/icons/page_world.png differ
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/style.css b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/public/style.css
new file mode 100644
index 0000000..32b6507
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/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/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/utils.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/utils.js
new file mode 100644
index 0000000..d0bc172
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/lib/utils.js
@@ -0,0 +1,451 @@
+
+/*!
+ * Connect - utils
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var crypto = require('crypto')
+  , Path = require('path')
+  , fs = require('fs');
+
+/**
+ * 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;
+};
+
+/**
+ * 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 public
+ */
+
+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 public
+ */
+
+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 public
+ */
+
+exports.escape = function(html){
+  return String(html)
+    .replace(/&(?!\w+;)/g, '&')
+    .replace(/</g, '<')
+    .replace(/>/g, '>')
+    .replace(/"/g, '"');
+};
+
+
+/**
+ * Return a unique identifier with the given `len`.
+ *
+ *     utils.uid(10);
+ *     // => "FDaS435D2z"
+ *
+ * @param {Number} len
+ * @return {String}
+ * @api public
+ */
+
+exports.uid = function(len) {
+  var buf = []
+    , chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
+    , charlen = chars.length;
+
+  for (var i = 0; i < len; ++i) {
+    buf.push(chars[getRandomInt(0, charlen - 1)]);
+  }
+
+  return buf.join('');
+};
+
+/**
+ * Parse the given cookie string into an object.
+ *
+ * @param {String} str
+ * @return {Object}
+ * @api public
+ */
+
+exports.parseCookie = function(str){
+  var obj = {}
+    , pairs = str.split(/[;,] */);
+  for (var i = 0, len = pairs.length; i < len; ++i) {
+    var pair = pairs[i]
+      , eqlIndex = pair.indexOf('=')
+      , key = pair.substr(0, eqlIndex).trim().toLowerCase()
+      , val = pair.substr(++eqlIndex, pair.length).trim();
+
+    // quoted values
+    if ('"' == val[0]) val = val.slice(1, -1);
+
+    // only assign once
+    if (undefined == obj[key]) {
+      val = val.replace(/\+/g, ' ');
+      try {
+        obj[key] = decodeURIComponent(val);
+      } catch (err) {
+        if (err instanceof URIError) {
+          obj[key] = val;
+        } else {
+          throw err;
+        }
+      }
+    }
+  }
+  return obj;
+};
+
+/**
+ * Serialize the given object into a cookie string.
+ *
+ *      utils.serializeCookie('name', 'tj', { httpOnly: true })
+ *      // => "name=tj; httpOnly"
+ *
+ * @param {String} name
+ * @param {String} val
+ * @param {Object} obj
+ * @return {String}
+ * @api public
+ */
+
+exports.serializeCookie = function(name, val, obj){
+  var pairs = [name + '=' + encodeURIComponent(val)]
+    , obj = obj || {};
+
+  if (obj.domain) pairs.push('domain=' + obj.domain);
+  if (obj.path) pairs.push('path=' + obj.path);
+  if (obj.expires) pairs.push('expires=' + obj.expires.toUTCString());
+  if (obj.httpOnly) pairs.push('httpOnly');
+  if (obj.secure) pairs.push('secure');
+
+  return pairs.join('; ');
+};
+
+/**
+ * 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 public
+ */
+
+exports.pause = 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]);
+      }
+    }
+  };
+};
+
+/**
+ * Check `req` and `res` to see if it has been modified.
+ *
+ * @param {IncomingMessage} req
+ * @param {ServerResponse} res
+ * @return {Boolean}
+ * @api public
+ */
+
+exports.modified = function(req, res, headers) {
+  var headers = headers || res._headers || {}
+    , modifiedSince = req.headers['if-modified-since']
+    , lastModified = headers['last-modified']
+    , noneMatch = req.headers['if-none-match']
+    , etag = headers['etag'];
+
+  if (noneMatch) noneMatch = noneMatch.split(/ *, */);
+
+  // check If-None-Match
+  if (noneMatch && etag && ~noneMatch.indexOf(etag)) {
+    return false;
+  }
+
+  // check If-Modified-Since
+  if (modifiedSince && lastModified) {
+    modifiedSince = new Date(modifiedSince);
+    lastModified = new Date(lastModified);
+    // Ignore invalid dates
+    if (!isNaN(modifiedSince.getTime())) {
+      if (lastModified <= modifiedSince) return false;
+    }
+  }
+  
+  return true;
+};
+
+/**
+ * Strip `Content-*` headers from `res`.
+ *
+ * @param {ServerResponse} res
+ * @api public
+ */
+
+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 public
+ */
+
+exports.conditionalGET = function(req) {
+  return req.headers['if-modified-since']
+    || req.headers['if-none-match'];
+};
+
+/**
+ * Respond with 403 "Forbidden".
+ *
+ * @param {ServerResponse} res
+ * @api public
+ */
+
+exports.forbidden = function(res) {
+  var body = 'Forbidden';
+  res.setHeader('Content-Type', 'text/plain');
+  res.setHeader('Content-Length', body.length);
+  res.statusCode = 403;
+  res.end(body);
+};
+
+/**
+ * Respond with 401 "Unauthorized".
+ *
+ * @param {ServerResponse} res
+ * @param {String} realm
+ * @api public
+ */
+
+exports.unauthorized = function(res, realm) {
+  res.statusCode = 401;
+  res.setHeader('WWW-Authenticate', 'Basic realm="' + realm + '"');
+  res.end('Unauthorized');
+};
+
+/**
+ * Respond with 400 "Bad Request".
+ *
+ * @param {ServerResponse} res
+ * @api public
+ */
+
+exports.badRequest = function(res) {
+  res.statusCode = 400;
+  res.end('Bad Request');
+};
+
+/**
+ * Respond with 304 "Not Modified".
+ *
+ * @param {ServerResponse} res
+ * @param {Object} headers
+ * @api public
+ */
+
+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 public
+ */
+
+exports.etag = function(stat) {
+  return '"' + stat.size + '-' + Number(stat.mtime) + '"';
+};
+
+/**
+ * Parse "Range" header `str` relative to the given file `size`.
+ *
+ * @param {Number} size
+ * @param {String} str
+ * @return {Array}
+ * @api public
+ */
+
+exports.parseRange = function(size, str){
+  var valid = true;
+  var arr = str.substr(6).split(',').map(function(range){
+    var range = range.split('-')
+      , start = parseInt(range[0], 10)
+      , end = parseInt(range[1], 10);
+
+    // -500
+    if (isNaN(start)) {
+      start = size - end;
+      end = size - 1;
+    // 500-
+    } else if (isNaN(end)) {
+      end = size - 1;
+    }
+
+    // Invalid
+    if (isNaN(start) || isNaN(end) || start > end) valid = false;
+
+    return { start: start, end: end };
+  });
+  return valid ? arr : undefined;
+};
+
+/**
+ * Parse the given Cache-Control `str`.
+ *
+ * @param {String} str
+ * @return {Object}
+ * @api public
+ */
+
+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;
+};
+
+
+/**
+ * Convert array-like object to an `Array`.
+ *
+ * node-bench measured "16.5 times faster than Array.prototype.slice.call()"
+ *
+ * @param {Object} obj
+ * @return {Array}
+ * @api public
+ */
+
+var toArray = exports.toArray = function(obj){
+  var len = obj.length
+    , arr = new Array(len);
+  for (var i = 0; i < len; ++i) {
+    arr[i] = obj[i];
+  }
+  return arr;
+};
+
+/**
+ * Retrun a random int, used by `utils.uid()`
+ *
+ * @param {Number} min
+ * @param {Number} max
+ * @return {Number}
+ * @api private
+ */
+
+function getRandomInt(min, max) {
+  return Math.floor(Math.random() * (max - min + 1)) + min;
+}
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/.npmignore b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/.npmignore
new file mode 100644
index 0000000..4fbabb3
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/.npmignore
@@ -0,0 +1,4 @@
+/test/tmp/
+*.upload
+*.un~
+*.http
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/.travis.yml b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/.travis.yml
new file mode 100644
index 0000000..cb931cb
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/.travis.yml
@@ -0,0 +1,5 @@
+language: node_js
+node_js:
+  - 0.8
+  - 0.9
+  - "0.10"
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/LICENSE b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/LICENSE
new file mode 100644
index 0000000..38d3c9c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/LICENSE
@@ -0,0 +1,7 @@
+Copyright (C) 2011 Felix Geisendörfer
+
+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/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/Readme.md b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/Readme.md
new file mode 100644
index 0000000..08e9eca
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/Readme.md
@@ -0,0 +1,419 @@
+# 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
+
+## Installation
+
+Via [npm](http://github.com/isaacs/npm):
+```
+npm install formidable at 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.
+```javascript
+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(
+    '<form action="/upload" enctype="multipart/form-data" method="post">'+
+    '<input type="text" name="title"><br>'+
+    '<input type="file" name="upload" multiple="multiple"><br>'+
+    '<input type="submit" value="Upload">'+
+    '</form>'
+  );
+}).listen(8080);
+```
+## API
+
+### Formidable.IncomingForm
+```javascript
+var form = new formidable.IncomingForm()
+```
+Creates a new incoming form.
+
+```javascript
+form.encoding = 'utf-8';
+```
+Sets encoding for incoming form fields.
+
+```javascript
+form.uploadDir = process.env.TMP || process.env.TMPDIR || process.env.TEMP || '/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.
+
+```javascript
+form.keepExtensions = false;
+```
+If you want the files written to `form.uploadDir` to include the extensions of the original files, set this property to `true`.
+
+```javascript
+form.type
+```
+Either 'multipart' or 'urlencoded' depending on the incoming request.
+
+```javascript
+form.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.
+
+```javascript
+form.maxFields = 0;
+```
+Limits the number of fields that the querystring parser will decode. Defaults
+to 0 (unlimited).
+
+```javascript
+form.hash = false;
+```
+If you want checksums calculated for incoming files, set this to either `'sha1'` or `'md5'`.
+
+```javascript
+form.bytesReceived
+```
+The amount of bytes received for this form so far.
+
+```javascript
+form.bytesExpected
+```
+The expected number of bytes in this form.
+
+```javascript
+form.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:
+
+
+```javascript
+form.parse(req, function(err, fields, files) {
+  // ...
+});
+
+form.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.
+
+```javascript
+form.onPart = function(part) {
+  part.addListener('data', function() {
+    // ...
+  });
+}
+```
+If you want to use formidable to only handle certain parts for you, you can do so:
+```javascript
+form.onPart = function(part) {
+  if (!part.filename) {
+    // let formidable handle all non-file parts
+    form.handlePart(part);
+  }
+}
+```
+Check the code in this method for further inspiration.
+
+
+### Formidable.File
+```javascript
+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.
+```javascript
+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.
+```javascript
+file.name = null
+```
+The name this file had according to the uploading client.
+```javascript
+file.type = null
+```
+The mime type of this file, according to the uploading client.
+```javascript
+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/).
+```javascript
+file.hash = null
+```
+If hash calculation was set, you can read the hex digest out of this var.
+
+#### Formidable.File#toJSON()
+
+  This method returns a JSON-representation of the file, allowing you to
+  `JSON.stringify()` the file which is useful for logging and responding
+  to requests.
+
+### Events
+
+
+#### 'progress'
+```javascript
+form.on('progress', function(bytesReceived, bytesExpected) {
+});
+```
+Emitted after each incoming chunk of data that has been parsed. Can be used to roll your own progress bar.
+
+
+
+#### 'field'
+```javascript
+form.on('field', function(name, value) {
+});
+```
+
+#### 'fileBegin'
+
+Emitted whenever a field / value pair has been received.
+```javascript
+form.on('fileBegin', function(name, file) {
+});
+```
+
+#### '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.
+
+Emitted whenever a field / file pair has been received. `file` is an instance of `File`.
+```javascript
+form.on('file', function(name, file) {
+});
+```
+
+#### 'error'
+
+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.
+```javascript
+form.on('error', function(err) {
+});
+```
+
+#### '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).
+```javascript
+form.on('aborted', function() {
+});
+```
+
+##### 'end'
+```javascript
+form.on('end', function() {
+});
+```
+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.
+
+
+
+## Changelog
+
+### v1.0.14
+
+* Add failing hash tests. (Ben Trask)
+* Enable hash calculation again (Eugene Girshov)
+* Test for immediate data events (Tim Smart)
+* Re-arrange IncomingForm#parse (Tim Smart)
+
+### v1.0.13
+
+* Only update hash if update method exists (Sven Lito)
+* According to travis v0.10 needs to go quoted (Sven Lito)
+* Bumping build node versions (Sven Lito)
+* Additional fix for empty requests (Eugene Girshov)
+* Change the default to 1000, to match the new Node behaviour. (OrangeDog)
+* Add ability to control maxKeys in the querystring parser. (OrangeDog)
+* Adjust test case to work with node 0.9.x (Eugene Girshov)
+* Update package.json (Sven Lito)
+* Path adjustment according to eb4468b (Markus Ast)
+
+### v1.0.12
+
+* Emit error on aborted connections (Eugene Girshov)
+* Add support for empty requests (Eugene Girshov)
+* Fix name/filename handling in Content-Disposition (jesperp)
+* Tolerate malformed closing boundary in multipart (Eugene Girshov)
+* Ignore preamble in multipart messages (Eugene Girshov)
+* Add support for application/json (Mike Frey, Carlos Rodriguez)
+* Add support for Base64 encoding (Elmer Bulthuis)
+* Add File#toJSON (TJ Holowaychuk)
+* Remove support for Node.js 0.4 & 0.6 (Andrew Kelley)
+* Documentation improvements (Sven Lito, Andre Azevedo)
+* Add support for application/octet-stream (Ion Lupascu, Chris Scribner)
+* Use os.tmpDir() to get tmp directory (Andrew Kelley)
+* Improve package.json (Andrew Kelley, Sven Lito)
+* Fix benchmark script (Andrew Kelley)
+* Fix scope issue in incoming_forms (Sven Lito)
+* Fix file handle leak on error (OrangeDog)
+
+### v1.0.11
+
+* Calculate checksums for incoming files (sreuter)
+* Add definition parameters to "IncomingForm" as an argument (Math-)
+
+### v1.0.10
+
+* Make parts to be proper Streams (Matt Robenolt)
+
+### 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)
+
+## 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/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/benchmark/bench-multipart-parser.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/benchmark/bench-multipart-parser.js
new file mode 100644
index 0000000..49abc43
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/benchmark/bench-multipart-parser.js
@@ -0,0 +1,71 @@
+var assert = require('assert');
+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/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/example/json.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/example/json.js
new file mode 100644
index 0000000..eb8a724
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/example/json.js
@@ -0,0 +1,67 @@
+var common = require('../test/common'),
+    http = require('http'),
+    util = require('util'),
+    formidable = common.formidable,
+    Buffer = require('buffer').Buffer,
+    port = common.port,
+    server;
+
+server = http.createServer(function(req, res) {
+  if (req.method !== 'POST') {
+    res.writeHead(200, {'content-type': 'text/plain'})
+    res.end('Please POST a JSON payload to http://localhost:'+port+'/')
+    return;
+  }
+
+  var form = new formidable.IncomingForm(),
+      fields = {};
+
+  form
+    .on('error', function(err) {
+      res.writeHead(500, {'content-type': 'text/plain'});
+      res.end('error:\n\n'+util.inspect(err));
+      console.error(err);
+    })
+    .on('field', function(field, value) {
+      console.log(field, value);
+      fields[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);
+});
+server.listen(port);
+
+console.log('listening on http://localhost:'+port+'/');
+
+
+var request = http.request({
+  host: 'localhost',
+  path: '/',
+  port: port,
+  method: 'POST',
+  headers: { 'content-type':'application/json', 'content-length':48 }
+}, function(response) {
+  var data = '';
+  console.log('\nServer responded with:');
+  console.log('Status:', response.statusCode);
+  response.pipe(process.stdout);
+  response.on('end', function() {
+    console.log('\n')
+    process.exit();
+  });
+  // response.on('data', function(chunk) {
+  //   data += chunk.toString('utf8');
+  // });
+  // response.on('end', function() {
+  //   console.log('Response Data:')
+  //   console.log(data);
+  //   process.exit();
+  // });
+})
+
+request.write('{"numbers":[1,2,3,4,5],"nested":{"key":"value"}}');
+request.end();
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/example/post.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/example/post.js
new file mode 100644
index 0000000..f6c15a6
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/example/post.js
@@ -0,0 +1,43 @@
+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(
+      '<form action="/post" method="post">'+
+      '<input type="text" name="title"><br>'+
+      '<input type="text" name="data[foo][]"><br>'+
+      '<input type="submit" value="Submit">'+
+      '</form>'
+    );
+  } 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/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/example/upload.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/example/upload.js
new file mode 100644
index 0000000..050cdd9
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/example/upload.js
@@ -0,0 +1,48 @@
+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(
+      '<form action="/upload" enctype="multipart/form-data" method="post">'+
+      '<input type="text" name="title"><br>'+
+      '<input type="file" name="upload" multiple="multiple"><br>'+
+      '<input type="submit" value="Upload">'+
+      '</form>'
+    );
+  } 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/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/index.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/index.js
new file mode 100644
index 0000000..4cc88b3
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/index.js
@@ -0,0 +1 @@
+module.exports = require('./lib');
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/lib/file.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/lib/file.js
new file mode 100644
index 0000000..e34c10e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/lib/file.js
@@ -0,0 +1,72 @@
+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);
+  } else {
+    this.hash = null;
+  }
+}
+module.exports = File;
+util.inherits(File, EventEmitter);
+
+File.prototype.open = function() {
+  this._writeStream = new WriteStream(this.path);
+};
+
+File.prototype.toJSON = function() {
+  return {
+    size: this.size,
+    path: this.path,
+    name: this.name,
+    type: this.type,
+    mtime: this.lastModifiedDate,
+    length: this.length,
+    filename: this.filename,
+    mime: this.mime
+  };
+};
+
+File.prototype.write = function(buffer, cb) {
+  var self = this;
+  if (self.hash) {
+    self.hash.update(buffer);
+  }
+  this._writeStream.write(buffer, function() {
+    self.lastModifiedDate = new Date();
+    self.size += buffer.length;
+    self.emit('progress', self.size);
+    cb();
+  });
+};
+
+File.prototype.end = function(cb) {
+  var self = this;
+  if (self.hash) {
+    self.hash = self.hash.digest('hex');
+  }
+  this._writeStream.end(function() {
+    self.emit('end');
+    cb();
+  });
+};
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/lib/incoming_form.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/lib/incoming_form.js
new file mode 100644
index 0000000..c2eeaf8
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/lib/incoming_form.js
@@ -0,0 +1,535 @@
+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,
+    OctetParser       = require('./octet_parser').OctetParser,
+    JSONParser = require('./json_parser').JSONParser,
+    StringDecoder = require('string_decoder').StringDecoder,
+    EventEmitter = require('events').EventEmitter,
+    Stream = require('stream').Stream,
+    os = require('os');
+
+function IncomingForm(opts) {
+  if (!(this instanceof IncomingForm)) return new IncomingForm(opts);
+  EventEmitter.call(this);
+
+  opts=opts||{};
+
+  this.error = null;
+  this.ended = false;
+
+  this.maxFields = opts.maxFields || 1000;
+  this.maxFieldsSize = opts.maxFieldsSize || 2 * 1024 * 1024;
+  this.keepExtensions = opts.keepExtensions || false;
+  this.uploadDir = opts.uploadDir || os.tmpDir();
+  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;
+  this.openedFiles = [];
+
+  return this;
+};
+util.inherits(IncomingForm, EventEmitter);
+exports.IncomingForm = IncomingForm;
+
+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;
+  };
+
+  // Setup callback first, so we don't miss anything from data events emitted
+  // immediately.
+  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);
+      });
+  }
+
+  // Parse headers and setup the parser, ready to start listening for data.
+  this.writeHeaders(req.headers);
+
+  // Start listening for data.
+  var self = this;
+  req
+    .on('error', function(err) {
+      self._error(err);
+    })
+    .on('aborted', function() {
+      self.emit('aborted');
+      self._error(new Error('Request 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);
+      }
+    });
+
+  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();
+  this.openedFiles.push(file);
+
+  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();
+    });
+  });
+};
+
+function dummyParser(self) {
+  return {
+    end: function () {
+      self.ended = true;
+      self._maybeEnd();
+      return null;
+    }
+  };
+}
+
+IncomingForm.prototype._parseContentType = function() {
+  if (this.bytesExpected === 0) {
+    this._parser = dummyParser(this);
+    return;
+  }
+
+  if (!this.headers['content-type']) {
+    this._error(new Error('bad content-type header, no content-type'));
+    return;
+  }
+
+  if (this.headers['content-type'].match(/octet-stream/i)) {
+    this._initOctetStream();
+    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;
+  }
+
+  if (this.headers['content-type'].match(/json/i)) {
+    this._initJSONencoded();
+    return;
+  }
+
+  this._error(new Error('bad content-type header, unknown content-type: '+this.headers['content-type']));
+};
+
+IncomingForm.prototype._error = function(err) {
+  if (this.error || this.ended) {
+    return;
+  }
+
+  this.error = err;
+  this.pause();
+  this.emit('error', err);
+
+  if (Array.isArray(this.openedFiles)) {
+    this.openedFiles.forEach(function(file) {
+      file._writeStream.destroy();
+      setTimeout(fs.unlink, 0, file.path);
+    });
+  }
+};
+
+IncomingForm.prototype._parseContentLength = function() {
+  this.bytesReceived = 0;
+  if (this.headers['content-length']) {
+    this.bytesExpected = parseInt(this.headers['content-length'], 10);
+  } else if (this.headers['transfer-encoding'] === undefined) {
+    this.bytesExpected = 0;
+  }
+
+  if (this.bytesExpected !== null) {
+    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;
+
+    part.transferEncoding = 'binary';
+    part.transferBuffer = '';
+
+    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(/\bname="([^"]+)"/i)) {
+        part.name = m[1];
+      }
+
+      part.filename = self._fileName(headerValue);
+    } else if (headerField == 'content-type') {
+      part.mime = headerValue;
+    } else if (headerField == 'content-transfer-encoding') {
+      part.transferEncoding = headerValue.toLowerCase();
+    }
+
+    headerField = '';
+    headerValue = '';
+  };
+
+  parser.onHeadersEnd = function() {
+    switch(part.transferEncoding){
+      case 'binary':
+      case '7bit':
+      case '8bit':
+      parser.onPartData = function(b, start, end) {
+        part.emit('data', b.slice(start, end));
+      };
+
+      parser.onPartEnd = function() {
+        part.emit('end');
+      };
+      break;
+
+      case 'base64':
+      parser.onPartData = function(b, start, end) {
+        part.transferBuffer += b.slice(start, end).toString('ascii');
+
+        /*
+        four bytes (chars) in base64 converts to three bytes in binary
+        encoding. So we should always work with a number of bytes that
+        can be divided by 4, it will result in a number of buytes that
+        can be divided vy 3.
+        */
+        var offset = parseInt(part.transferBuffer.length / 4) * 4;
+        part.emit('data', new Buffer(part.transferBuffer.substring(0, offset), 'base64'))
+        part.transferBuffer = part.transferBuffer.substring(offset);
+      };
+
+      parser.onPartEnd = function() {
+        part.emit('data', new Buffer(part.transferBuffer, 'base64'))
+        part.emit('end');
+      };
+      break;
+
+      default:
+      return self._error(new Error('unknown transfer-encoding'));
+    }
+
+    self.onPart(part);
+  };
+
+
+  parser.onEnd = function() {
+    self.ended = true;
+    self._maybeEnd();
+  };
+
+  this._parser = parser;
+};
+
+IncomingForm.prototype._fileName = function(headerValue) {
+  var m = headerValue.match(/\bfilename="(.*?)"($|; )/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(this.maxFields)
+    , 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._initOctetStream = function() {
+  this.type = 'octet-stream';
+  var filename = this.headers['x-file-name'];
+  var mime = this.headers['content-type'];
+
+  var file = new File({
+    path: this._uploadPath(filename),
+    name: filename,
+    type: mime
+  });
+
+  file.open();
+
+  this.emit('fileBegin', filename, file);
+
+  this._flushing++;
+
+  var self = this;
+
+  self._parser = new OctetParser();
+
+  //Keep track of writes that haven't finished so we don't emit the file before it's done being written
+  var outstandingWrites = 0;
+
+  self._parser.on('data', function(buffer){
+    self.pause();
+    outstandingWrites++;
+
+    file.write(buffer, function() {
+      outstandingWrites--;
+      self.resume();
+
+      if(self.ended){
+        self._parser.emit('doneWritingFile');
+      }
+    });
+  });
+
+  self._parser.on('end', function(){
+    self._flushing--;
+    self.ended = true;
+
+    var done = function(){
+      self.emit('file', 'file', file);
+      self._maybeEnd();
+    };
+
+    if(outstandingWrites === 0){
+      done();
+    } else {
+      self._parser.once('doneWritingFile', done);
+    }
+  });
+};
+
+IncomingForm.prototype._initJSONencoded = function() {
+  this.type = 'json';
+
+  var parser = new JSONParser()
+    , self = this;
+
+  if (this.bytesExpected) {
+    parser.initWithLength(this.bytesExpected);
+  }
+
+  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 || this.error) {
+    return;
+  }
+
+  this.emit('end');
+};
+
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/lib/index.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/lib/index.js
new file mode 100644
index 0000000..7a6e3e1
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/lib/index.js
@@ -0,0 +1,3 @@
+var IncomingForm = require('./incoming_form').IncomingForm;
+IncomingForm.IncomingForm = IncomingForm;
+module.exports = IncomingForm;
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/lib/json_parser.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/lib/json_parser.js
new file mode 100644
index 0000000..6ce966b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/lib/json_parser.js
@@ -0,0 +1,35 @@
+if (global.GENTLY) require = GENTLY.hijack(require);
+
+var Buffer = require('buffer').Buffer
+
+function JSONParser() {
+  this.data = new Buffer('');
+  this.bytesWritten = 0;
+};
+exports.JSONParser = JSONParser;
+
+JSONParser.prototype.initWithLength = function(length) {
+  this.data = new Buffer(length);
+}
+
+JSONParser.prototype.write = function(buffer) {
+  if (this.data.length >= this.bytesWritten + buffer.length) {
+    buffer.copy(this.data, this.bytesWritten);
+  } else {
+    this.data = Buffer.concat([this.data, buffer]);
+  }
+  this.bytesWritten += buffer.length;
+  return buffer.length;
+}
+
+JSONParser.prototype.end = function() {
+  try {
+    var fields = JSON.parse(this.data.toString('utf8'))
+    for (var field in fields) {
+      this.onField(field, fields[field]);
+    }
+  } catch (e) {}
+  this.data = null;
+
+  this.onEnd();
+}
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/lib/multipart_parser.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/lib/multipart_parser.js
new file mode 100644
index 0000000..98a6856
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/lib/multipart_parser.js
@@ -0,0 +1,324 @@
+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 (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]) {
+          index = -2;
+        }
+        if (c == boundary[index+2]) {
+          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() {
+  var callback = function(self, name) {
+    var callbackSymbol = 'on'+name.substr(0, 1).toUpperCase()+name.substr(1);
+    if (callbackSymbol in self) {
+      self[callbackSymbol]();
+    }
+  };
+  if ((this.state == S.HEADER_FIELD_START && this.index == 0) ||
+      (this.state == S.PART_DATA && this.index == this.boundary.length)) {
+    callback(this, 'partEnd');
+    callback(this, 'end');
+  } else 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/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/lib/octet_parser.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/lib/octet_parser.js
new file mode 100644
index 0000000..6e8b551
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/lib/octet_parser.js
@@ -0,0 +1,20 @@
+var EventEmitter = require('events').EventEmitter
+	, util = require('util');
+
+function OctetParser(options){
+	if(!(this instanceof OctetParser)) return new OctetParser(options);
+	EventEmitter.call(this);
+}
+
+util.inherits(OctetParser, EventEmitter);
+
+exports.OctetParser = OctetParser;
+
+OctetParser.prototype.write = function(buffer) {
+    this.emit('data', buffer);
+	return buffer.length;
+};
+
+OctetParser.prototype.end = function() {
+	this.emit('end');
+};
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/lib/querystring_parser.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/lib/querystring_parser.js
new file mode 100644
index 0000000..320ce5a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/lib/querystring_parser.js
@@ -0,0 +1,27 @@
+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(maxKeys) {
+  this.maxKeys = maxKeys;
+  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, '&', '=', { maxKeys: this.maxKeys });
+  for (var field in fields) {
+    this.onField(field, fields[field]);
+  }
+  this.buffer = '';
+
+  this.onEnd();
+};
+
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/package.json b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/package.json
new file mode 100644
index 0000000..b2ab74d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/package.json
@@ -0,0 +1,38 @@
+{
+  "name": "formidable",
+  "description": "A node.js module for parsing form data, especially file uploads.",
+  "homepage": "https://github.com/felixge/node-formidable",
+  "version": "1.0.14",
+  "devDependencies": {
+    "gently": "0.8.0",
+    "findit": "0.1.1",
+    "hashish": "0.0.4",
+    "urun": "~0.0.6",
+    "utest": "0.0.3",
+    "request": "~2.11.4"
+  },
+  "directories": {
+    "lib": "./lib"
+  },
+  "main": "./lib/index",
+  "scripts": {
+    "test": "node test/run.js",
+    "clean": "rm test/tmp/*"
+  },
+  "engines": {
+    "node": ">=0.8.0"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/felixge/node-formidable.git"
+  },
+  "bugs": {
+    "url": "http://github.com/felixge/node-formidable/issues"
+  },
+  "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  [...]
+  "readmeFilename": "Readme.md",
+  "dependencies": {},
+  "_id": "formidable at 1.0.14",
+  "_from": "formidable at 1.0.x"
+}
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/tool/record.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/tool/record.js
new file mode 100644
index 0000000..9f1cef8
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/node_modules/formidable/tool/record.js
@@ -0,0 +1,47 @@
+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(
+      '<form action="/upload" enctype="multipart/form-data" method="post">'+
+      '<input type="text" name="title"><br>'+
+      '<input type="file" name="upload" multiple="multiple"><br>'+
+      '<input type="submit" value="Upload">'+
+      '</form>'
+    );
+  });
+});
+
+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/debian/node_modules/bones/node_modules/express/node_modules/connect/package.json b/debian/node_modules/bones/node_modules/express/node_modules/connect/package.json
new file mode 100644
index 0000000..33de2f9
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/package.json
@@ -0,0 +1,45 @@
+{
+  "name": "connect",
+  "version": "1.9.2",
+  "description": "High performance middleware framework",
+  "keywords": [
+    "framework",
+    "web",
+    "middleware",
+    "connect",
+    "rack"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/senchalabs/connect"
+  },
+  "author": {
+    "name": "TJ Holowaychuk",
+    "email": "tj at vision-media.ca",
+    "url": "http://tjholowaychuk.com"
+  },
+  "dependencies": {
+    "qs": ">= 0.4.0",
+    "mime": ">= 0.0.1",
+    "formidable": "1.0.x"
+  },
+  "devDependencies": {
+    "expresso": "0.9.2",
+    "koala": "0.1.2",
+    "less": "1.1.1",
+    "sass": "0.5.0",
+    "markdown": "0.2.1",
+    "ejs": "0.4.3",
+    "should": "0.3.2"
+  },
+  "publishConfig": {
+    "tag": "1.8"
+  },
+  "main": "index",
+  "bugs": {
+    "url": "https://github.com/senchalabs/connect/issues"
+  },
+  "readme": "ERROR: No README data found!",
+  "_id": "connect at 1.9.2",
+  "_from": "connect at 1.x"
+}
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/connect/test.js b/debian/node_modules/bones/node_modules/express/node_modules/connect/test.js
new file mode 100644
index 0000000..106ddd1
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/connect/test.js
@@ -0,0 +1,15 @@
+
+/**
+ * Module dependencies.
+ */
+
+var connect = require('./');
+
+var app = connect()
+  .use(connect.logger('dev'))
+  .use(function(req, res){
+    var body = Array(3222).join('hey');
+    res.setHeader('Content-Length', body.length);
+    res.end(body);
+  })
+  .listen(3000);
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/mime/LICENSE b/debian/node_modules/bones/node_modules/express/node_modules/mime/LICENSE
new file mode 100644
index 0000000..451fc45
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/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/debian/node_modules/bones/node_modules/express/node_modules/mime/README.md b/debian/node_modules/bones/node_modules/express/node_modules/mime/README.md
new file mode 100644
index 0000000..a157de1
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/mime/README.md
@@ -0,0 +1,50 @@
+# mime
+
+Support for mapping between file extensions and MIME types.  This module uses the latest version of the Apache "mime.types" file (maps over 620 types to 800+ extensions).  It is also trivially easy to add your own types and extensions, should you need to do that.
+
+## 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. This is method is case-insensitive. Everything in path up to and including the last '/' or '.' is ignored, so you can pass it paths, filenames, or extensions, like so:
+
+    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) - lookup 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 - Customizing
+
+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'
+    mime.extension('text/x-some-format'); // => 'x-sf'
+
+### mime.load(filepath) - Load mappings from an Apache ".types" format file
+
+    mime.load('./my_project.types');
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/mime/mime.js b/debian/node_modules/bones/node_modules/express/node_modules/mime/mime.js
new file mode 100644
index 0000000..5fac753
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/mime/mime.js
@@ -0,0 +1,92 @@
+var path = require('path'),
+    fs = require('fs');
+
+var mime = module.exports = {
+  /** Map of extension to mime type */
+  types: {},
+
+  /** Map of mime type to extension */
+  extensions :{},
+
+  /**
+   * 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
+   */
+  define: function(map) {
+    for (var type in map) {
+      var exts = map[type];
+
+      for (var i = 0; i < exts.length; i++) {
+        mime.types[exts[i]] = type;
+      }
+
+      // Default extension is the first one we encounter
+      if (!mime.extensions[type]) {
+        mime.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.
+   */
+  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, lineno) {
+      // Clean up whitespace/comments, and split into fields
+      var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/);
+      map[fields.shift()] = fields;
+    });
+
+    mime.define(map);
+  },
+
+  /**
+   * Lookup a mime type based on extension
+   */
+  lookup: function(path, fallback) {
+    var ext = path.replace(/.*[\.\/]/, '').toLowerCase();
+    return mime.types[ext] || fallback || mime.default_type;
+  },
+
+  /**
+   * Return file extension associated with a mime type
+   */
+  extension: function(mimeType) {
+    return mime.extensions[mimeType];
+  },
+
+  /**
+   * Lookup a charset based on mime type.
+   */
+  charsets: {
+    lookup: function (mimeType, fallback) {
+      // Assume text types are utf8.  Modify mime logic as needed.
+      return (/^text\//).test(mimeType) ? 'UTF-8' : fallback;
+    }
+  }
+};
+
+// Load our local copy of
+// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
+mime.load(path.join(__dirname, 'types/mime.types'));
+
+// Overlay enhancements submitted by the node.js community
+mime.load(path.join(__dirname, 'types/node.types'));
+
+// Set the default type
+mime.default_type = mime.types.bin;
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/mime/package.json b/debian/node_modules/bones/node_modules/express/node_modules/mime/package.json
new file mode 100644
index 0000000..6a8990e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/mime/package.json
@@ -0,0 +1,37 @@
+{
+  "author": {
+    "name": "Robert Kieffer",
+    "email": "robert at broofa.com",
+    "url": "http://github.com/broofa"
+  },
+  "contributors": [
+    {
+      "name": "Benjamin Thomas",
+      "email": "benjamin at benjaminthomas.org",
+      "url": "http://github.com/bentomas"
+    }
+  ],
+  "dependencies": {},
+  "description": "A comprehensive library for mime-type mapping",
+  "devDependencies": {
+    "async_testing": ""
+  },
+  "keywords": [
+    "util",
+    "mime"
+  ],
+  "main": "mime.js",
+  "name": "mime",
+  "repository": {
+    "url": "http://github.com/bentomas/node-mime",
+    "type": "git"
+  },
+  "version": "1.2.4",
+  "readme": "# mime\n\nSupport for mapping between file extensions and MIME types.  This module uses the latest version of the Apache \"mime.types\" file (maps over 620 types to 800+ extensions).  It is also trivially easy to add your own types and extensions, should you need to do that.\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. This is method is case-i [...]
+  "readmeFilename": "README.md",
+  "bugs": {
+    "url": "https://github.com/bentomas/node-mime/issues"
+  },
+  "_id": "mime at 1.2.4",
+  "_from": "mime at 1.2.4"
+}
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/mime/test.js b/debian/node_modules/bones/node_modules/express/node_modules/mime/test.js
new file mode 100644
index 0000000..b904895
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/mime/test.js
@@ -0,0 +1,79 @@
+/**
+ * Requires the async_testing module
+ *
+ * Usage: node test.js
+ */
+var mime = require('./mime');
+exports["test mime lookup"] = function(test) {
+  // easy
+  test.equal('text/plain', mime.lookup('text.txt'));
+
+  // hidden file or multiple periods
+  test.equal('text/plain', mime.lookup('.text.txt'));
+
+  // just an extension
+  test.equal('text/plain', mime.lookup('.txt'));
+
+  // just an extension without a dot
+  test.equal('text/plain', mime.lookup('txt'));
+
+  // default
+  test.equal('application/octet-stream', mime.lookup('text.nope'));
+
+  // fallback
+  test.equal('fallback', mime.lookup('text.fallback', 'fallback'));
+
+  test.finish();
+};
+
+exports["test extension lookup"] = function(test) {
+  // easy
+  test.equal('txt', mime.extension(mime.types.text));
+  test.equal('html', mime.extension(mime.types.htm));
+  test.equal('bin', mime.extension('application/octet-stream'));
+
+  test.finish();
+};
+
+exports["test mime lookup uppercase"] = function(test) {
+  // easy
+  test.equal('text/plain', mime.lookup('TEXT.TXT'));
+
+  // just an extension
+  test.equal('text/plain', mime.lookup('.TXT'));
+
+  // just an extension without a dot
+  test.equal('text/plain', mime.lookup('TXT'));
+
+  // default
+  test.equal('application/octet-stream', mime.lookup('TEXT.NOPE'));
+
+  // fallback
+  test.equal('fallback', mime.lookup('TEXT.FALLBACK', 'fallback'));
+
+  test.finish();
+};
+
+exports["test custom types"] = function(test) {
+  test.equal('application/octet-stream', mime.lookup('file.buffer'));
+  test.equal('audio/mp4', mime.lookup('file.m4a'));
+
+  test.finish();
+};
+
+exports["test charset lookup"] = function(test) {
+  // easy
+  test.equal('UTF-8', mime.charsets.lookup('text/plain'));
+
+  // none
+  test.ok(typeof mime.charsets.lookup(mime.types.js) == 'undefined');
+
+  // fallback
+  test.equal('fallback', mime.charsets.lookup('application/octet-stream', 'fallback'));
+
+  test.finish();
+};
+
+if (module == require.main) {
+  require('async_testing').run(__filename, process.ARGV);
+}
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/mime/types/mime.types b/debian/node_modules/bones/node_modules/express/node_modules/mime/types/mime.types
new file mode 100644
index 0000000..6a90929
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/mime/types/mime.types
@@ -0,0 +1,1479 @@
+# 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 <http://www.iana.org/assignments/media-types/>.
+#
+# 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/cals-1840
+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/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/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/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/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.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.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.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.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.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+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.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.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-pcc+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.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.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.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.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/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/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/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.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/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/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.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.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/debian/node_modules/bones/node_modules/express/node_modules/mime/types/node.types b/debian/node_modules/bones/node_modules/express/node_modules/mime/types/node.types
new file mode 100644
index 0000000..fdabaa4
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/mime/types/node.types
@@ -0,0 +1,43 @@
+# 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
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/mkdirp/.npmignore b/debian/node_modules/bones/node_modules/express/node_modules/mkdirp/.npmignore
new file mode 100644
index 0000000..9303c34
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/mkdirp/.npmignore
@@ -0,0 +1,2 @@
+node_modules/
+npm-debug.log
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/mkdirp/LICENSE b/debian/node_modules/bones/node_modules/express/node_modules/mkdirp/LICENSE
new file mode 100644
index 0000000..432d1ae
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/mkdirp/LICENSE
@@ -0,0 +1,21 @@
+Copyright 2010 James Halliday (mail at 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/debian/node_modules/bones/node_modules/express/node_modules/mkdirp/README.markdown b/debian/node_modules/bones/node_modules/express/node_modules/mkdirp/README.markdown
new file mode 100644
index 0000000..b4dd75f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/mkdirp/README.markdown
@@ -0,0 +1,54 @@
+mkdirp
+======
+
+Like `mkdir -p`, but in node.js!
+
+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())`.
+
+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())`.
+
+install
+=======
+
+With [npm](http://npmjs.org) do:
+
+    npm install mkdirp
+
+license
+=======
+
+MIT/X11
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/mkdirp/examples/pow.js b/debian/node_modules/bones/node_modules/express/node_modules/mkdirp/examples/pow.js
new file mode 100644
index 0000000..e692421
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/mkdirp/examples/pow.js
@@ -0,0 +1,6 @@
+var mkdirp = require('mkdirp');
+
+mkdirp('/tmp/foo/bar/baz', function (err) {
+    if (err) console.error(err)
+    else console.log('pow!')
+});
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/mkdirp/index.js b/debian/node_modules/bones/node_modules/express/node_modules/mkdirp/index.js
new file mode 100644
index 0000000..25f43ad
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/mkdirp/index.js
@@ -0,0 +1,79 @@
+var path = require('path');
+var fs = require('fs');
+
+module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP;
+
+function mkdirP (p, mode, f) {
+    if (typeof mode === 'function' || mode === undefined) {
+        f = mode;
+        mode = 0777 & (~process.umask());
+    }
+    
+    var cb = f || function () {};
+    if (typeof mode === 'string') mode = parseInt(mode, 8);
+    p = path.resolve(p);
+
+    fs.mkdir(p, mode, function (er) {
+        if (!er) return cb();
+        switch (er.code) {
+            case 'ENOENT':
+                mkdirP(path.dirname(p), mode, function (er) {
+                    if (er) cb(er);
+                    else mkdirP(p, mode, cb);
+                });
+                break;
+
+            case 'EEXIST':
+                fs.stat(p, function (er2, stat) {
+                    // if the stat fails, then that's super weird.
+                    // let the original EEXIST be the failure reason.
+                    if (er2 || !stat.isDirectory()) cb(er)
+                    else cb();
+                });
+                break;
+
+            default:
+                cb(er);
+                break;
+        }
+    });
+}
+
+mkdirP.sync = function sync (p, mode) {
+    if (mode === undefined) {
+        mode = 0777 & (~process.umask());
+    }
+    
+    if (typeof mode === 'string') mode = parseInt(mode, 8);
+    p = path.resolve(p);
+    
+    try {
+        fs.mkdirSync(p, mode)
+    }
+    catch (err0) {
+        switch (err0.code) {
+            case 'ENOENT' :
+                var err1 = sync(path.dirname(p), mode)
+                if (err1) throw err1;
+                else return sync(p, mode);
+                break;
+            
+            case 'EEXIST' :
+                var stat;
+                try {
+                    stat = fs.statSync(p);
+                }
+                catch (err1) {
+                    throw err0
+                }
+                if (!stat.isDirectory()) throw err0;
+                else return null;
+                break;
+            default :
+                throw err0
+                break;
+        }
+    }
+    
+    return null;
+};
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/mkdirp/package.json b/debian/node_modules/bones/node_modules/express/node_modules/mkdirp/package.json
new file mode 100644
index 0000000..1cbc0c7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/mkdirp/package.json
@@ -0,0 +1,36 @@
+{
+  "name": "mkdirp",
+  "description": "Recursively mkdir, like `mkdir -p`",
+  "version": "0.3.0",
+  "author": {
+    "name": "James Halliday",
+    "email": "mail at 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.0.x"
+  },
+  "license": "MIT/X11",
+  "engines": {
+    "node": "*"
+  },
+  "readme": "mkdirp\n======\n\nLike `mkdir -p`, but in node.js!\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 subdire [...]
+  "readmeFilename": "README.markdown",
+  "bugs": {
+    "url": "https://github.com/substack/node-mkdirp/issues"
+  },
+  "_id": "mkdirp at 0.3.0",
+  "_from": "mkdirp at 0.3.0"
+}
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/qs/.npmignore b/debian/node_modules/bones/node_modules/express/node_modules/qs/.npmignore
new file mode 100644
index 0000000..3c3629e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/qs/.npmignore
@@ -0,0 +1 @@
+node_modules
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/qs/.travis.yml b/debian/node_modules/bones/node_modules/express/node_modules/qs/.travis.yml
new file mode 100644
index 0000000..2c0a8f6
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/qs/.travis.yml
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+  - 0.6
+  - 0.4
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/qs/History.md b/debian/node_modules/bones/node_modules/express/node_modules/qs/History.md
new file mode 100644
index 0000000..3eaf7df
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/qs/History.md
@@ -0,0 +1,73 @@
+
+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/debian/node_modules/bones/node_modules/express/node_modules/qs/Makefile b/debian/node_modules/bones/node_modules/express/node_modules/qs/Makefile
new file mode 100644
index 0000000..e4df837
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/qs/Makefile
@@ -0,0 +1,5 @@
+
+test:
+	@./node_modules/.bin/mocha
+
+.PHONY: test
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/qs/Readme.md b/debian/node_modules/bones/node_modules/express/node_modules/qs/Readme.md
new file mode 100644
index 0000000..db0d145
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/qs/Readme.md
@@ -0,0 +1,54 @@
+# node-querystring
+
+  query string parser for node 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 at learnboost.com');
+// => { user: { name: { first: 'Tobi' }, email: 'tobi at learnboost.com' } }
+
+qs.stringify({ user: { name: 'Tobi', email: 'tobi at learnboost.com' }})
+// => user[name]=Tobi&user[email]=tobi%40learnboost.com
+```
+
+## Testing
+
+Install dev dependencies:
+
+    $ npm install -d
+
+and execute:
+
+    $ make test
+
+## License 
+
+(The MIT License)
+
+Copyright (c) 2010 TJ Holowaychuk <tj at 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/debian/node_modules/bones/node_modules/express/node_modules/qs/benchmark.js b/debian/node_modules/bones/node_modules/express/node_modules/qs/benchmark.js
new file mode 100644
index 0000000..97e2c93
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/qs/benchmark.js
@@ -0,0 +1,17 @@
+
+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/debian/node_modules/bones/node_modules/express/node_modules/qs/examples.js b/debian/node_modules/bones/node_modules/express/node_modules/qs/examples.js
new file mode 100644
index 0000000..27617b7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/qs/examples.js
@@ -0,0 +1,51 @@
+
+/**
+ * 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 at 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 at learnboost.com' }});
+console.log(str);
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/qs/index.js b/debian/node_modules/bones/node_modules/express/node_modules/qs/index.js
new file mode 100644
index 0000000..d177d20
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/qs/index.js
@@ -0,0 +1,2 @@
+
+module.exports = require('./lib/querystring');
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/qs/lib/querystring.js b/debian/node_modules/bones/node_modules/express/node_modules/qs/lib/querystring.js
new file mode 100644
index 0000000..6c72712
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/qs/lib/querystring.js
@@ -0,0 +1,264 @@
+
+/*!
+ * querystring
+ * Copyright(c) 2010 TJ Holowaychuk <tj at vision-media.ca>
+ * MIT Licensed
+ */
+
+/**
+ * Library version.
+ */
+
+exports.version = '0.4.2';
+
+/**
+ * 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 + '[]'));
+  }
+  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;
+  }
+}
diff --git a/debian/node_modules/bones/node_modules/express/node_modules/qs/package.json b/debian/node_modules/bones/node_modules/express/node_modules/qs/package.json
new file mode 100644
index 0000000..e8c9120
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/node_modules/qs/package.json
@@ -0,0 +1,29 @@
+{
+  "name": "qs",
+  "description": "querystring parser",
+  "version": "0.4.2",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/visionmedia/node-querystring.git"
+  },
+  "devDependencies": {
+    "mocha": "*",
+    "should": "*"
+  },
+  "author": {
+    "name": "TJ Holowaychuk",
+    "email": "tj at vision-media.ca",
+    "url": "http://tjholowaychuk.com"
+  },
+  "main": "index",
+  "engines": {
+    "node": "*"
+  },
+  "readme": "# node-querystring\n\n  query string parser for node 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 at learnboost.com');\n// => { user: { nam [...]
+  "readmeFilename": "Readme.md",
+  "bugs": {
+    "url": "https://github.com/visionmedia/node-querystring/issues"
+  },
+  "_id": "qs at 0.4.2",
+  "_from": "qs at 0.4.x"
+}
diff --git a/debian/node_modules/bones/node_modules/express/package.json b/debian/node_modules/bones/node_modules/express/package.json
new file mode 100644
index 0000000..b37d966
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/package.json
@@ -0,0 +1,71 @@
+{
+  "name": "express",
+  "description": "Sinatra inspired web development framework",
+  "version": "2.5.11",
+  "author": {
+    "name": "TJ Holowaychuk",
+    "email": "tj at vision-media.ca"
+  },
+  "contributors": [
+    {
+      "name": "TJ Holowaychuk",
+      "email": "tj at vision-media.ca"
+    },
+    {
+      "name": "Aaron Heckmann",
+      "email": "aaron.heckmann+github at gmail.com"
+    },
+    {
+      "name": "Ciaran Jessup",
+      "email": "ciaranj at gmail.com"
+    },
+    {
+      "name": "Guillermo Rauch",
+      "email": "rauchg at gmail.com"
+    }
+  ],
+  "dependencies": {
+    "connect": "1.x",
+    "mime": "1.2.4",
+    "qs": "0.4.x",
+    "mkdirp": "0.3.0"
+  },
+  "devDependencies": {
+    "connect-form": "0.2.1",
+    "ejs": "0.4.2",
+    "expresso": "0.9.2",
+    "hamljs": "0.6.x",
+    "jade": "0.16.2",
+    "stylus": "0.13.0",
+    "should": "0.3.2",
+    "express-messages": "0.0.2",
+    "node-markdown": ">= 0.0.1",
+    "connect-redis": ">= 0.0.1"
+  },
+  "keywords": [
+    "framework",
+    "sinatra",
+    "web",
+    "rest",
+    "restful"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/visionmedia/express"
+  },
+  "main": "index",
+  "bin": {
+    "express": "./bin/express"
+  },
+  "scripts": {
+    "test": "make test",
+    "prepublish": "npm prune"
+  },
+  "readme": "\n# Express\n      \n  Insanely fast (and small) server-side JavaScript web development framework\n  built on [node](http://nodejs.org) and [Connect](http://github.com/senchalabs/connect).\n  \n     var app = express.createServer();\n     \n     app.get('/', function(req, res){\n       res.send('Hello World');\n     });\n     \n     app.listen(3000);\n\n## Installation\n\n    $ npm install express\n\nor to access the `express(1)` executable install globally:\n\n    $ npm ins [...]
+  "readmeFilename": "Readme.md",
+  "bugs": {
+    "url": "https://github.com/visionmedia/express/issues"
+  },
+  "_id": "express at 2.5.11",
+  "_from": "express@~2.5.11"
+}
diff --git a/debian/node_modules/bones/node_modules/express/test.js b/debian/node_modules/bones/node_modules/express/test.js
new file mode 100644
index 0000000..1f5ac01
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/express/test.js
@@ -0,0 +1,12 @@
+
+var express = require('./');
+var app = express.createServer();
+
+app.use(express.logger('dev'));
+
+app.get('/', function(req, res){
+  console.log(req.protocol);
+  res.send('hello');
+});
+
+app.listen(3000);
diff --git a/debian/node_modules/bones/node_modules/jquery/node-jquery.js b/debian/node_modules/bones/node_modules/jquery/node-jquery.js
new file mode 100644
index 0000000..6bb0793
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node-jquery.js
@@ -0,0 +1,9068 @@
+(function () {
+function create(window) {
+  var location, navigator, XMLHttpRequest;
+
+  window = window || require('jsdom').jsdom().createWindow();
+  location = window.location || require('location');
+  navigator = window.navigator || require('navigator');
+
+  if (!window.XMLHttpRequest && 'function' !== typeof window.ActiveXObject) {
+    window.XMLHttpRequest = require('xmlhttprequest'); // require('XMLHttpRequest');
+    // TODO repackage XMLHttpRequest
+  }
+
+  // end npm / ender header
+
+/*!
+ * jQuery JavaScript Library v1.6.3
+ * 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 Sep 1 11:40:27 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
+	// Prioritize #id over <tag> 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+$/,
+
+	// 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]|[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.6.3",
+
+	// 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;
+		}
+
+		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 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'
+			// 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 ( !array ) {
+			return -1;
+		}
+
+		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 + "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 ) {
+					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 = "   <link><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type=checkbox>";
+
+
+	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,
+		background: "none"
+	};
+	if ( body ) {
+		jQuery.extend( testElementStyle, {
+			position: "absolute",
+			left: "-1000px",
+			top: "-1000px"
+		});
+	}
+	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 = "<div style='width:4px;'></div>";
+		support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
+	}
+
+	div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
+	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 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[ 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 ] && !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;
+		}
+
+		// 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,
+
+			// 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[ 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 ) {
+
+			thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];
+
+			if ( thisCache ) {
+
+				// Support interoperable removal of hyphenated or camelcased keys
+				if ( !thisCache[ name ] ) {
+					name = jQuery.camelCase( name );
+				}
+
+				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
+		// 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 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,
+	nodeHook, 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].nodeType === 1 && (" " + 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 nodeHook if available( IE6/7 )
+				} else if ( nodeHook ) {
+					hooks = nodeHook;
+				}
+			}
+		}
+
+		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;
+
+			jQuery.attr( elem, name, "" );
+			elem.removeAttribute( 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;
+				}
+			}
+		},
+		// 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 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 )) !== 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
+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;
+		return jQuery.prop( elem, name ) === true || ( 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 ( !jQuery.support.getSetAttribute ) {
+	
+	// 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 undefined if nodeValue is empty string
+			return ret && ret.nodeValue !== "" ?
+				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 + "");
+		}
+	};
+
+	// 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;
+				}
+			}
+			return null;
+		}
+	});
+}
+
+// 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 = jQuery.nodeName( elem, "input" ) ? 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 = jQuery.nodeName( elem, "input" ) ? 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 = jQuery.nodeName( elem, "input" ) ? 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 = "<a name='" + id + "'/>";
+
+	// 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 = "<a href='#'></a>";
+
+	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 = "<p class='TEST'></p>";
+
+		// 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 = "<div class='test e'></div><div class='test'></div>";
+
+	// 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 ) {
+
+		// 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 ),
+			// 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 = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnocache = /<(?:script|object|embed|option|style)/i,
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptType = /\/(java|ecma)script/i,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
+	wrapMap = {
+		option: [ 1, "<select multiple='multiple'>", "</select>" ],
+		legend: [ 1, "<fieldset>", "</fieldset>" ],
+		thead: [ 1, "<table>", "</table>" ],
+		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+		area: [ 1, "<map>", "</map>" ],
+		_default: [ 0, "", "" ]
+	};
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE can't serialize <link> and <script> tags normally
+if ( !jQuery.support.htmlSerialize ) {
+	wrapMap._default = [ 1, "div<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+	text: function( text ) {
+		if ( jQuery.isFunction(text) ) {
+			return this.each(function(i) {
+				var self = jQuery( this );
+
+				self.text( text.call(this, i, self.text()) );
+			});
+		}
+
+		if ( typeof text !== "object" && text !== undefined ) {
+			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
+		}
+
+		return jQuery.text( this );
+	},
+
+	wrapAll: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapAll( html.call(this, i) );
+			});
+		}
+
+		if ( this[0] ) {
+			// The elements to wrap the target around
+			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+			if ( this[0].parentNode ) {
+				wrap.insertBefore( this[0] );
+			}
+
+			wrap.map(function() {
+				var elem = this;
+
+				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				return elem;
+			}).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapInner( html.call(this, i) );
+			});
+		}
+
+		return this.each(function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		});
+	},
+
+	wrap: function( html ) {
+		return this.each(function() {
+			jQuery( this ).wrapAll( html );
+		});
+	},
+
+	unwrap: function() {
+		return this.parent().each(function() {
+			if ( !jQuery.nodeName( this, "body" ) ) {
+				jQuery( this ).replaceWith( this.childNodes );
+			}
+		}).end();
+	},
+
+	append: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.insertBefore( elem, this.firstChild );
+			}
+		});
+	},
+
+	before: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this );
+			});
+		} else if ( arguments.length ) {
+			var set = jQuery(arguments[0]);
+			set.push.apply( set, this.toArray() );
+			return this.pushStack( set, "before", arguments );
+		}
+	},
+
+	after: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			});
+		} else if ( arguments.length ) {
+			var set = this.pushStack( this, "after", arguments );
+			set.push.apply( set, jQuery(arguments[0]).toArray() );
+			return set;
+		}
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+				if ( !keepData && elem.nodeType === 1 ) {
+					jQuery.cleanData( elem.getElementsByTagName("*") );
+					jQuery.cleanData( [ elem ] );
+				}
+
+				if ( elem.parentNode ) {
+					elem.parentNode.removeChild( elem );
+				}
+			}
+		}
+
+		return this;
+	},
+
+	empty: function() {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( elem.getElementsByTagName("*") );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function () {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		});
+	},
+
+	html: function( value ) {
+		if ( value === undefined ) {
+			return this[0] && this[0].nodeType === 1 ?
+				this[0].innerHTML.replace(rinlinejQuery, "") :
+				null;
+
+		// See if we can take a shortcut and just use innerHTML
+		} else if ( typeof value === "string" && !rnocache.test( value ) &&
+			(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
+			!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
+
+			value = value.replace(rxhtmlTag, "<$1></$2>");
+
+			try {
+				for ( var i = 0, l = this.length; i < l; i++ ) {
+					// Remove element nodes and prevent memory leaks
+					if ( this[i].nodeType === 1 ) {
+						jQuery.cleanData( this[i].getElementsByTagName("*") );
+						this[i].innerHTML = value;
+					}
+				}
+
+			// If using innerHTML throws an exception, use the fallback method
+			} catch(e) {
+				this.empty().append( value );
+			}
+
+		} else if ( jQuery.isFunction( value ) ) {
+			this.each(function(i){
+				var self = jQuery( this );
+
+				self.html( value.call(this, i, self.html()) );
+			});
+
+		} else {
+			this.empty().append( value );
+		}
+
+		return this;
+	},
+
+	replaceWith: function( value ) {
+		if ( this[0] && this[0].parentNode ) {
+			// Make sure that the elements are removed from the DOM before they are inserted
+			// this can help fix replacing a parent with child elements
+			if ( jQuery.isFunction( value ) ) {
+				return this.each(function(i) {
+					var self = jQuery(this), old = self.html();
+					self.replaceWith( value.call( this, i, old ) );
+				});
+			}
+
+			if ( typeof value !== "string" ) {
+				value = jQuery( value ).detach();
+			}
+
+			return this.each(function() {
+				var next = this.nextSibling,
+					parent = this.parentNode;
+
+				jQuery( this ).remove();
+
+				if ( next ) {
+					jQuery(next).before( value );
+				} else {
+					jQuery(parent).append( value );
+				}
+			});
+		} else {
+			return this.length ?
+				this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+				this;
+		}
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, table, callback ) {
+		var results, first, fragment, parent,
+			value = args[0],
+			scripts = [];
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+			return this.each(function() {
+				jQuery(this).domManip( args, table, callback, true );
+			});
+		}
+
+		if ( jQuery.isFunction(value) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				args[0] = value.call(this, i, table ? self.html() : undefined);
+				self.domManip( args, table, callback );
+			});
+		}
+
+		if ( this[0] ) {
+			parent = value && value.parentNode;
+
+			// If we're in a fragment, just use that instead of building a new one
+			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+				results = { fragment: parent };
+
+			} else {
+				results = jQuery.buildFragment( args, this, scripts );
+			}
+
+			fragment = results.fragment;
+
+			if ( fragment.childNodes.length === 1 ) {
+				first = fragment = fragment.firstChild;
+			} else {
+				first = fragment.firstChild;
+			}
+
+			if ( first ) {
+				table = table && jQuery.nodeName( first, "tr" );
+
+				for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
+					callback.call(
+						table ?
+							root(this[i], first) :
+							this[i],
+						// Make sure that we do not leak memory by inadvertently discarding
+						// the original fragment (which might have attached data) instead of
+						// using it; in addition, use the original fragment object for the last
+						// item instead of first because it can end up being emptied incorrectly
+						// in certain situations (Bug #8070).
+						// Fragments from the fragment cache must always be cloned and never used
+						// in place.
+						results.cacheable || (l > 1 && i < lastIndex) ?
+							jQuery.clone( fragment, true, true ) :
+							fragment
+					);
+				}
+			}
+
+			if ( scripts.length ) {
+				jQuery.each( scripts, evalScript );
+			}
+		}
+
+		return this;
+	}
+});
+
+function root( elem, cur ) {
+	return jQuery.nodeName(elem, "table") ?
+		(elem.getElementsByTagName("tbody")[0] ||
+		elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+		elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var internalKey = jQuery.expando,
+		oldData = jQuery.data( src ),
+		curData = jQuery.data( dest, oldData );
+
+	// Switch to use the internal data object, if it exists, for the next
+	// stage of data copying
+	if ( (oldData = oldData[ internalKey ]) ) {
+		var events = oldData.events;
+				curData = curData[ internalKey ] = jQuery.extend({}, oldData);
+
+		if ( events ) {
+			delete curData.handle;
+			curData.events = {};
+
+			for ( var type in events ) {
+				for ( var i = 0, l = events[ type ].length; i < l; i++ ) {
+					jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
+				}
+			}
+		}
+	}
+}
+
+function cloneFixAttributes( src, dest ) {
+	var nodeName;
+
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	// clearAttributes removes the attributes, which we don't want,
+	// but also removes the attachEvent events, which we *do* want
+	if ( dest.clearAttributes ) {
+		dest.clearAttributes();
+	}
+
+	// mergeAttributes, in contrast, only merges back on the
+	// original attributes, not the events
+	if ( dest.mergeAttributes ) {
+		dest.mergeAttributes( src );
+	}
+
+	nodeName = dest.nodeName.toLowerCase();
+
+	// IE6-8 fail to clone children inside object elements that use
+	// the proprietary classid attribute value (rather than the type
+	// attribute) to identify the type of content to display
+	if ( nodeName === "object" ) {
+		dest.outerHTML = src.outerHTML;
+
+	} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+		if ( src.checked ) {
+			dest.defaultChecked = dest.checked = src.checked;
+		}
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+
+	// Event data gets referenced instead of copied if the expando
+	// gets copied too
+	dest.removeAttribute( jQuery.expando );
+}
+
+jQuery.buildFragment = function( args, nodes, scripts ) {
+	var fragment, cacheable, cacheresults, doc;
+
+  // nodes may contain either an explicit document object,
+  // a jQuery collection or context object.
+  // If nodes[0] contains a valid object to assign to doc
+  if ( nodes && nodes[0] ) {
+    doc = nodes[0].ownerDocument || nodes[0];
+  }
+
+  // Ensure that an attr object doesn't incorrectly stand in as a document object
+	// Chrome and Firefox seem to allow this to occur and will throw exception
+	// Fixes #8950
+	if ( !doc.createDocumentFragment ) {
+		doc = document;
+	}
+
+	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+	// Cloning options loses the selected state, so don't cache them
+	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+	if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
+		args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
+
+		cacheable = true;
+
+		cacheresults = jQuery.fragments[ args[0] ];
+		if ( cacheresults && cacheresults !== 1 ) {
+			fragment = cacheresults;
+		}
+	}
+
+	if ( !fragment ) {
+		fragment = doc.createDocumentFragment();
+		jQuery.clean( args, doc, fragment, scripts );
+	}
+
+	if ( cacheable ) {
+		jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
+	}
+
+	return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var ret = [],
+			insert = jQuery( selector ),
+			parent = this.length === 1 && this[0].parentNode;
+
+		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+			insert[ original ]( this[0] );
+			return this;
+
+		} else {
+			for ( var i = 0, l = insert.length; i < l; i++ ) {
+				var elems = (i > 0 ? this.clone(true) : this).get();
+				jQuery( insert[i] )[ original ]( elems );
+				ret = ret.concat( elems );
+			}
+
+			return this.pushStack( ret, name, insert.selector );
+		}
+	};
+});
+
+function getAll( elem ) {
+	if ( "getElementsByTagName" in elem ) {
+		return elem.getElementsByTagName( "*" );
+
+	} else if ( "querySelectorAll" in elem ) {
+		return elem.querySelectorAll( "*" );
+
+	} else {
+		return [];
+	}
+}
+
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+	if ( elem.type === "checkbox" || elem.type === "radio" ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+// Finds all inputs and passes them to fixDefaultChecked
+function findInputs( elem ) {
+	if ( jQuery.nodeName( elem, "input" ) ) {
+		fixDefaultChecked( elem );
+	} else if ( "getElementsByTagName" in elem ) {
+		jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+	}
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var clone = elem.cloneNode(true),
+				srcElements,
+				destElements,
+				i;
+
+		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+			// IE copies events bound via attachEvent when using cloneNode.
+			// Calling detachEvent on the clone will also remove the events
+			// from the original. In order to get around this, we use some
+			// proprietary methods to clear the events. Thanks to MooTools
+			// guys for this hotness.
+
+			cloneFixAttributes( elem, clone );
+
+			// Using Sizzle here is crazy slow, so we use getElementsByTagName
+			// instead
+			srcElements = getAll( elem );
+			destElements = getAll( clone );
+
+			// Weird iteration because IE will replace the length property
+			// with an element if you are cloning the body and one of the
+			// elements on the page has a name or id of "length"
+			for ( i = 0; srcElements[i]; ++i ) {
+				// Ensure that the destination node is not null; Fixes #9587
+				if ( destElements[i] ) {
+					cloneFixAttributes( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			cloneCopyEvent( elem, clone );
+
+			if ( deepDataAndEvents ) {
+				srcElements = getAll( elem );
+				destElements = getAll( clone );
+
+				for ( i = 0; srcElements[i]; ++i ) {
+					cloneCopyEvent( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		srcElements = destElements = null;
+
+		// Return the cloned set
+		return clone;
+	},
+
+	clean: function( elems, context, fragment, scripts ) {
+		var checkScriptType;
+
+		context = context || document;
+
+		// !context.createElement fails in IE with an error but returns typeof 'object'
+		if ( typeof context.createElement === "undefined" ) {
+			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+		}
+
+		var ret = [], j;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( typeof elem === "number" ) {
+				elem += "";
+			}
+
+			if ( !elem ) {
+				continue;
+			}
+
+			// Convert html string into DOM nodes
+			if ( typeof elem === "string" ) {
+				if ( !rhtml.test( elem ) ) {
+					elem = context.createTextNode( elem );
+				} else {
+					// Fix "XHTML"-style tags in all browsers
+					elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+					// Trim whitespace, otherwise indexOf won't work as expected
+					var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
+						wrap = wrapMap[ tag ] || wrapMap._default,
+						depth = wrap[0],
+						div = context.createElement("div");
+
+					// Go to html and back, then peel off extra wrappers
+					div.innerHTML = wrap[1] + elem + wrap[2];
+
+					// Move to the right depth
+					while ( depth-- ) {
+						div = div.lastChild;
+					}
+
+					// Remove IE's autoinserted <tbody> from table fragments
+					if ( !jQuery.support.tbody ) {
+
+						// String was a <table>, *may* have spurious <tbody>
+						var hasBody = rtbody.test(elem),
+							tbody = tag === "table" && !hasBody ?
+								div.firstChild && div.firstChild.childNodes :
+
+								// String was a bare <thead> or <tfoot>
+								wrap[1] === "<table>" && !hasBody ?
+									div.childNodes :
+									[];
+
+						for ( j = tbody.length - 1; j >= 0 ; --j ) {
+							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+								tbody[ j ].parentNode.removeChild( tbody[ j ] );
+							}
+						}
+					}
+
+					// IE completely kills leading whitespace when innerHTML is used
+					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+					}
+
+					elem = div.childNodes;
+				}
+			}
+
+			// Resets defaultChecked for any radios and checkboxes
+			// about to be appended to the DOM in IE 6/7 (#8060)
+			var len;
+			if ( !jQuery.support.appendChecked ) {
+				if ( elem[0] && typeof (len = elem.length) === "number" ) {
+					for ( j = 0; j < len; j++ ) {
+						findInputs( elem[j] );
+					}
+				} else {
+					findInputs( elem );
+				}
+			}
+
+			if ( elem.nodeType ) {
+				ret.push( elem );
+			} else {
+				ret = jQuery.merge( ret, elem );
+			}
+		}
+
+		if ( fragment ) {
+			checkScriptType = function( elem ) {
+				return !elem.type || rscriptType.test( elem.type );
+			};
+			for ( i = 0; ret[i]; i++ ) {
+				if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
+					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+
+				} else {
+					if ( ret[i].nodeType === 1 ) {
+						var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
+
+						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+					}
+					fragment.appendChild( ret[i] );
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	cleanData: function( elems ) {
+		var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
+			deleteExpando = jQuery.support.deleteExpando;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+				continue;
+			}
+
+			id = elem[ jQuery.expando ];
+
+			if ( id ) {
+				data = cache[ id ] && cache[ id ][ internalKey ];
+
+				if ( data && data.events ) {
+					for ( var type in data.events ) {
+						if ( special[ type ] ) {
+							jQuery.event.remove( elem, type );
+
+						// This is a shortcut to avoid jQuery.event.remove's overhead
+						} else {
+							jQuery.removeEvent( elem, type, data.handle );
+						}
+					}
+
+					// Null the DOM reference to avoid IE6/7/8 leak (#7054)
+					if ( data.handle ) {
+						data.handle.elem = null;
+					}
+				}
+
+				if ( deleteExpando ) {
+					delete elem[ jQuery.expando ];
+
+				} else if ( elem.removeAttribute ) {
+					elem.removeAttribute( jQuery.expando );
+				}
+
+				delete cache[ id ];
+			}
+		}
+	}
+});
+
+function evalScript( i, elem ) {
+	if ( elem.src ) {
+		jQuery.ajax({
+			url: elem.src,
+			async: false,
+			dataType: "script"
+		});
+	} else {
+		jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
+	}
+
+	if ( elem.parentNode ) {
+		elem.parentNode.removeChild( elem );
+	}
+}
+
+
+
+
+var ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity=([^)]*)/,
+	// fixed for IE9, see #8346
+	rupper = /([A-Z]|^ms)/g,
+	rnumpx = /^-?\d+(?:px)?$/i,
+	rnum = /^-?\d/,
+	rrelNum = /^([\-+])=([\-+.\de]+)/,
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssWidth = [ "Left", "Right" ],
+	cssHeight = [ "Top", "Bottom" ],
+	curCSS,
+
+	getComputedStyle,
+	currentStyle;
+
+jQuery.fn.css = function( name, value ) {
+	// Setting 'undefined' is a no-op
+	if ( arguments.length === 2 && value === undefined ) {
+		return this;
+	}
+
+	return jQuery.access( this, name, value, true, function( elem, name, value ) {
+		return value !== undefined ?
+			jQuery.style( elem, name, value ) :
+			jQuery.css( elem, name );
+	});
+};
+
+jQuery.extend({
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity", "opacity" );
+					return ret === "" ? "1" : ret;
+
+				} else {
+					return elem.style.opacity;
+				}
+			}
+		}
+	},
+
+	// Exclude the following css properties to add px
+	cssNumber: {
+		"fillOpacity": true,
+		"fontWeight": true,
+		"lineHeight": true,
+		"opacity": true,
+		"orphans": true,
+		"widows": true,
+		"zIndex": true,
+		"zoom": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {
+		// normalize float css property
+		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, type, origName = jQuery.camelCase( name ),
+			style = elem.style, hooks = jQuery.cssHooks[ origName ];
+
+		name = jQuery.cssProps[ origName ] || origName;
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// convert relative number strings (+= or -=) to relative numbers. #7345
+			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+				value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that NaN and null values aren't set. See: #7116
+			if ( value == null || type === "number" && isNaN( value ) ) {
+				return;
+			}
+
+			// If a number was passed in, add 'px' to the (except for certain CSS properties)
+			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+				value += "px";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
+				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+				// Fixes bug #5509
+				try {
+					style[ name ] = value;
+				} catch(e) {}
+			}
+
+		} else {
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, extra ) {
+		var ret, hooks;
+
+		// Make sure that we're working with the right name
+		name = jQuery.camelCase( name );
+		hooks = jQuery.cssHooks[ name ];
+		name = jQuery.cssProps[ name ] || name;
+
+		// cssFloat needs a special treatment
+		if ( name === "cssFloat" ) {
+			name = "float";
+		}
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
+			return ret;
+
+		// Otherwise, if a way to get the computed value exists, use that
+		} else if ( curCSS ) {
+			return curCSS( elem, name );
+		}
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	swap: function( elem, options, callback ) {
+		var old = {};
+
+		// Remember the old values, and insert the new ones
+		for ( var name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
+		}
+
+		callback.call( elem );
+
+		// Revert the old values
+		for ( name in options ) {
+			elem.style[ name ] = old[ name ];
+		}
+	}
+});
+
+// DEPRECATED, Use jQuery.css() instead
+jQuery.curCSS = jQuery.css;
+
+jQuery.each(["height", "width"], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			var val;
+
+			if ( computed ) {
+				if ( elem.offsetWidth !== 0 ) {
+					return getWH( elem, name, extra );
+				} else {
+					jQuery.swap( elem, cssShow, function() {
+						val = getWH( elem, name, extra );
+					});
+				}
+
+				return val;
+			}
+		},
+
+		set: function( elem, value ) {
+			if ( rnumpx.test( value ) ) {
+				// ignore negative width and height values #1599
+				value = parseFloat( value );
+
+				if ( value >= 0 ) {
+					return value + "px";
+				}
+
+			} else {
+				return value;
+			}
+		}
+	};
+});
+
+if ( !jQuery.support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+			// IE uses filters for opacity
+			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+				( parseFloat( RegExp.$1 ) / 100 ) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style,
+				currentStyle = elem.currentStyle,
+				opacity = jQuery.isNaN( value ) ? "" : "alpha(opacity=" + value * 100 + ")",
+				filter = currentStyle && currentStyle.filter || style.filter || "";
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+			if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
+
+				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+				// if "filter:" is present at all, clearType is disabled, we want to avoid this
+				// style.removeAttribute is IE Only, but so apparently is this code path...
+				style.removeAttribute( "filter" );
+
+				// if there there is no filter style applied in a css rule, we are done
+				if ( currentStyle && !currentStyle.filter ) {
+					return;
+				}
+			}
+
+			// otherwise, set new filter values
+			style.filter = ralpha.test( filter ) ?
+				filter.replace( ralpha, opacity ) :
+				filter + " " + opacity;
+		}
+	};
+}
+
+jQuery(function() {
+	// This hook cannot be added until DOM ready because the support test
+	// for it is not run until after DOM ready
+	if ( !jQuery.support.reliableMarginRight ) {
+		jQuery.cssHooks.marginRight = {
+			get: function( elem, computed ) {
+				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+				// Work around by temporarily setting element display to inline-block
+				var ret;
+				jQuery.swap( elem, { "display": "inline-block" }, function() {
+					if ( computed ) {
+						ret = curCSS( elem, "margin-right", "marginRight" );
+					} else {
+						ret = elem.style.marginRight;
+					}
+				});
+				return ret;
+			}
+		};
+	}
+});
+
+if ( document.defaultView && document.defaultView.getComputedStyle ) {
+	getComputedStyle = function( elem, name ) {
+		var ret, defaultView, computedStyle;
+
+		name = name.replace( rupper, "-$1" ).toLowerCase();
+
+		if ( !(defaultView = elem.ownerDocument.defaultView) ) {
+			return undefined;
+		}
+
+		if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
+			ret = computedStyle.getPropertyValue( name );
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+		}
+
+		return ret;
+	};
+}
+
+if ( document.documentElement.currentStyle ) {
+	currentStyle = function( elem, name ) {
+		var left,
+			ret = elem.currentStyle && elem.currentStyle[ name ],
+			rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ],
+			style = elem.style;
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
+			// Remember the original values
+			left = style.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : (ret || 0);
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = rsLeft;
+			}
+		}
+
+		return ret === "" ? "auto" : ret;
+	};
+}
+
+curCSS = getComputedStyle || currentStyle;
+
+function getWH( elem, name, extra ) {
+
+	// Start with offset property
+	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+		which = name === "width" ? cssWidth : cssHeight;
+
+	if ( val > 0 ) {
+		if ( extra !== "border" ) {
+			jQuery.each( which, function() {
+				if ( !extra ) {
+					val -= parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
+				}
+				if ( extra === "margin" ) {
+					val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
+				} else {
+					val -= parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
+				}
+			});
+		}
+
+		return val + "px";
+	}
+
+	// Fall back to computed then uncomputed css if necessary
+	val = curCSS( elem, name, name );
+	if ( val < 0 || val == null ) {
+		val = elem.style[ name ] || 0;
+	}
+	// Normalize "", auto, and prepare for extra
+	val = parseFloat( val ) || 0;
+
+	// Add padding, border, margin
+	if ( extra ) {
+		jQuery.each( which, function() {
+			val += parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
+			if ( extra !== "padding" ) {
+				val += parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
+			}
+			if ( extra === "margin" ) {
+				val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
+			}
+		});
+	}
+
+	return val + "px";
+}
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		var width = elem.offsetWidth,
+			height = elem.offsetHeight;
+
+		return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+
+
+
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rhash = /#.*$/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rquery = /\?/,
+	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+	rselectTextarea = /^(?:select|textarea)/i,
+	rspacesAjax = /\s+/,
+	rts = /([?&])_=[^&]*/,
+	rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
+
+	// Keep a copy of the old load method
+	_load = jQuery.fn.load,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Document location
+	ajaxLocation,
+
+	// Document location segments
+	ajaxLocParts,
+	
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = ["*/"] + ["*"];
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+	ajaxLocation = location.href;
+} catch( e ) {
+	// Use the href attribute of an A element
+	// since IE will modify it given document.location
+	ajaxLocation = document.createElement( "a" );
+	ajaxLocation.href = "";
+	ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		if ( jQuery.isFunction( func ) ) {
+			var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
+				i = 0,
+				length = dataTypes.length,
+				dataType,
+				list,
+				placeBefore;
+
+			// For each dataType in the dataTypeExpression
+			for(; i < length; i++ ) {
+				dataType = dataTypes[ i ];
+				// We control if we're asked to add before
+				// any existing element
+				placeBefore = /^\+/.test( dataType );
+				if ( placeBefore ) {
+					dataType = dataType.substr( 1 ) || "*";
+				}
+				list = structure[ dataType ] = structure[ dataType ] || [];
+				// then we add to the structure accordingly
+				list[ placeBefore ? "unshift" : "push" ]( func );
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+		dataType /* internal */, inspected /* internal */ ) {
+
+	dataType = dataType || options.dataTypes[ 0 ];
+	inspected = inspected || {};
+
+	inspected[ dataType ] = true;
+
+	var list = structure[ dataType ],
+		i = 0,
+		length = list ? list.length : 0,
+		executeOnly = ( structure === prefilters ),
+		selection;
+
+	for(; i < length && ( executeOnly || !selection ); i++ ) {
+		selection = list[ i ]( options, originalOptions, jqXHR );
+		// If we got redirected to another dataType
+		// we try there if executing only and not done already
+		if ( typeof selection === "string" ) {
+			if ( !executeOnly || inspected[ selection ] ) {
+				selection = undefined;
+			} else {
+				options.dataTypes.unshift( selection );
+				selection = inspectPrefiltersOrTransports(
+						structure, options, originalOptions, jqXHR, selection, inspected );
+			}
+		}
+	}
+	// If we're only executing or nothing was selected
+	// we try the catchall dataType if not done already
+	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+		selection = inspectPrefiltersOrTransports(
+				structure, options, originalOptions, jqXHR, "*", inspected );
+	}
+	// unnecessary when only executing (prefilters)
+	// but it'll be ignored by the caller in that case
+	return selection;
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+	var key, deep,
+		flatOptions = jQuery.ajaxSettings.flatOptions || {};
+	for( key in src ) {
+		if ( src[ key ] !== undefined ) {
+			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+		}
+	}
+	if ( deep ) {
+		jQuery.extend( true, target, deep );
+	}
+}
+
+jQuery.fn.extend({
+	load: function( url, params, callback ) {
+		if ( typeof url !== "string" && _load ) {
+			return _load.apply( this, arguments );
+
+		// Don't do a request if no elements are being requested
+		} else if ( !this.length ) {
+			return this;
+		}
+
+		var off = url.indexOf( " " );
+		if ( off >= 0 ) {
+			var selector = url.slice( off, url.length );
+			url = url.slice( 0, off );
+		}
+
+		// Default to a GET request
+		var type = "GET";
+
+		// If the second parameter was provided
+		if ( params ) {
+			// If it's a function
+			if ( jQuery.isFunction( params ) ) {
+				// We assume that it's the callback
+				callback = params;
+				params = undefined;
+
+			// Otherwise, build a param string
+			} else if ( typeof params === "object" ) {
+				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
+				type = "POST";
+			}
+		}
+
+		var self = this;
+
+		// Request the remote document
+		jQuery.ajax({
+			url: url,
+			type: type,
+			dataType: "html",
+			data: params,
+			// Complete callback (responseText is used internally)
+			complete: function( jqXHR, status, responseText ) {
+				// Store the response as specified by the jqXHR object
+				responseText = jqXHR.responseText;
+				// If successful, inject the HTML into all the matched elements
+				if ( jqXHR.isResolved() ) {
+					// #4825: Get the actual response in case
+					// a dataFilter is present in ajaxSettings
+					jqXHR.done(function( r ) {
+						responseText = r;
+					});
+					// See if a selector was specified
+					self.html( selector ?
+						// Create a dummy div to hold the results
+						jQuery("<div>")
+							// inject the contents of the document in, removing the scripts
+							// to avoid any 'Permission Denied' errors in IE
+							.append(responseText.replace(rscript, ""))
+
+							// Locate the specified elements
+							.find(selector) :
+
+						// If not, just inject the full result
+						responseText );
+				}
+
+				if ( callback ) {
+					self.each( callback, [ responseText, status, jqXHR ] );
+				}
+			}
+		});
+
+		return this;
+	},
+
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+
+	serializeArray: function() {
+		return this.map(function(){
+			return this.elements ? jQuery.makeArray( this.elements ) : this;
+		})
+		.filter(function(){
+			return this.name && !this.disabled &&
+				( this.checked || rselectTextarea.test( this.nodeName ) ||
+					rinput.test( this.type ) );
+		})
+		.map(function( i, elem ){
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val, i ){
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					}) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		}).get();
+	}
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+	jQuery.fn[ o ] = function( f ){
+		return this.bind( o, f );
+	};
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+		// shift arguments if data argument was omitted
+		if ( jQuery.isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		return jQuery.ajax({
+			type: method,
+			url: url,
+			data: data,
+			success: callback,
+			dataType: type
+		});
+	};
+});
+
+jQuery.extend({
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function( target, settings ) {
+		if ( settings ) {
+			// Building a settings object
+			ajaxExtend( target, jQuery.ajaxSettings );
+		} else {
+			// Extending ajaxSettings
+			settings = target;
+			target = jQuery.ajaxSettings;
+		}
+		ajaxExtend( target, settings );
+		return target;
+	},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		global: true,
+		type: "GET",
+		contentType: "application/x-www-form-urlencoded",
+		processData: true,
+		async: true,
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			xml: "application/xml, text/xml",
+			html: "text/html",
+			text: "text/plain",
+			json: "application/json, text/javascript",
+			"*": allTypes
+		},
+
+		contents: {
+			xml: /xml/,
+			html: /html/,
+			json: /json/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText"
+		},
+
+		// List of data converters
+		// 1) key format is "source_type destination_type" (a single space in-between)
+		// 2) the catchall symbol "*" can be used for source_type
+		converters: {
+
+			// Convert anything to text
+			"* text": window.String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": jQuery.parseJSON,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		},
+
+		// For options that shouldn't be deep extended:
+		// you can add your own custom options here if
+		// and when you create one that shouldn't be
+		// deep extended (see ajaxExtend)
+		flatOptions: {
+			context: true,
+			url: true
+		}
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var // Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+			// Callbacks context
+			callbackContext = s.context || s,
+			// Context for global events
+			// It's the callbackContext if one was provided in the options
+			// and if it's a DOM node or a jQuery collection
+			globalEventContext = callbackContext !== s &&
+				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+						jQuery( callbackContext ) : jQuery.event,
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery._Deferred(),
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+			// ifModified key
+			ifModifiedKey,
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+			// transport
+			transport,
+			// timeout handle
+			timeoutTimer,
+			// Cross-domain detection vars
+			parts,
+			// The jqXHR state
+			state = 0,
+			// To know if global events are to be dispatched
+			fireGlobals,
+			// Loop variable
+			i,
+			// Fake xhr
+			jqXHR = {
+
+				readyState: 0,
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					if ( !state ) {
+						var lname = name.toLowerCase();
+						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return state === 2 ? responseHeadersString : null;
+				},
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( state === 2 ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() ];
+					}
+					return match === undefined ? null : match;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					statusText = statusText || "abort";
+					if ( transport ) {
+						transport.abort( statusText );
+					}
+					done( 0, statusText );
+					return this;
+				}
+			};
+
+		// Callback for when everything is done
+		// It is defined here because jslint complains if it is declared
+		// at the end of the function (which would be more logical and readable)
+		function done( status, nativeStatusText, responses, headers ) {
+
+			// Called once
+			if ( state === 2 ) {
+				return;
+			}
+
+			// State is "done" now
+			state = 2;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status > 0 ? 4 : 0;
+
+			var isSuccess,
+				success,
+				error,
+				statusText = nativeStatusText,
+				response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
+				lastModified,
+				etag;
+
+			// If successful, handle type chaining
+			if ( status >= 200 && status < 300 || status === 304 ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+
+					if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
+						jQuery.lastModified[ ifModifiedKey ] = lastModified;
+					}
+					if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
+						jQuery.etag[ ifModifiedKey ] = etag;
+					}
+				}
+
+				// If not modified
+				if ( status === 304 ) {
+
+					statusText = "notmodified";
+					isSuccess = true;
+
+				// If we have data
+				} else {
+
+					try {
+						success = ajaxConvert( s, response );
+						statusText = "success";
+						isSuccess = true;
+					} catch(e) {
+						// We have a parsererror
+						statusText = "parsererror";
+						error = e;
+					}
+				}
+			} else {
+				// We extract error from statusText
+				// then normalize statusText and status for non-aborts
+				error = statusText;
+				if( !statusText || status ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = "" + ( nativeStatusText || statusText );
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
+						[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger( "ajaxStop" );
+				}
+			}
+		}
+
+		// Attach deferreds
+		deferred.promise( jqXHR );
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+		jqXHR.complete = completeDeferred.done;
+
+		// Status-dependent callbacks
+		jqXHR.statusCode = function( map ) {
+			if ( map ) {
+				var tmp;
+				if ( state < 2 ) {
+					for( tmp in map ) {
+						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+					}
+				} else {
+					tmp = map[ jqXHR.status ];
+					jqXHR.then( tmp, tmp );
+				}
+			}
+			return this;
+		};
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
+
+		// Determine if a cross-domain request is in order
+		if ( s.crossDomain == null ) {
+			parts = rurl.exec( s.url.toLowerCase() );
+			s.crossDomain = !!( parts &&
+				( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
+					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+			);
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefiler, stop there
+		if ( state === 2 ) {
+			return false;
+		}
+
+		// We can fire global events as of now if asked to
+		fireGlobals = s.global;
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Get ifModifiedKey before adding the anti-cache parameter
+			ifModifiedKey = s.url;
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+
+				var ts = jQuery.now(),
+					// try replacing _= if it is there
+					ret = s.url.replace( rts, "$1_=" + ts );
+
+				// if nothing was replaced, add timestamp to the end
+				s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			jqXHR.setRequestHeader( "Content-Type", s.contentType );
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			ifModifiedKey = ifModifiedKey || s.url;
+			if ( jQuery.lastModified[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+			}
+			if ( jQuery.etag[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+			}
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		jqXHR.setRequestHeader(
+			"Accept",
+			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+				s.accepts[ "*" ]
+		);
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+				// Abort if not done already
+				jqXHR.abort();
+				return false;
+
+		}
+
+		// Install callbacks on deferreds
+		for ( i in { success: 1, error: 1, complete: 1 } ) {
+			jqXHR[ i ]( s[ i ] );
+		}
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = setTimeout( function(){
+					jqXHR.abort( "timeout" );
+				}, s.timeout );
+			}
+
+			try {
+				state = 1;
+				transport.send( requestHeaders, done );
+			} catch (e) {
+				// Propagate exception as error if not done
+				if ( state < 2 ) {
+					done( -1, e );
+				// Simply rethrow otherwise
+				} else {
+					jQuery.error( e );
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	// Serialize an array of form elements or a set of
+	// key/values into a query string
+	param: function( a, traditional ) {
+		var s = [],
+			add = function( key, value ) {
+				// If value is a function, invoke it and return its value
+				value = jQuery.isFunction( value ) ? value() : value;
+				s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+			};
+
+		// Set traditional to true for jQuery <= 1.3.2 behavior.
+		if ( traditional === undefined ) {
+			traditional = jQuery.ajaxSettings.traditional;
+		}
+
+		// If an array was passed in, assume that it is an array of form elements.
+		if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+			// Serialize the form elements
+			jQuery.each( a, function() {
+				add( this.name, this.value );
+			});
+
+		} else {
+			// If traditional, encode the "old" way (the way 1.3.2 or older
+			// did it), otherwise encode params recursively.
+			for ( var prefix in a ) {
+				buildParams( prefix, a[ prefix ], traditional, add );
+			}
+		}
+
+		// Return the resulting serialization
+		return s.join( "&" ).replace( r20, "+" );
+	}
+});
+
+function buildParams( prefix, obj, traditional, add ) {
+	if ( jQuery.isArray( obj ) ) {
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+				// If array item is non-scalar (array or object), encode its
+				// numeric index to resolve deserialization ambiguity issues.
+				// Note that rack (as of 1.0.0) can't currently deserialize
+				// nested arrays properly, and attempting to do so may cause
+				// a server error. Possible fixes are to modify rack's
+				// deserialization algorithm or to provide an option or flag
+				// to force array serialization to be shallow.
+				buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && obj != null && typeof obj === "object" ) {
+		// Serialize object item.
+		for ( var name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+
+// This is still on the jQuery object... for now
+// Want to move this to jQuery.ajax some day
+jQuery.extend({
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {}
+
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+	var contents = s.contents,
+		dataTypes = s.dataTypes,
+		responseFields = s.responseFields,
+		ct,
+		type,
+		finalDataType,
+		firstDataType;
+
+	// Fill responseXXX fields
+	for( type in responseFields ) {
+		if ( type in responses ) {
+			jqXHR[ responseFields[type] ] = responses[ type ];
+		}
+	}
+
+	// Remove auto dataType and get content-type in the process
+	while( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+// Chain conversions given the request and the original response
+function ajaxConvert( s, response ) {
+
+	// Apply the dataFilter if provided
+	if ( s.dataFilter ) {
+		response = s.dataFilter( response, s.dataType );
+	}
+
+	var dataTypes = s.dataTypes,
+		converters = {},
+		i,
+		key,
+		length = dataTypes.length,
+		tmp,
+		// Current and previous dataTypes
+		current = dataTypes[ 0 ],
+		prev,
+		// Conversion expression
+		conversion,
+		// Conversion function
+		conv,
+		// Conversion functions (transitive conversion)
+		conv1,
+		conv2;
+
+	// For each dataType in the chain
+	for( i = 1; i < length; i++ ) {
+
+		// Create converters map
+		// with lowercased keys
+		if ( i === 1 ) {
+			for( key in s.converters ) {
+				if( typeof key === "string" ) {
+					converters[ key.toLowerCase() ] = s.converters[ key ];
+				}
+			}
+		}
+
+		// Get the dataTypes
+		prev = current;
+		current = dataTypes[ i ];
+
+		// If current is auto dataType, update it to prev
+		if( current === "*" ) {
+			current = prev;
+		// If no auto and dataTypes are actually different
+		} else if ( prev !== "*" && prev !== current ) {
+
+			// Get the converter
+			conversion = prev + " " + current;
+			conv = converters[ conversion ] || converters[ "* " + current ];
+
+			// If there is no direct converter, search transitively
+			if ( !conv ) {
+				conv2 = undefined;
+				for( conv1 in converters ) {
+					tmp = conv1.split( " " );
+					if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
+						conv2 = converters[ tmp[1] + " " + current ];
+						if ( conv2 ) {
+							conv1 = converters[ conv1 ];
+							if ( conv1 === true ) {
+								conv = conv2;
+							} else if ( conv2 === true ) {
+								conv = conv1;
+							}
+							break;
+						}
+					}
+				}
+			}
+			// If we found no converter, dispatch an error
+			if ( !( conv || conv2 ) ) {
+				jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
+			}
+			// If found converter is not an equivalence
+			if ( conv !== true ) {
+				// Convert with 1 or 2 converters accordingly
+				response = conv ? conv( response ) : conv2( conv1(response) );
+			}
+		}
+	}
+	return response;
+}
+
+
+
+
+var jsc = jQuery.now(),
+	jsre = /(\=)\?(&|$)|\?\?/i;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		return jQuery.expando + "_" + ( jsc++ );
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
+		( typeof s.data === "string" );
+
+	if ( s.dataTypes[ 0 ] === "jsonp" ||
+		s.jsonp !== false && ( jsre.test( s.url ) ||
+				inspectData && jsre.test( s.data ) ) ) {
+
+		var responseContainer,
+			jsonpCallback = s.jsonpCallback =
+				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
+			previous = window[ jsonpCallback ],
+			url = s.url,
+			data = s.data,
+			replace = "$1" + jsonpCallback + "$2";
+
+		if ( s.jsonp !== false ) {
+			url = url.replace( jsre, replace );
+			if ( s.url === url ) {
+				if ( inspectData ) {
+					data = data.replace( jsre, replace );
+				}
+				if ( s.data === data ) {
+					// Add callback manually
+					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
+				}
+			}
+		}
+
+		s.url = url;
+		s.data = data;
+
+		// Install callback
+		window[ jsonpCallback ] = function( response ) {
+			responseContainer = [ response ];
+		};
+
+		// Clean-up function
+		jqXHR.always(function() {
+			// Set callback back to previous value
+			window[ jsonpCallback ] = previous;
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( previous ) ) {
+				window[ jsonpCallback ]( responseContainer[ 0 ] );
+			}
+		});
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( jsonpCallback + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Delegate to script
+		return "script";
+	}
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+	accepts: {
+		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /javascript|ecmascript/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement( "script" );
+
+				script.async = "async";
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( head && script.parentNode ) {
+							head.removeChild( script );
+						}
+
+						// Dereference the script
+						script = undefined;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+				// This arises when a base node is used (#2709 and #4378).
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( 0, 1 );
+				}
+			}
+		};
+	}
+});
+
+
+
+
+var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+	xhrOnUnloadAbort = window.ActiveXObject ? function() {
+		// Abort all pending requests
+		for ( var key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( 0, 1 );
+		}
+	} : false,
+	xhrId = 0,
+	xhrCallbacks;
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+	} catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+	/* Microsoft failed to properly
+	 * implement the XMLHttpRequest in IE7 (can't request local files),
+	 * so we use the ActiveXObject when it is available
+	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+	 * we need a fallback.
+	 */
+	function() {
+		return !this.isLocal && createStandardXHR() || createActiveXHR();
+	} :
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+// Determine support properties
+(function( xhr ) {
+	jQuery.extend( jQuery.support, {
+		ajax: !!xhr,
+		cors: !!xhr && ( "withCredentials" in xhr )
+	});
+})( jQuery.ajaxSettings.xhr() );
+
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
+
+	jQuery.ajaxTransport(function( s ) {
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !s.crossDomain || jQuery.support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+
+					// Get a new xhr
+					var xhr = s.xhr(),
+						handle,
+						i;
+
+					// Open the socket
+					// Passing null username, generates a login popup on Opera (#2865)
+					if ( s.username ) {
+						xhr.open( s.type, s.url, s.async, s.username, s.password );
+					} else {
+						xhr.open( s.type, s.url, s.async );
+					}
+
+					// Apply custom fields if provided
+					if ( s.xhrFields ) {
+						for ( i in s.xhrFields ) {
+							xhr[ i ] = s.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( s.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( s.mimeType );
+					}
+
+					// X-Requested-With header
+					// For cross-domain requests, seeing as conditions for a preflight are
+					// akin to a jigsaw puzzle, we simply never set it to be sure.
+					// (it can always be set on a per-request basis or even using ajaxSetup)
+					// For same-domain requests, won't change header if already provided.
+					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+						headers[ "X-Requested-With" ] = "XMLHttpRequest";
+					}
+
+					// Need an extra try/catch for cross domain requests in Firefox 3
+					try {
+						for ( i in headers ) {
+							xhr.setRequestHeader( i, headers[ i ] );
+						}
+					} catch( _ ) {}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( s.hasContent && s.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+
+						var status,
+							statusText,
+							responseHeaders,
+							responses,
+							xml;
+
+						// Firefox throws exceptions when accessing properties
+						// of an xhr when a network error occured
+						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+						try {
+
+							// Was never called and is aborted or complete
+							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+								// Only called once
+								callback = undefined;
+
+								// Do not keep as active anymore
+								if ( handle ) {
+									xhr.onreadystatechange = jQuery.noop;
+									if ( xhrOnUnloadAbort ) {
+										delete xhrCallbacks[ handle ];
+									}
+								}
+
+								// If it's an abort
+								if ( isAbort ) {
+									// Abort it manually if needed
+									if ( xhr.readyState !== 4 ) {
+										xhr.abort();
+									}
+								} else {
+									status = xhr.status;
+									responseHeaders = xhr.getAllResponseHeaders();
+									responses = {};
+									xml = xhr.responseXML;
+
+									// Construct response list
+									if ( xml && xml.documentElement /* #4958 */ ) {
+										responses.xml = xml;
+									}
+									responses.text = xhr.responseText;
+
+									// Firefox throws an exception when accessing
+									// statusText for faulty cross-domain requests
+									try {
+										statusText = xhr.statusText;
+									} catch( e ) {
+										// We normalize with Webkit giving an empty statusText
+										statusText = "";
+									}
+
+									// Filter status for non standard behaviors
+
+									// If the request is local and we have data: assume a success
+									// (success with no data won't get notified, that's the best we
+									// can do given current implementations)
+									if ( !status && s.isLocal && !s.crossDomain ) {
+										status = responses.text ? 200 : 404;
+									// IE - #1450: sometimes returns 1223 when it should be 204
+									} else if ( status === 1223 ) {
+										status = 204;
+									}
+								}
+							}
+						} catch( firefoxAccessException ) {
+							if ( !isAbort ) {
+								complete( -1, firefoxAccessException );
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, responseHeaders );
+						}
+					};
+
+					// if we're in sync mode or it's in cache
+					// and has been retrieved directly (IE6 & IE7)
+					// we need to manually fire the callback
+					if ( !s.async || xhr.readyState === 4 ) {
+						callback();
+					} else {
+						handle = ++xhrId;
+						if ( xhrOnUnloadAbort ) {
+							// Create the active xhrs callbacks list if needed
+							// and attach the unload handler
+							if ( !xhrCallbacks ) {
+								xhrCallbacks = {};
+								jQuery( window ).unload( xhrOnUnloadAbort );
+							}
+							// Add to list of active xhrs callbacks
+							xhrCallbacks[ handle ] = callback;
+						}
+						xhr.onreadystatechange = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback(0,1);
+					}
+				}
+			};
+		}
+	});
+}
+
+
+
+
+var elemdisplay = {},
+	iframe, iframeDoc,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
+	timerId,
+	fxAttrs = [
+		// height animations
+		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+		// width animations
+		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+		// opacity animations
+		[ "opacity" ]
+	],
+	fxNow;
+
+jQuery.fn.extend({
+	show: function( speed, easing, callback ) {
+		var elem, display;
+
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("show", 3), speed, easing, callback);
+
+		} else {
+			for ( var i = 0, j = this.length; i < j; i++ ) {
+				elem = this[i];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					// Reset the inline display of this element to learn if it is
+					// being hidden by cascaded rules or not
+					if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
+						display = elem.style.display = "";
+					}
+
+					// Set elements which have been overridden with display: none
+					// in a stylesheet to whatever the default browser style is
+					// for such an element
+					if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
+						jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName));
+					}
+				}
+			}
+
+			// Set the display of most of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				elem = this[i];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					if ( display === "" || display === "none" ) {
+						elem.style.display = jQuery._data(elem, "olddisplay") || "";
+					}
+				}
+			}
+
+			return this;
+		}
+	},
+
+	hide: function( speed, easing, callback ) {
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("hide", 3), speed, easing, callback);
+
+		} else {
+			for ( var i = 0, j = this.length; i < j; i++ ) {
+				if ( this[i].style ) {
+					var display = jQuery.css( this[i], "display" );
+
+					if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) {
+						jQuery._data( this[i], "olddisplay", display );
+					}
+				}
+			}
+
+			// Set the display of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				if ( this[i].style ) {
+					this[i].style.display = "none";
+				}
+			}
+
+			return this;
+		}
+	},
+
+	// Save the old toggle function
+	_toggle: jQuery.fn.toggle,
+
+	toggle: function( fn, fn2, callback ) {
+		var bool = typeof fn === "boolean";
+
+		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
+			this._toggle.apply( this, arguments );
+
+		} else if ( fn == null || bool ) {
+			this.each(function() {
+				var state = bool ? fn : jQuery(this).is(":hidden");
+				jQuery(this)[ state ? "show" : "hide" ]();
+			});
+
+		} else {
+			this.animate(genFx("toggle", 3), fn, fn2, callback);
+		}
+
+		return this;
+	},
+
+	fadeTo: function( speed, to, easing, callback ) {
+		return this.filter(":hidden").css("opacity", 0).show().end()
+					.animate({opacity: to}, speed, easing, callback);
+	},
+
+	animate: function( prop, speed, easing, callback ) {
+		var optall = jQuery.speed(speed, easing, callback);
+
+		if ( jQuery.isEmptyObject( prop ) ) {
+			return this.each( optall.complete, [ false ] );
+		}
+
+		// Do not change referenced properties as per-property easing will be lost
+		prop = jQuery.extend( {}, prop );
+
+		return this[ optall.queue === false ? "each" : "queue" ](function() {
+			// XXX 'this' does not always have a nodeName when running the
+			// test suite
+
+			if ( optall.queue === false ) {
+				jQuery._mark( this );
+			}
+
+			var opt = jQuery.extend( {}, optall ),
+				isElement = this.nodeType === 1,
+				hidden = isElement && jQuery(this).is(":hidden"),
+				name, val, p,
+				display, e,
+				parts, start, end, unit;
+
+			// will store per property easing and be used to determine when an animation is complete
+			opt.animatedProperties = {};
+
+			for ( p in prop ) {
+
+				// property name normalization
+				name = jQuery.camelCase( p );
+				if ( p !== name ) {
+					prop[ name ] = prop[ p ];
+					delete prop[ p ];
+				}
+
+				val = prop[ name ];
+
+				// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
+				if ( jQuery.isArray( val ) ) {
+					opt.animatedProperties[ name ] = val[ 1 ];
+					val = prop[ name ] = val[ 0 ];
+				} else {
+					opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
+				}
+
+				if ( val === "hide" && hidden || val === "show" && !hidden ) {
+					return opt.complete.call( this );
+				}
+
+				if ( isElement && ( name === "height" || name === "width" ) ) {
+					// Make sure that nothing sneaks out
+					// Record all 3 overflow attributes because IE does not
+					// change the overflow attribute when overflowX and
+					// overflowY are set to the same value
+					opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
+
+					// Set display property to inline-block for height/width
+					// animations on inline elements that are having width/height
+					// animated
+					if ( jQuery.css( this, "display" ) === "inline" &&
+							jQuery.css( this, "float" ) === "none" ) {
+						if ( !jQuery.support.inlineBlockNeedsLayout ) {
+							this.style.display = "inline-block";
+
+						} else {
+							display = defaultDisplay( this.nodeName );
+
+							// inline-level elements accept inline-block;
+							// block-level elements need to be inline with layout
+							if ( display === "inline" ) {
+								this.style.display = "inline-block";
+
+							} else {
+								this.style.display = "inline";
+								this.style.zoom = 1;
+							}
+						}
+					}
+				}
+			}
+
+			if ( opt.overflow != null ) {
+				this.style.overflow = "hidden";
+			}
+
+			for ( p in prop ) {
+				e = new jQuery.fx( this, opt, p );
+				val = prop[ p ];
+
+				if ( rfxtypes.test(val) ) {
+					e[ val === "toggle" ? hidden ? "show" : "hide" : val ]();
+
+				} else {
+					parts = rfxnum.exec( val );
+					start = e.cur();
+
+					if ( parts ) {
+						end = parseFloat( parts[2] );
+						unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
+
+						// We need to compute starting value
+						if ( unit !== "px" ) {
+							jQuery.style( this, p, (end || 1) + unit);
+							start = ((end || 1) / e.cur()) * start;
+							jQuery.style( this, p, start + unit);
+						}
+
+						// If a +=/-= token was provided, we're doing a relative animation
+						if ( parts[1] ) {
+							end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
+						}
+
+						e.custom( start, end, unit );
+
+					} else {
+						e.custom( start, val, "" );
+					}
+				}
+			}
+
+			// For JS strict compliance
+			return true;
+		});
+	},
+
+	stop: function( clearQueue, gotoEnd ) {
+		if ( clearQueue ) {
+			this.queue([]);
+		}
+
+		this.each(function() {
+			var timers = jQuery.timers,
+				i = timers.length;
+			// clear marker counters if we know they won't be
+			if ( !gotoEnd ) {
+				jQuery._unmark( true, this );
+			}
+			while ( i-- ) {
+				if ( timers[i].elem === this ) {
+					if (gotoEnd) {
+						// force the next step to be the last
+						timers[i](true);
+					}
+
+					timers.splice(i, 1);
+				}
+			}
+		});
+
+		// start the next in the queue if the last step wasn't forced
+		if ( !gotoEnd ) {
+			this.dequeue();
+		}
+
+		return this;
+	}
+
+});
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	setTimeout( clearFxNow, 0 );
+	return ( fxNow = jQuery.now() );
+}
+
+function clearFxNow() {
+	fxNow = undefined;
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, num ) {
+	var obj = {};
+
+	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
+		obj[ this ] = type;
+	});
+
+	return obj;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx("show", 1),
+	slideUp: genFx("hide", 1),
+	slideToggle: genFx("toggle", 1),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+});
+
+jQuery.extend({
+	speed: function( speed, easing, fn ) {
+		var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
+			complete: fn || !fn && easing ||
+				jQuery.isFunction( speed ) && speed,
+			duration: speed,
+			easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
+		};
+
+		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+			opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
+
+		// Queueing
+		opt.old = opt.complete;
+		opt.complete = function( noUnmark ) {
+			if ( jQuery.isFunction( opt.old ) ) {
+				opt.old.call( this );
+			}
+
+			if ( opt.queue !== false ) {
+				jQuery.dequeue( this );
+			} else if ( noUnmark !== false ) {
+				jQuery._unmark( this );
+			}
+		};
+
+		return opt;
+	},
+
+	easing: {
+		linear: function( p, n, firstNum, diff ) {
+			return firstNum + diff * p;
+		},
+		swing: function( p, n, firstNum, diff ) {
+			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
+		}
+	},
+
+	timers: [],
+
+	fx: function( elem, options, prop ) {
+		this.options = options;
+		this.elem = elem;
+		this.prop = prop;
+
+		options.orig = options.orig || {};
+	}
+
+});
+
+jQuery.fx.prototype = {
+	// Simple function for setting a style value
+	update: function() {
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
+	},
+
+	// Get the current size
+	cur: function() {
+		if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
+			return this.elem[ this.prop ];
+		}
+
+		var parsed,
+			r = jQuery.css( this.elem, this.prop );
+		// Empty strings, null, undefined and "auto" are converted to 0,
+		// complex values such as "rotate(1rad)" are returned as is,
+		// simple values such as "10px" are parsed to Float.
+		return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
+	},
+
+	// Start an animation from one number to another
+	custom: function( from, to, unit ) {
+		var self = this,
+			fx = jQuery.fx;
+
+		this.startTime = fxNow || createFxNow();
+		this.start = from;
+		this.end = to;
+		this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
+		this.now = this.start;
+		this.pos = this.state = 0;
+
+		function t( gotoEnd ) {
+			return self.step(gotoEnd);
+		}
+
+		t.elem = this.elem;
+
+		if ( t() && jQuery.timers.push(t) && !timerId ) {
+			timerId = setInterval( fx.tick, fx.interval );
+		}
+	},
+
+	// Simple 'show' function
+	show: function() {
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+		this.options.show = true;
+
+		// Begin the animation
+		// Make sure that we start at a small width/height to avoid any
+		// flash of content
+		this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
+
+		// Start by showing the element
+		jQuery( this.elem ).show();
+	},
+
+	// Simple 'hide' function
+	hide: function() {
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+		this.options.hide = true;
+
+		// Begin the animation
+		this.custom(this.cur(), 0);
+	},
+
+	// Each step of an animation
+	step: function( gotoEnd ) {
+		var t = fxNow || createFxNow(),
+			done = true,
+			elem = this.elem,
+			options = this.options,
+			i, n;
+
+		if ( gotoEnd || t >= options.duration + this.startTime ) {
+			this.now = this.end;
+			this.pos = this.state = 1;
+			this.update();
+
+			options.animatedProperties[ this.prop ] = true;
+
+			for ( i in options.animatedProperties ) {
+				if ( options.animatedProperties[i] !== true ) {
+					done = false;
+				}
+			}
+
+			if ( done ) {
+				// Reset the overflow
+				if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
+
+					jQuery.each( [ "", "X", "Y" ], function (index, value) {
+						elem.style[ "overflow" + value ] = options.overflow[index];
+					});
+				}
+
+				// Hide the element if the "hide" operation was done
+				if ( options.hide ) {
+					jQuery(elem).hide();
+				}
+
+				// Reset the properties, if the item has been hidden or shown
+				if ( options.hide || options.show ) {
+					for ( var p in options.animatedProperties ) {
+						jQuery.style( elem, p, options.orig[p] );
+					}
+				}
+
+				// Execute the complete function
+				options.complete.call( elem );
+			}
+
+			return false;
+
+		} else {
+			// classical easing cannot be used with an Infinity duration
+			if ( options.duration == Infinity ) {
+				this.now = t;
+			} else {
+				n = t - this.startTime;
+				this.state = n / options.duration;
+
+				// Perform the easing function, defaults to swing
+				this.pos = jQuery.easing[ options.animatedProperties[ this.prop ] ]( this.state, n, 0, 1, options.duration );
+				this.now = this.start + ((this.end - this.start) * this.pos);
+			}
+			// Perform the next step of the animation
+			this.update();
+		}
+
+		return true;
+	}
+};
+
+jQuery.extend( jQuery.fx, {
+	tick: function() {
+		for ( var timers = jQuery.timers, i = 0 ; i < timers.length ; ++i ) {
+			if ( !timers[i]() ) {
+				timers.splice(i--, 1);
+			}
+		}
+
+		if ( !timers.length ) {
+			jQuery.fx.stop();
+		}
+	},
+
+	interval: 13,
+
+	stop: function() {
+		clearInterval( timerId );
+		timerId = null;
+	},
+
+	speeds: {
+		slow: 600,
+		fast: 200,
+		// Default speed
+		_default: 400
+	},
+
+	step: {
+		opacity: function( fx ) {
+			jQuery.style( fx.elem, "opacity", fx.now );
+		},
+
+		_default: function( fx ) {
+			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+				fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
+			} else {
+				fx.elem[ fx.prop ] = fx.now;
+			}
+		}
+	}
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+
+// Try to restore the default display value of an element
+function defaultDisplay( nodeName ) {
+
+	if ( !elemdisplay[ nodeName ] ) {
+
+		var body = document.body,
+			elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
+			display = elem.css( "display" );
+
+		elem.remove();
+
+		// If the simple way fails,
+		// get element's real default display by attaching it to a temp iframe
+		if ( display === "none" || display === "" ) {
+			// No iframe to use yet, so create it
+			if ( !iframe ) {
+				iframe = document.createElement( "iframe" );
+				iframe.frameBorder = iframe.width = iframe.height = 0;
+			}
+
+			body.appendChild( iframe );
+
+			// Create a cacheable copy of the iframe document on first call.
+			// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+			// document to it; WebKit & Firefox won't allow reusing the iframe document.
+			if ( !iframeDoc || !iframe.createElement ) {
+				iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+				iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" );
+				iframeDoc.close();
+			}
+
+			elem = iframeDoc.createElement( nodeName );
+
+			iframeDoc.body.appendChild( elem );
+
+			display = jQuery.css( elem, "display" );
+
+			body.removeChild( iframe );
+		}
+
+		// Store the correct default display
+		elemdisplay[ nodeName ] = display;
+	}
+
+	return elemdisplay[ nodeName ];
+}
+
+
+
+
+var rtable = /^t(?:able|d|h)$/i,
+	rroot = /^(?:body|html)$/i;
+
+if ( "getBoundingClientRect" in document.documentElement ) {
+	jQuery.fn.offset = function( options ) {
+		var elem = this[0], box;
+
+		if ( options ) {
+			return this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+		}
+
+		if ( !elem || !elem.ownerDocument ) {
+			return null;
+		}
+
+		if ( elem === elem.ownerDocument.body ) {
+			return jQuery.offset.bodyOffset( elem );
+		}
+
+		try {
+			box = elem.getBoundingClientRect();
+		} catch(e) {}
+
+		var doc = elem.ownerDocument,
+			docElem = doc.documentElement;
+
+		// Make sure we're not dealing with a disconnected DOM node
+		if ( !box || !jQuery.contains( docElem, elem ) ) {
+			return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
+		}
+
+		var body = doc.body,
+			win = getWindow(doc),
+			clientTop  = docElem.clientTop  || body.clientTop  || 0,
+			clientLeft = docElem.clientLeft || body.clientLeft || 0,
+			scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
+			scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
+			top  = box.top  + scrollTop  - clientTop,
+			left = box.left + scrollLeft - clientLeft;
+
+		return { top: top, left: left };
+	};
+
+} else {
+	jQuery.fn.offset = function( options ) {
+		var elem = this[0];
+
+		if ( options ) {
+			return this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+		}
+
+		if ( !elem || !elem.ownerDocument ) {
+			return null;
+		}
+
+		if ( elem === elem.ownerDocument.body ) {
+			return jQuery.offset.bodyOffset( elem );
+		}
+
+		jQuery.offset.initialize();
+
+		var computedStyle,
+			offsetParent = elem.offsetParent,
+			prevOffsetParent = elem,
+			doc = elem.ownerDocument,
+			docElem = doc.documentElement,
+			body = doc.body,
+			defaultView = doc.defaultView,
+			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
+			top = elem.offsetTop,
+			left = elem.offsetLeft;
+
+		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+			if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+				break;
+			}
+
+			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
+			top  -= elem.scrollTop;
+			left -= elem.scrollLeft;
+
+			if ( elem === offsetParent ) {
+				top  += elem.offsetTop;
+				left += elem.offsetLeft;
+
+				if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
+					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+				}
+
+				prevOffsetParent = offsetParent;
+				offsetParent = elem.offsetParent;
+			}
+
+			if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+			}
+
+			prevComputedStyle = computedStyle;
+		}
+
+		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
+			top  += body.offsetTop;
+			left += body.offsetLeft;
+		}
+
+		if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+			top  += Math.max( docElem.scrollTop, body.scrollTop );
+			left += Math.max( docElem.scrollLeft, body.scrollLeft );
+		}
+
+		return { top: top, left: left };
+	};
+}
+
+jQuery.offset = {
+	initialize: function() {
+		var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
+			html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
+
+		jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
+
+		container.innerHTML = html;
+		body.insertBefore( container, body.firstChild );
+		innerDiv = container.firstChild;
+		checkDiv = innerDiv.firstChild;
+		td = innerDiv.nextSibling.firstChild.firstChild;
+
+		this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
+		this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
+
+		checkDiv.style.position = "fixed";
+		checkDiv.style.top = "20px";
+
+		// safari subtracts parent border width here which is 5px
+		this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
+		checkDiv.style.position = checkDiv.style.top = "";
+
+		innerDiv.style.overflow = "hidden";
+		innerDiv.style.position = "relative";
+
+		this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
+
+		this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
+
+		body.removeChild( container );
+		jQuery.offset.initialize = jQuery.noop;
+	},
+
+	bodyOffset: function( body ) {
+		var top = body.offsetTop,
+			left = body.offsetLeft;
+
+		jQuery.offset.initialize();
+
+		if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
+			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+		}
+
+		return { top: top, left: left };
+	},
+
+	setOffset: function( elem, options, i ) {
+		var position = jQuery.css( elem, "position" );
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		var curElem = jQuery( elem ),
+			curOffset = curElem.offset(),
+			curCSSTop = jQuery.css( elem, "top" ),
+			curCSSLeft = jQuery.css( elem, "left" ),
+			calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+			props = {}, curPosition = {}, curTop, curLeft;
+
+		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( jQuery.isFunction( options ) ) {
+			options = options.call( elem, i, curOffset );
+		}
+
+		if (options.top != null) {
+			props.top = (options.top - curOffset.top) + curTop;
+		}
+		if (options.left != null) {
+			props.left = (options.left - curOffset.left) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+
+jQuery.fn.extend({
+	position: function() {
+		if ( !this[0] ) {
+			return null;
+		}
+
+		var elem = this[0],
+
+		// Get *real* offsetParent
+		offsetParent = this.offsetParent(),
+
+		// Get correct offsets
+		offset       = this.offset(),
+		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+		// Subtract element margins
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+		// Add offsetParent borders
+		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+		// Subtract the two offsets
+		return {
+			top:  offset.top  - parentOffset.top,
+			left: offset.left - parentOffset.left
+		};
+	},
+
+	offsetParent: function() {
+		return this.map(function() {
+			var offsetParent = this.offsetParent || document.body;
+			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( ["Left", "Top"], function( i, name ) {
+	var method = "scroll" + name;
+
+	jQuery.fn[ method ] = function( val ) {
+		var elem, win;
+
+		if ( val === undefined ) {
+			elem = this[ 0 ];
+
+			if ( !elem ) {
+				return null;
+			}
+
+			win = getWindow( elem );
+
+			// Return the scroll offset
+			return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
+				jQuery.support.boxModel && win.document.documentElement[ method ] ||
+					win.document.body[ method ] :
+				elem[ method ];
+		}
+
+		// Set the scroll offset
+		return this.each(function() {
+			win = getWindow( this );
+
+			if ( win ) {
+				win.scrollTo(
+					!i ? val : jQuery( win ).scrollLeft(),
+					 i ? val : jQuery( win ).scrollTop()
+				);
+
+			} else {
+				this[ method ] = val;
+			}
+		});
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+
+
+
+
+// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ "Height", "Width" ], function( i, name ) {
+
+	var type = name.toLowerCase();
+
+	// innerHeight and innerWidth
+	jQuery.fn[ "inner" + name ] = function() {
+		var elem = this[0];
+		return elem && elem.style ?
+			parseFloat( jQuery.css( elem, type, "padding" ) ) :
+			null;
+	};
+
+	// outerHeight and outerWidth
+	jQuery.fn[ "outer" + name ] = function( margin ) {
+		var elem = this[0];
+		return elem && elem.style ?
+			parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
+			null;
+	};
+
+	jQuery.fn[ type ] = function( size ) {
+		// Get window width or height
+		var elem = this[0];
+		if ( !elem ) {
+			return size == null ? null : this;
+		}
+
+		if ( jQuery.isFunction( size ) ) {
+			return this.each(function( i ) {
+				var self = jQuery( this );
+				self[ type ]( size.call( this, i, self[ type ]() ) );
+			});
+		}
+
+		if ( jQuery.isWindow( elem ) ) {
+			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+			// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
+			var docElemProp = elem.document.documentElement[ "client" + name ],
+				body = elem.document.body;
+			return elem.document.compatMode === "CSS1Compat" && docElemProp ||
+				body && body[ "client" + name ] || docElemProp;
+
+		// Get document width or height
+		} else if ( elem.nodeType === 9 ) {
+			// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+			return Math.max(
+				elem.documentElement["client" + name],
+				elem.body["scroll" + name], elem.documentElement["scroll" + name],
+				elem.body["offset" + name], elem.documentElement["offset" + name]
+			);
+
+		// Get or set width or height on the element
+		} else if ( size === undefined ) {
+			var orig = jQuery.css( elem, type ),
+				ret = parseFloat( orig );
+
+			return jQuery.isNaN( ret ) ? orig : ret;
+
+		// Set the width or height on the element (default to pixels if value is unitless)
+		} else {
+			return this.css( type, typeof size === "string" ? size : size + "px" );
+		}
+	};
+
+});
+
+
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+})(window);
+
+  // begin npm / ender footer
+  window.jQuery.noConflict();
+  return window.jQuery;
+}
+module.exports = create('undefined' === typeof window ? undefined : window);
+module.exports.create = create;
+}());
+
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/.project b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/.project
new file mode 100644
index 0000000..6758a96
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>NodeHtmlParser</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
+	</natures>
+</projectDescription>
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/.settings/.jsdtscope b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/.settings/.jsdtscope
new file mode 100644
index 0000000..967f99d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/.settings/.jsdtscope
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path=""/>
+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.baseBrowserLibrary"/>
+</classpath>
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/.settings/org.eclipse.core.resources.prefs b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..4d6b5b6
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#Sat Mar 19 11:36:01 EDT 2011
+eclipse.preferences.version=1
+encoding//lib/htmlparser.js=UTF-8
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/.settings/org.eclipse.wst.jsdt.ui.superType.container b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/.settings/org.eclipse.wst.jsdt.ui.superType.container
new file mode 100644
index 0000000..3bd5d0a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/.settings/org.eclipse.wst.jsdt.ui.superType.container
@@ -0,0 +1 @@
+org.eclipse.wst.jsdt.launching.baseBrowserLibrary
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/.settings/org.eclipse.wst.jsdt.ui.superType.name b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/.settings/org.eclipse.wst.jsdt.ui.superType.name
new file mode 100644
index 0000000..05bd71b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/.settings/org.eclipse.wst.jsdt.ui.superType.name
@@ -0,0 +1 @@
+Window
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/CHANGELOG b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/CHANGELOG
new file mode 100644
index 0000000..ade96ec
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/CHANGELOG
@@ -0,0 +1,47 @@
+v1.8.0
+	*
+
+v1.7.6
+	* Removed "os" entry from package.json
+
+v1.7.5
+	* Fixed case sensitivity of tag names in DefaultHandler, fixed README.md formatting
+
+v1.7.4
+	* Updated copyright dates
+
+v1.7.3
+	* Renamed node-htmlparser.* to htmlparser.* and created shims for people still expecting node-htmlparser.*
+
+v1.7.2
+	* Document position feature fixed to work correctly with chunked parsing
+
+v1.7.1
+	* Document position feature disabled until it works correctly with chunked parsing
+
+v1.7.0
+	* Empty tag checking switch to being case insensitive [fgnass]
+	* Added feature to include document position (row, col) in element data [fgnass]
+	* Added parser option "includeLocation" to enable document position data
+
+v1.6.4
+	* Fixed 'prevElement' error [Swizec]
+
+v1.6.3
+	* Updated to support being an npm package
+	* Fixed DomUtils.testElement()
+
+v1.6.1
+	* Optimized DomUtils by up to 2-3x 
+
+v1.6.0
+	* Added support for RSS/Atom feeds
+
+v1.5.0
+	* Added DefaultHandler option "enforceEmptyTags" so that XML can be parsed correctly
+
+v1.4.2
+	* Added tests for parsing XML with namespaces
+
+v1.4.1
+	* Added minified version
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/LICENSE b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/LICENSE
new file mode 100644
index 0000000..0a35e02
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/LICENSE
@@ -0,0 +1,18 @@
+Copyright 2010, 2011, Chris Winberry <chris at winberry.net>. All rights reserved.
+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/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/README.md b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/README.md
new file mode 100644
index 0000000..b346145
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/README.md
@@ -0,0 +1,247 @@
+#NodeHtmlParser
+A forgiving HTML/XML/RSS parser written in JS for both the browser and NodeJS (yes, despite the name it works just fine in any modern browser). The parser can handle streams (chunked data) and supports custom handlers for writing custom DOMs/output.
+
+##Installing
+
+	npm install htmlparser
+
+##Running Tests
+
+###Run tests under node:
+	node runtests.js
+
+###Run tests in browser:
+View runtests.html in any browser
+
+##Usage In Node
+
+```javascript
+var htmlparser = require("htmlparser");
+var rawHtml = "Xyz <script language= javascript>var foo = '<<bar>>';< /  script><!--<!-- Waah! -- -->";
+var handler = new htmlparser.DefaultHandler(function (error, dom) {
+	if (error)
+		[...do something for errors...]
+	else
+		[...parsing done, do something...]
+});
+var parser = new htmlparser.Parser(handler);
+parser.parseComplete(rawHtml);
+sys.puts(sys.inspect(handler.dom, false, null));
+```
+
+##Usage In Browser
+
+```javascript
+var handler = new Tautologistics.NodeHtmlParser.DefaultHandler(function (error, dom) {
+	if (error)
+		[...do something for errors...]
+	else
+		[...parsing done, do something...]
+});
+var parser = new Tautologistics.NodeHtmlParser.Parser(handler);
+parser.parseComplete(document.body.innerHTML);
+alert(JSON.stringify(handler.dom, null, 2));
+```
+
+##Example output
+
+```javascript
+[ { raw: 'Xyz ', data: 'Xyz ', type: 'text' }
+  , { raw: 'script language= javascript'
+  , data: 'script language= javascript'
+  , type: 'script'
+  , name: 'script'
+  , attribs: { language: 'javascript' }
+  , children: 
+     [ { raw: 'var foo = \'<bar>\';<'
+       , data: 'var foo = \'<bar>\';<'
+       , type: 'text'
+       }
+     ]
+  }
+, { raw: '<!-- Waah! -- '
+  , data: '<!-- Waah! -- '
+  , type: 'comment'
+  }
+]
+```
+
+##Streaming To Parser
+
+```javascript
+while (...) {
+	...
+	parser.parseChunk(chunk);
+}
+parser.done();	
+```
+
+##Parsing RSS/Atom Feeds
+
+```javascript
+new htmlparser.RssHandler(function (error, dom) {
+	...
+});
+```
+
+##DefaultHandler Options
+
+###Usage
+
+```javascript
+var handler = new htmlparser.DefaultHandler(
+	  function (error) { ... }
+	, { verbose: false, ignoreWhitespace: true }
+	);
+```
+
+###Option: ignoreWhitespace
+Indicates whether the DOM should exclude text nodes that consists solely of whitespace. The default value is "false".
+
+####Example: true
+
+The following HTML:
+
+```html
+<font>
+	<br>this is the text
+<font>
+```
+
+becomes:
+
+```javascript
+[ { raw: 'font'
+  , data: 'font'
+  , type: 'tag'
+  , name: 'font'
+  , children: 
+     [ { raw: 'br', data: 'br', type: 'tag', name: 'br' }
+     , { raw: 'this is the text\n'
+       , data: 'this is the text\n'
+       , type: 'text'
+       }
+     , { raw: 'font', data: 'font', type: 'tag', name: 'font' }
+     ]
+  }
+]
+```
+
+####Example: false
+
+The following HTML:
+
+```html
+<font>
+	<br>this is the text
+<font>
+```
+
+becomes:
+
+```javascript
+[ { raw: 'font'
+  , data: 'font'
+  , type: 'tag'
+  , name: 'font'
+  , children: 
+     [ { raw: '\n\t', data: '\n\t', type: 'text' }
+     , { raw: 'br', data: 'br', type: 'tag', name: 'br' }
+     , { raw: 'this is the text\n'
+       , data: 'this is the text\n'
+       , type: 'text'
+       }
+     , { raw: 'font', data: 'font', type: 'tag', name: 'font' }
+     ]
+  }
+]
+```
+
+###Option: verbose
+Indicates whether to include extra information on each node in the DOM. This information consists of the "raw" attribute (original, unparsed text found between "<" and ">") and the "data" attribute on "tag", "script", and "comment" nodes. The default value is "true". 
+
+####Example: true
+The following HTML:
+
+```html
+<a href="test.html">xxx</a>
+```
+
+becomes:
+
+```javascript
+[ { raw: 'a href="test.html"'
+  , data: 'a href="test.html"'
+  , type: 'tag'
+  , name: 'a'
+  , attribs: { href: 'test.html' }
+  , children: [ { raw: 'xxx', data: 'xxx', type: 'text' } ]
+  }
+]
+```
+
+####Example: false
+The following HTML:
+
+```javascript
+<a href="test.html">xxx</a>
+```
+
+becomes:
+
+```javascript
+[ { type: 'tag'
+  , name: 'a'
+  , attribs: { href: 'test.html' }
+  , children: [ { data: 'xxx', type: 'text' } ]
+  }
+]
+```
+
+###Option: enforceEmptyTags
+Indicates whether the DOM should prevent children on tags marked as empty in the HTML spec. Typically this should be set to "true" HTML parsing and "false" for XML parsing. The default value is "true".
+
+####Example: true
+The following HTML:
+
+```html
+<link>text</link>
+```
+
+becomes:
+
+```javascript
+[ { raw: 'link', data: 'link', type: 'tag', name: 'link' }
+, { raw: 'text', data: 'text', type: 'text' }
+]
+```
+
+####Example: false
+The following HTML:
+
+```html
+<link>text</link>
+```
+
+becomes:
+
+```javascript
+[ { raw: 'link'
+  , data: 'link'
+  , type: 'tag'
+  , name: 'link'
+  , children: [ { raw: 'text', data: 'text', type: 'text' } ]
+  }
+]
+```
+
+##DomUtils
+
+###TBD (see utils_example.js for now)
+
+##Related Projects
+
+Looking for CSS selectors to search the DOM? Try Node-SoupSelect, a port of SoupSelect to NodeJS: http://github.com/harryf/node-soupselect
+
+There's also a port of hpricot to NodeJS that uses HtmlParser for HTML parsing: http://github.com/silentrob/Apricot
+
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/a b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/a
new file mode 100644
index 0000000..c3079b6
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/a
@@ -0,0 +1,20 @@
+{ type: 'rss',
+  id: '',
+  title: 'Liftoff News',
+  link: 'http://liftoff.msfc.nasa.gov/',
+  description: 'Liftoff to Space Exploration.',
+  items: 
+   [ { id: 'http://liftoff.msfc.nasa.gov/2003/06/03.html#item573',
+       title: 'Star City',
+       link: 'http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp',
+       description: 'How do Americans get ready to work with Russians aboard the International Space Station? They take a crash course in culture, language and protocol at Russia\'s <a href="http://howe.iki.rssi.ru/GCTC/gctc_e.htm">Star City</a>.' },
+     { id: 'http://liftoff.msfc.nasa.gov/2003/05/30.html#item572',
+       description: 'Sky watchers in Europe, Asia, and parts of Alaska and Canada will experience a <a href="http://science.nasa.gov/headlines/y2003/30may_solareclipse.htm">partial eclipse of the Sun</a> on Saturday, May 31st.' },
+     { id: 'http://liftoff.msfc.nasa.gov/2003/05/27.html#item571',
+       title: 'The Engine That Does More',
+       link: 'http://liftoff.msfc.nasa.gov/news/2003/news-VASIMR.asp',
+       description: 'Before man travels to Mars, NASA hopes to design new engines that will let us fly through the Solar System more quickly.  The proposed VASIMR engine would do that.' },
+     { id: 'http://liftoff.msfc.nasa.gov/2003/05/20.html#item570',
+       title: 'Astronauts\' Dirty Laundry',
+       link: 'http://liftoff.msfc.nasa.gov/news/2003/news-laundry.asp',
+       description: 'Compared to earlier spacecraft, the International Space Station has many luxuries, but laundry facilities are not one of them.  Instead, astronauts have other options.' } ] }
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/b b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/b
new file mode 100644
index 0000000..db44d69
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/b
@@ -0,0 +1,26 @@
+{ type: 'rss',
+  id: '',
+  title: 'Liftoff News',
+  link: 'http://liftoff.msfc.nasa.gov/',
+  description: 'Liftoff to Space Exploration.',
+  updated: Tue, 10 Jun 2003 09:41:01 GMT,
+  author: 'editor at example.com',
+  items: 
+   [ { id: 'http://liftoff.msfc.nasa.gov/2003/06/03.html#item573',
+       title: 'Star City',
+       link: 'http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp',
+       description: 'How do Americans get ready to work with Russians aboard the International Space Station? They take a crash course in culture, language and protocol at Russia\'s <a href="http://howe.iki.rssi.ru/GCTC/gctc_e.htm">Star City</a>.',
+       pubDate: Tue, 03 Jun 2003 09:39:21 GMT },
+     { id: 'http://liftoff.msfc.nasa.gov/2003/05/30.html#item572',
+       description: 'Sky watchers in Europe, Asia, and parts of Alaska and Canada will experience a <a href="http://science.nasa.gov/headlines/y2003/30may_solareclipse.htm">partial eclipse of the Sun</a> on Saturday, May 31st.',
+       pubDate: Fri, 30 May 2003 11:06:42 GMT },
+     { id: 'http://liftoff.msfc.nasa.gov/2003/05/27.html#item571',
+       title: 'The Engine That Does More',
+       link: 'http://liftoff.msfc.nasa.gov/news/2003/news-VASIMR.asp',
+       description: 'Before man travels to Mars, NASA hopes to design new engines that will let us fly through the Solar System more quickly.  The proposed VASIMR engine would do that.',
+       pubDate: Tue, 27 May 2003 08:37:32 GMT },
+     { id: 'http://liftoff.msfc.nasa.gov/2003/05/20.html#item570',
+       title: 'Astronauts\' Dirty Laundry',
+       link: 'http://liftoff.msfc.nasa.gov/news/2003/news-laundry.asp',
+       description: 'Compared to earlier spacecraft, the International Space Station has many luxuries, but laundry facilities are not one of them.  Instead, astronauts have other options.',
+       pubDate: Tue, 20 May 2003 08:56:02 GMT } ] }
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/c b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/c
new file mode 100644
index 0000000..4f1710c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/c
@@ -0,0 +1,35 @@
+[ { raw: 'html',
+    data: 'html',
+    type: 'tag',
+    location: { line: 1, col: 0 },
+    name: 'html',
+    children: 
+     [ { raw: '\n\n',
+         data: '\n\n',
+         type: 'text',
+         location: { line: 1, col: 5 } },
+       { raw: 'title',
+         data: 'title',
+         type: 'tag',
+         location: { line: 1, col: 0 },
+         name: 'title',
+         children: 
+          [ { raw: 'The Title',
+              data: 'The Title',
+              type: 'text',
+              location: { line: 1, col: 0 } } ] },
+       { raw: 'body',
+         data: 'body',
+         type: 'tag',
+         location: { line: 1, col: 0 },
+         name: 'body',
+         children: 
+          [ { raw: '\nHello world\n\n',
+              data: '\nHello world\n\n',
+              type: 'text',
+              location: { line: 1, col: 0 } } ] },
+       { raw: '\n\n',
+         data: '\n\n',
+         type: 'text',
+         location: { line: 1, col: 0 } } ] } ]
+
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/json2.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/json2.js
new file mode 100644
index 0000000..a1a3b17
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/json2.js
@@ -0,0 +1,482 @@
+/*
+    http://www.JSON.org/json2.js
+    2010-03-20
+
+    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 */
+
+/*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 () {
+
+    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');
+        };
+    }
+}());
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/lib/htmlparser.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/lib/htmlparser.js
new file mode 100644
index 0000000..d955578
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/lib/htmlparser.js
@@ -0,0 +1,823 @@
+/***********************************************
+Copyright 2010, 2011, Chris Winberry <chris at winberry.net>. All rights reserved.
+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.
+***********************************************/
+/* v1.7.6 */
+
+(function () {
+
+function runningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!runningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	else if (this.Tautologistics.NodeHtmlParser)
+		return; //NodeHtmlParser already defined!
+	this.Tautologistics.NodeHtmlParser = {};
+	exports = this.Tautologistics.NodeHtmlParser;
+}
+
+//Types of elements found in the DOM
+var ElementType = {
+	  Text: "text" //Plain text
+	, Directive: "directive" //Special tag <!...>
+	, Comment: "comment" //Special tag <!--...-->
+	, Script: "script" //Special tag <script>...</script>
+	, Style: "style" //Special tag <style>...</style>
+	, Tag: "tag" //Any tag that isn't special
+}
+
+function Parser (handler, options) {
+	this._options = options ? options : { };
+	if (this._options.includeLocation == undefined) {
+		this._options.includeLocation = false; //Do not track element position in document by default
+	}
+
+	this.validateHandler(handler);
+	this._handler = handler;
+	this.reset();
+}
+
+	//**"Static"**//
+	//Regular expressions used for cleaning up and parsing (stateless)
+	Parser._reTrim = /(^\s+|\s+$)/g; //Trim leading/trailing whitespace
+	Parser._reTrimComment = /(^\!--|--$)/g; //Remove comment tag markup from comment contents
+	Parser._reWhitespace = /\s/g; //Used to find any whitespace to split on
+	Parser._reTagName = /^\s*(\/?)\s*([^\s\/]+)/; //Used to find the tag name for an element
+
+	//Regular expressions used for parsing (stateful)
+	Parser._reAttrib = //Find attributes in a tag
+		/([^=<>\"\'\s]+)\s*=\s*"([^"]*)"|([^=<>\"\'\s]+)\s*=\s*'([^']*)'|([^=<>\"\'\s]+)\s*=\s*([^'"\s]+)|([^=<>\"\'\s\/]+)/g;
+	Parser._reTags = /[\<\>]/g; //Find tag markers
+
+	//**Public**//
+	//Methods//
+	//Parses a complete HTML and pushes it to the handler
+	Parser.prototype.parseComplete = function Parser$parseComplete (data) {
+		this.reset();
+		this.parseChunk(data);
+		this.done();
+	}
+
+	//Parses a piece of an HTML document
+	Parser.prototype.parseChunk = function Parser$parseChunk (data) {
+		if (this._done)
+			this.handleError(new Error("Attempted to parse chunk after parsing already done"));
+		this._buffer += data; //FIXME: this can be a bottleneck
+		this.parseTags();
+	}
+
+	//Tells the parser that the HTML being parsed is complete
+	Parser.prototype.done = function Parser$done () {
+		if (this._done)
+			return;
+		this._done = true;
+	
+		//Push any unparsed text into a final element in the element list
+		if (this._buffer.length) {
+			var rawData = this._buffer;
+			this._buffer = "";
+			var element = {
+				  raw: rawData
+				, data: (this._parseState == ElementType.Text) ? rawData : rawData.replace(Parser._reTrim, "")
+				, type: this._parseState
+				};
+			if (this._parseState == ElementType.Tag || this._parseState == ElementType.Script || this._parseState == ElementType.Style)
+				element.name = this.parseTagName(element.data);
+			this.parseAttribs(element);
+			this._elements.push(element);
+		}
+	
+		this.writeHandler();
+		this._handler.done();
+	}
+
+	//Resets the parser to a blank state, ready to parse a new HTML document
+	Parser.prototype.reset = function Parser$reset () {
+		this._buffer = "";
+		this._done = false;
+		this._elements = [];
+		this._elementsCurrent = 0;
+		this._current = 0;
+		this._next = 0;
+		this._location = {
+			  row: 0
+			, col: 0
+			, charOffset: 0
+			, inBuffer: 0
+		};
+		this._parseState = ElementType.Text;
+		this._prevTagSep = '';
+		this._tagStack = [];
+		this._handler.reset();
+	}
+	
+	//**Private**//
+	//Properties//
+	Parser.prototype._options = null; //Parser options for how to behave
+	Parser.prototype._handler = null; //Handler for parsed elements
+	Parser.prototype._buffer = null; //Buffer of unparsed data
+	Parser.prototype._done = false; //Flag indicating whether parsing is done
+	Parser.prototype._elements =  null; //Array of parsed elements
+	Parser.prototype._elementsCurrent = 0; //Pointer to last element in _elements that has been processed
+	Parser.prototype._current = 0; //Position in data that has already been parsed
+	Parser.prototype._next = 0; //Position in data of the next tag marker (<>)
+	Parser.prototype._location = null; //Position tracking for elements in a stream
+	Parser.prototype._parseState = ElementType.Text; //Current type of element being parsed
+	Parser.prototype._prevTagSep = ''; //Previous tag marker found
+	//Stack of element types previously encountered; keeps track of when
+	//parsing occurs inside a script/comment/style tag
+	Parser.prototype._tagStack = null;
+
+	//Methods//
+	//Takes an array of elements and parses any found attributes
+	Parser.prototype.parseTagAttribs = function Parser$parseTagAttribs (elements) {
+		var idxEnd = elements.length;
+		var idx = 0;
+	
+		while (idx < idxEnd) {
+			var element = elements[idx++];
+			if (element.type == ElementType.Tag || element.type == ElementType.Script || element.type == ElementType.style)
+				this.parseAttribs(element);
+		}
+	
+		return(elements);
+	}
+
+	//Takes an element and adds an "attribs" property for any element attributes found 
+	Parser.prototype.parseAttribs = function Parser$parseAttribs (element) {
+		//Only parse attributes for tags
+		if (element.type != ElementType.Script && element.type != ElementType.Style && element.type != ElementType.Tag)
+			return;
+	
+		var tagName = element.data.split(Parser._reWhitespace, 1)[0];
+		var attribRaw = element.data.substring(tagName.length);
+		if (attribRaw.length < 1)
+			return;
+	
+		var match;
+		Parser._reAttrib.lastIndex = 0;
+		while (match = Parser._reAttrib.exec(attribRaw)) {
+			if (element.attribs == undefined)
+				element.attribs = {};
+	
+			if (typeof match[1] == "string" && match[1].length) {
+				element.attribs[match[1]] = match[2];
+			} else if (typeof match[3] == "string" && match[3].length) {
+				element.attribs[match[3].toString()] = match[4].toString();
+			} else if (typeof match[5] == "string" && match[5].length) {
+				element.attribs[match[5]] = match[6];
+			} else if (typeof match[7] == "string" && match[7].length) {
+				element.attribs[match[7]] = match[7];
+			}
+		}
+	}
+
+	//Extracts the base tag name from the data value of an element
+	Parser.prototype.parseTagName = function Parser$parseTagName (data) {
+		if (data == null || data == "")
+			return("");
+		var match = Parser._reTagName.exec(data);
+		if (!match)
+			return("");
+		return((match[1] ? "/" : "") + match[2]);
+	}
+
+	//Parses through HTML text and returns an array of found elements
+	//I admit, this function is rather large but splitting up had an noticeable impact on speed
+	Parser.prototype.parseTags = function Parser$parseTags () {
+		var bufferEnd = this._buffer.length - 1;
+		while (Parser._reTags.test(this._buffer)) {
+			this._next = Parser._reTags.lastIndex - 1;
+			var tagSep = this._buffer.charAt(this._next); //The currently found tag marker
+			var rawData = this._buffer.substring(this._current, this._next); //The next chunk of data to parse
+	
+			//A new element to eventually be appended to the element list
+			var element = {
+				  raw: rawData
+				, data: (this._parseState == ElementType.Text) ? rawData : rawData.replace(Parser._reTrim, "")
+				, type: this._parseState
+			};
+	
+			var elementName = this.parseTagName(element.data);
+	
+			//This section inspects the current tag stack and modifies the current
+			//element if we're actually parsing a special area (script/comment/style tag)
+			if (this._tagStack.length) { //We're parsing inside a script/comment/style tag
+				if (this._tagStack[this._tagStack.length - 1] == ElementType.Script) { //We're currently in a script tag
+					if (elementName.toLowerCase() == "/script") //Actually, we're no longer in a script tag, so pop it off the stack
+						this._tagStack.pop();
+					else { //Not a closing script tag
+						if (element.raw.indexOf("!--") != 0) { //Make sure we're not in a comment
+							//All data from here to script close is now a text element
+							element.type = ElementType.Text;
+							//If the previous element is text, append the current text to it
+							if (this._elements.length && this._elements[this._elements.length - 1].type == ElementType.Text) {
+								var prevElement = this._elements[this._elements.length - 1];
+								prevElement.raw = prevElement.data = prevElement.raw + this._prevTagSep + element.raw;
+								element.raw = element.data = ""; //This causes the current element to not be added to the element list
+							}
+						}
+					}
+				}
+				else if (this._tagStack[this._tagStack.length - 1] == ElementType.Style) { //We're currently in a style tag
+					if (elementName.toLowerCase() == "/style") //Actually, we're no longer in a style tag, so pop it off the stack
+						this._tagStack.pop();
+					else {
+						if (element.raw.indexOf("!--") != 0) { //Make sure we're not in a comment
+							//All data from here to style close is now a text element
+							element.type = ElementType.Text;
+							//If the previous element is text, append the current text to it
+							if (this._elements.length && this._elements[this._elements.length - 1].type == ElementType.Text) {
+								var prevElement = this._elements[this._elements.length - 1];
+								if (element.raw != "") {
+									prevElement.raw = prevElement.data = prevElement.raw + this._prevTagSep + element.raw;
+									element.raw = element.data = ""; //This causes the current element to not be added to the element list
+								} else { //Element is empty, so just append the last tag marker found
+									prevElement.raw = prevElement.data = prevElement.raw + this._prevTagSep;
+								}
+							} else { //The previous element was not text
+								if (element.raw != "") {
+									element.raw = element.data = element.raw;
+								}
+							}
+						}
+					}
+				}
+				else if (this._tagStack[this._tagStack.length - 1] == ElementType.Comment) { //We're currently in a comment tag
+					var rawLen = element.raw.length;
+					if (element.raw.charAt(rawLen - 2) == "-" && element.raw.charAt(rawLen - 1) == "-" && tagSep == ">") {
+						//Actually, we're no longer in a style tag, so pop it off the stack
+						this._tagStack.pop();
+						//If the previous element is a comment, append the current text to it
+						if (this._elements.length && this._elements[this._elements.length - 1].type == ElementType.Comment) {
+							var prevElement = this._elements[this._elements.length - 1];
+							prevElement.raw = prevElement.data = (prevElement.raw + element.raw).replace(Parser._reTrimComment, "");
+							element.raw = element.data = ""; //This causes the current element to not be added to the element list
+							element.type = ElementType.Text;
+						}
+						else //Previous element not a comment
+							element.type = ElementType.Comment; //Change the current element's type to a comment
+					}
+					else { //Still in a comment tag
+						element.type = ElementType.Comment;
+						//If the previous element is a comment, append the current text to it
+						if (this._elements.length && this._elements[this._elements.length - 1].type == ElementType.Comment) {
+							var prevElement = this._elements[this._elements.length - 1];
+							prevElement.raw = prevElement.data = prevElement.raw + element.raw + tagSep;
+							element.raw = element.data = ""; //This causes the current element to not be added to the element list
+							element.type = ElementType.Text;
+						}
+						else
+							element.raw = element.data = element.raw + tagSep;
+					}
+				}
+			}
+	
+			//Processing of non-special tags
+			if (element.type == ElementType.Tag) {
+				element.name = elementName;
+				var elementNameCI = elementName.toLowerCase();
+				
+				if (element.raw.indexOf("!--") == 0) { //This tag is really comment
+					element.type = ElementType.Comment;
+					delete element["name"];
+					var rawLen = element.raw.length;
+					//Check if the comment is terminated in the current element
+					if (element.raw.charAt(rawLen - 1) == "-" && element.raw.charAt(rawLen - 2) == "-" && tagSep == ">")
+						element.raw = element.data = element.raw.replace(Parser._reTrimComment, "");
+					else { //It's not so push the comment onto the tag stack
+						element.raw += tagSep;
+						this._tagStack.push(ElementType.Comment);
+					}
+				}
+				else if (element.raw.indexOf("!") == 0 || element.raw.indexOf("?") == 0) {
+					element.type = ElementType.Directive;
+					//TODO: what about CDATA?
+				}
+				else if (elementNameCI == "script") {
+					element.type = ElementType.Script;
+					//Special tag, push onto the tag stack if not terminated
+					if (element.data.charAt(element.data.length - 1) != "/")
+						this._tagStack.push(ElementType.Script);
+				}
+				else if (elementNameCI == "/script")
+					element.type = ElementType.Script;
+				else if (elementNameCI == "style") {
+					element.type = ElementType.Style;
+					//Special tag, push onto the tag stack if not terminated
+					if (element.data.charAt(element.data.length - 1) != "/")
+						this._tagStack.push(ElementType.Style);
+				}
+				else if (elementNameCI == "/style")
+					element.type = ElementType.Style;
+				if (element.name && element.name.charAt(0) == "/")
+					element.data = element.name;
+			}
+	
+			//Add all tags and non-empty text elements to the element list
+			if (element.raw != "" || element.type != ElementType.Text) {
+				if (this._options.includeLocation && !element.location) {
+					element.location = this.getLocation(element.type == ElementType.Tag);
+				}
+				this.parseAttribs(element);
+				this._elements.push(element);
+				//If tag self-terminates, add an explicit, separate closing tag
+				if (
+					element.type != ElementType.Text
+					&&
+					element.type != ElementType.Comment
+					&&
+					element.type != ElementType.Directive
+					&&
+					element.data.charAt(element.data.length - 1) == "/"
+					)
+					this._elements.push({
+						  raw: "/" + element.name
+						, data: "/" + element.name
+						, name: "/" + element.name
+						, type: element.type
+					});
+			}
+			this._parseState = (tagSep == "<") ? ElementType.Tag : ElementType.Text;
+			this._current = this._next + 1;
+			this._prevTagSep = tagSep;
+		}
+
+		if (this._options.includeLocation) {
+			this.getLocation();
+			this._location.row += this._location.inBuffer;
+			this._location.inBuffer = 0;
+			this._location.charOffset = 0;
+		}
+		this._buffer = (this._current <= bufferEnd) ? this._buffer.substring(this._current) : "";
+		this._current = 0;
+	
+		this.writeHandler();
+	}
+
+	Parser.prototype.getLocation = function Parser$getLocation (startTag) {
+		var c,
+			l = this._location,
+			end = this._current - (startTag ? 1 : 0),
+			chunk = startTag && l.charOffset == 0 && this._current == 0;
+		
+		for (; l.charOffset < end; l.charOffset++) {
+			c = this._buffer.charAt(l.charOffset);
+			if (c == '\n') {
+				l.inBuffer++;
+				l.col = 0;
+			} else if (c != '\r') {
+				l.col++;
+			}
+		}
+		return {
+			  line: l.row + l.inBuffer + 1
+			, col: l.col + (chunk ? 0: 1)
+		};
+	}
+
+	//Checks the handler to make it is an object with the right "interface"
+	Parser.prototype.validateHandler = function Parser$validateHandler (handler) {
+		if ((typeof handler) != "object")
+			throw new Error("Handler is not an object");
+		if ((typeof handler.reset) != "function")
+			throw new Error("Handler method 'reset' is invalid");
+		if ((typeof handler.done) != "function")
+			throw new Error("Handler method 'done' is invalid");
+		if ((typeof handler.writeTag) != "function")
+			throw new Error("Handler method 'writeTag' is invalid");
+		if ((typeof handler.writeText) != "function")
+			throw new Error("Handler method 'writeText' is invalid");
+		if ((typeof handler.writeComment) != "function")
+			throw new Error("Handler method 'writeComment' is invalid");
+		if ((typeof handler.writeDirective) != "function")
+			throw new Error("Handler method 'writeDirective' is invalid");
+	}
+
+	//Writes parsed elements out to the handler
+	Parser.prototype.writeHandler = function Parser$writeHandler (forceFlush) {
+		forceFlush = !!forceFlush;
+		if (this._tagStack.length && !forceFlush)
+			return;
+		while (this._elements.length) {
+			var element = this._elements.shift();
+			switch (element.type) {
+				case ElementType.Comment:
+					this._handler.writeComment(element);
+					break;
+				case ElementType.Directive:
+					this._handler.writeDirective(element);
+					break;
+				case ElementType.Text:
+					this._handler.writeText(element);
+					break;
+				default:
+					this._handler.writeTag(element);
+					break;
+			}
+		}
+	}
+
+	Parser.prototype.handleError = function Parser$handleError (error) {
+		if ((typeof this._handler.error) == "function")
+			this._handler.error(error);
+		else
+			throw error;
+	}
+
+//TODO: make this a trully streamable handler
+function RssHandler (callback) {
+	RssHandler.super_.call(this, callback, { ignoreWhitespace: true, verbose: false, enforceEmptyTags: false });
+}
+inherits(RssHandler, DefaultHandler);
+
+	RssHandler.prototype.done = function RssHandler$done () {
+		var feed = { };
+		var feedRoot;
+
+		var found = DomUtils.getElementsByTagName(function (value) { return(value == "rss" || value == "feed"); }, this.dom, false);
+		if (found.length) {
+			feedRoot = found[0];
+		}
+		if (feedRoot) {
+			if (feedRoot.name == "rss") {
+				feed.type = "rss";
+				feedRoot = feedRoot.children[0]; //<channel/>
+				feed.id = "";
+				try {
+					feed.title = DomUtils.getElementsByTagName("title", feedRoot.children, false)[0].children[0].data;
+				} catch (ex) { }
+				try {
+					feed.link = DomUtils.getElementsByTagName("link", feedRoot.children, false)[0].children[0].data;
+				} catch (ex) { }
+				try {
+					feed.description = DomUtils.getElementsByTagName("description", feedRoot.children, false)[0].children[0].data;
+				} catch (ex) { }
+				try {
+					feed.updated = new Date(DomUtils.getElementsByTagName("lastBuildDate", feedRoot.children, false)[0].children[0].data);
+				} catch (ex) { }
+				try {
+					feed.author = DomUtils.getElementsByTagName("managingEditor", feedRoot.children, false)[0].children[0].data;
+				} catch (ex) { }
+				feed.items = [];
+				DomUtils.getElementsByTagName("item", feedRoot.children).forEach(function (item, index, list) {
+					var entry = {};
+					try {
+						entry.id = DomUtils.getElementsByTagName("guid", item.children, false)[0].children[0].data;
+					} catch (ex) { }
+					try {
+						entry.title = DomUtils.getElementsByTagName("title", item.children, false)[0].children[0].data;
+					} catch (ex) { }
+					try {
+						entry.link = DomUtils.getElementsByTagName("link", item.children, false)[0].children[0].data;
+					} catch (ex) { }
+					try {
+						entry.description = DomUtils.getElementsByTagName("description", item.children, false)[0].children[0].data;
+					} catch (ex) { }
+					try {
+						entry.pubDate = new Date(DomUtils.getElementsByTagName("pubDate", item.children, false)[0].children[0].data);
+					} catch (ex) { }
+					feed.items.push(entry);
+				});
+			} else {
+				feed.type = "atom";
+				try {
+					feed.id = DomUtils.getElementsByTagName("id", feedRoot.children, false)[0].children[0].data;
+				} catch (ex) { }
+				try {
+					feed.title = DomUtils.getElementsByTagName("title", feedRoot.children, false)[0].children[0].data;
+				} catch (ex) { }
+				try {
+					feed.link = DomUtils.getElementsByTagName("link", feedRoot.children, false)[0].attribs.href;
+				} catch (ex) { }
+				try {
+					feed.description = DomUtils.getElementsByTagName("subtitle", feedRoot.children, false)[0].children[0].data;
+				} catch (ex) { }
+				try {
+					feed.updated = new Date(DomUtils.getElementsByTagName("updated", feedRoot.children, false)[0].children[0].data);
+				} catch (ex) { }
+				try {
+					feed.author = DomUtils.getElementsByTagName("email", feedRoot.children, true)[0].children[0].data;
+				} catch (ex) { }
+				feed.items = [];
+				DomUtils.getElementsByTagName("entry", feedRoot.children).forEach(function (item, index, list) {
+					var entry = {};
+					try {
+						entry.id = DomUtils.getElementsByTagName("id", item.children, false)[0].children[0].data;
+					} catch (ex) { }
+					try {
+						entry.title = DomUtils.getElementsByTagName("title", item.children, false)[0].children[0].data;
+					} catch (ex) { }
+					try {
+						entry.link = DomUtils.getElementsByTagName("link", item.children, false)[0].attribs.href;
+					} catch (ex) { }
+					try {
+						entry.description = DomUtils.getElementsByTagName("summary", item.children, false)[0].children[0].data;
+					} catch (ex) { }
+					try {
+						entry.pubDate = new Date(DomUtils.getElementsByTagName("updated", item.children, false)[0].children[0].data);
+					} catch (ex) { }
+					feed.items.push(entry);
+				});
+			}
+
+			this.dom = feed;
+		}
+		RssHandler.super_.prototype.done.call(this);
+	}
+
+///////////////////////////////////////////////////
+
+function DefaultHandler (callback, options) {
+	this.reset();
+	this._options = options ? options : { };
+	if (this._options.ignoreWhitespace == undefined)
+		this._options.ignoreWhitespace = false; //Keep whitespace-only text nodes
+	if (this._options.verbose == undefined)
+		this._options.verbose = true; //Keep data property for tags and raw property for all
+	if (this._options.enforceEmptyTags == undefined)
+		this._options.enforceEmptyTags = true; //Don't allow children for HTML tags defined as empty in spec
+	if ((typeof callback) == "function")
+		this._callback = callback;
+}
+
+	//**"Static"**//
+	//HTML Tags that shouldn't contain child nodes
+	DefaultHandler._emptyTags = {
+		  area: 1
+		, base: 1
+		, basefont: 1
+		, br: 1
+		, col: 1
+		, frame: 1
+		, hr: 1
+		, img: 1
+		, input: 1
+		, isindex: 1
+		, link: 1
+		, meta: 1
+		, param: 1
+		, embed: 1
+	}
+	//Regex to detect whitespace only text nodes
+	DefaultHandler.reWhitespace = /^\s*$/;
+
+	//**Public**//
+	//Properties//
+	DefaultHandler.prototype.dom = null; //The hierarchical object containing the parsed HTML
+	//Methods//
+	//Resets the handler back to starting state
+	DefaultHandler.prototype.reset = function DefaultHandler$reset() {
+		this.dom = [];
+		this._done = false;
+		this._tagStack = [];
+		this._tagStack.last = function DefaultHandler$_tagStack$last () {
+			return(this.length ? this[this.length - 1] : null);
+		}
+	}
+	//Signals the handler that parsing is done
+	DefaultHandler.prototype.done = function DefaultHandler$done () {
+		this._done = true;
+		this.handleCallback(null);
+	}
+	DefaultHandler.prototype.writeTag = function DefaultHandler$writeTag (element) {
+		this.handleElement(element);
+	} 
+	DefaultHandler.prototype.writeText = function DefaultHandler$writeText (element) {
+		if (this._options.ignoreWhitespace)
+			if (DefaultHandler.reWhitespace.test(element.data))
+				return;
+		this.handleElement(element);
+	} 
+	DefaultHandler.prototype.writeComment = function DefaultHandler$writeComment (element) {
+		this.handleElement(element);
+	} 
+	DefaultHandler.prototype.writeDirective = function DefaultHandler$writeDirective (element) {
+		this.handleElement(element);
+	}
+	DefaultHandler.prototype.error = function DefaultHandler$error (error) {
+		this.handleCallback(error);
+	}
+
+	//**Private**//
+	//Properties//
+	DefaultHandler.prototype._options = null; //Handler options for how to behave
+	DefaultHandler.prototype._callback = null; //Callback to respond to when parsing done
+	DefaultHandler.prototype._done = false; //Flag indicating whether handler has been notified of parsing completed
+	DefaultHandler.prototype._tagStack = null; //List of parents to the currently element being processed
+	//Methods//
+	DefaultHandler.prototype.handleCallback = function DefaultHandler$handleCallback (error) {
+			if ((typeof this._callback) != "function")
+				if (error)
+					throw error;
+				else
+					return;
+			this._callback(error, this.dom);
+	}
+	
+	DefaultHandler.prototype.isEmptyTag = function(element) {
+		var name = element.name.toLowerCase();
+		if (name.charAt(0) == '/') {
+			name = name.substring(1);
+		}
+		return this._options.enforceEmptyTags && !!DefaultHandler._emptyTags[name];
+	};
+	
+	DefaultHandler.prototype.handleElement = function DefaultHandler$handleElement (element) {
+		if (this._done)
+			this.handleCallback(new Error("Writing to the handler after done() called is not allowed without a reset()"));
+		if (!this._options.verbose) {
+//			element.raw = null; //FIXME: Not clean
+			//FIXME: Serious performance problem using delete
+			delete element.raw;
+			if (element.type == "tag" || element.type == "script" || element.type == "style")
+				delete element.data;
+		}
+		if (!this._tagStack.last()) { //There are no parent elements
+			//If the element can be a container, add it to the tag stack and the top level list
+			if (element.type != ElementType.Text && element.type != ElementType.Comment && element.type != ElementType.Directive) {
+				if (element.name.charAt(0) != "/") { //Ignore closing tags that obviously don't have an opening tag
+					this.dom.push(element);
+					if (!this.isEmptyTag(element)) { //Don't add tags to the tag stack that can't have children
+						this._tagStack.push(element);
+					}
+				}
+			}
+			else //Otherwise just add to the top level list
+				this.dom.push(element);
+		}
+		else { //There are parent elements
+			//If the element can be a container, add it as a child of the element
+			//on top of the tag stack and then add it to the tag stack
+			if (element.type != ElementType.Text && element.type != ElementType.Comment && element.type != ElementType.Directive) {
+				if (element.name.charAt(0) == "/") {
+					//This is a closing tag, scan the tagStack to find the matching opening tag
+					//and pop the stack up to the opening tag's parent
+					var baseName = element.name.substring(1);
+					if (!this.isEmptyTag(element)) {
+						var pos = this._tagStack.length - 1;
+						while (pos > -1 && this._tagStack[pos--].name != baseName) { }
+						if (pos > -1 || this._tagStack[0].name == baseName)
+							while (pos < this._tagStack.length - 1)
+								this._tagStack.pop();
+					}
+				}
+				else { //This is not a closing tag
+					if (!this._tagStack.last().children)
+						this._tagStack.last().children = [];
+					this._tagStack.last().children.push(element);
+					if (!this.isEmptyTag(element)) //Don't add tags to the tag stack that can't have children
+						this._tagStack.push(element);
+				}
+			}
+			else { //This is not a container element
+				if (!this._tagStack.last().children)
+					this._tagStack.last().children = [];
+				this._tagStack.last().children.push(element);
+			}
+		}
+	}
+
+	var DomUtils = {
+		  testElement: function DomUtils$testElement (options, element) {
+			if (!element) {
+				return false;
+			}
+	
+			for (var key in options) {
+				if (key == "tag_name") {
+					if (element.type != "tag" && element.type != "script" && element.type != "style") {
+						return false;
+					}
+					if (!options["tag_name"](element.name)) {
+						return false;
+					}
+				} else if (key == "tag_type") {
+					if (!options["tag_type"](element.type)) {
+						return false;
+					}
+				} else if (key == "tag_contains") {
+					if (element.type != "text" && element.type != "comment" && element.type != "directive") {
+						return false;
+					}
+					if (!options["tag_contains"](element.data)) {
+						return false;
+					}
+				} else {
+					if (!element.attribs || !options[key](element.attribs[key])) {
+						return false;
+					}
+				}
+			}
+		
+			return true;
+		}
+	
+		, getElements: function DomUtils$getElements (options, currentElement, recurse, limit) {
+			recurse = (recurse === undefined || recurse === null) || !!recurse;
+			limit = isNaN(parseInt(limit)) ? -1 : parseInt(limit);
+
+			if (!currentElement) {
+				return([]);
+			}
+	
+			var found = [];
+			var elementList;
+
+			function getTest (checkVal) {
+				return(function (value) { return(value == checkVal); });
+			}
+			for (var key in options) {
+				if ((typeof options[key]) != "function") {
+					options[key] = getTest(options[key]);
+				}
+			}
+	
+			if (DomUtils.testElement(options, currentElement)) {
+				found.push(currentElement);
+			}
+
+			if (limit >= 0 && found.length >= limit) {
+				return(found);
+			}
+
+			if (recurse && currentElement.children) {
+				elementList = currentElement.children;
+			} else if (currentElement instanceof Array) {
+				elementList = currentElement;
+			} else {
+				return(found);
+			}
+	
+			for (var i = 0; i < elementList.length; i++) {
+				found = found.concat(DomUtils.getElements(options, elementList[i], recurse, limit));
+				if (limit >= 0 && found.length >= limit) {
+					break;
+				}
+			}
+	
+			return(found);
+		}
+		
+		, getElementById: function DomUtils$getElementById (id, currentElement, recurse) {
+			var result = DomUtils.getElements({ id: id }, currentElement, recurse, 1);
+			return(result.length ? result[0] : null);
+		}
+		
+		, getElementsByTagName: function DomUtils$getElementsByTagName (name, currentElement, recurse, limit) {
+			return(DomUtils.getElements({ tag_name: name }, currentElement, recurse, limit));
+		}
+		
+		, getElementsByTagType: function DomUtils$getElementsByTagType (type, currentElement, recurse, limit) {
+			return(DomUtils.getElements({ tag_type: type }, currentElement, recurse, limit));
+		}
+	}
+
+	function inherits (ctor, superCtor) {
+		var tempCtor = function(){};
+		tempCtor.prototype = superCtor.prototype;
+		ctor.super_ = superCtor;
+		ctor.prototype = new tempCtor();
+		ctor.prototype.constructor = ctor;
+	}
+
+exports.Parser = Parser;
+
+exports.DefaultHandler = DefaultHandler;
+
+exports.RssHandler = RssHandler;
+
+exports.ElementType = ElementType;
+
+exports.DomUtils = DomUtils;
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/lib/htmlparser.min.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/lib/htmlparser.min.js
new file mode 100644
index 0000000..c1281c5
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/lib/htmlparser.min.js
@@ -0,0 +1,22 @@
+/***********************************************
+Copyright 2010, 2011, Chris Winberry <chris at winberry.net>. All rights reserved.
+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.
+***********************************************/
+/* v1.7.6 */
+(function(){function e(a,c){this._options=c?c:{};void 0==this._options.includeLocation&&(this._options.includeLocation=!1);this.validateHandler(a);this._handler=a;this.reset()}function j(a){j.super_.call(this,a,{ignoreWhitespace:!0,verbose:!1,enforceEmptyTags:!1})}function g(a,c){this.reset();this._options=c?c:{};void 0==this._options.ignoreWhitespace&&(this._options.ignoreWhitespace=!1);void 0==this._options.verbose&&(this._options.verbose=!0);void 0==this._options.enforceEmptyTags&&(th [...]
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/lib/node-htmlparser.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/lib/node-htmlparser.js
new file mode 100644
index 0000000..1fc03ea
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/lib/node-htmlparser.js
@@ -0,0 +1,6 @@
+var htmlparser = require("./htmlparser");
+exports.Parser = htmlparser.Parser;
+exports.DefaultHandler = htmlparser.DefaultHandler;
+exports.RssHandler = htmlparser.RssHandler;
+exports.ElementType = htmlparser.ElementType;
+exports.DomUtils = htmlparser.DomUtils;
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/lib/node-htmlparser.min.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/lib/node-htmlparser.min.js
new file mode 100644
index 0000000..27d5eea
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/lib/node-htmlparser.min.js
@@ -0,0 +1,6 @@
+var htmlparser = require("./htmlparser.min");
+exports.Parser = htmlparser.Parser;
+exports.DefaultHandler = htmlparser.DefaultHandler;
+exports.RssHandler = htmlparser.RssHandler;
+exports.ElementType = htmlparser.ElementType;
+exports.DomUtils = htmlparser.DomUtils;
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/new/a b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/new/a
new file mode 100644
index 0000000..4506b37
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/new/a
@@ -0,0 +1,6 @@
+[
+{"type":"tag","name":"script","name_raw":"script","raw":"script language='javascript'"},
+{"type":"attr","name":"langauge","name_raw":"language","value":"javascript"},
+{"type":"text","data":"\nvar foo = '<bar>xxx</bar>';\n"},
+{"type":"tag","name":"/script","name_raw":"/script","raw":"/script"}
+]
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/new/b b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/new/b
new file mode 100644
index 0000000..759c80f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/new/b
@@ -0,0 +1,6 @@
+[
+{"type":"tag","name":"script","name_raw":"script","raw":"script language='javascript'"},
+{"type":"attr","name":"language","name_raw":"language","value":"javascript"},
+{"type":"text","data":"\nvar foo = '<bar>xxx</bar>';\n"},
+{"type":"tag","name":"/script","name_raw":"/script","raw":"/script"}
+]
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/new/compat.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/new/compat.js
new file mode 100644
index 0000000..eb1f4e7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/new/compat.js
@@ -0,0 +1,954 @@
+var htmlparser_old = require('../lib/htmlparser');
+var htmlparser_new = require('./htmlparser');
+
+var tests = {
+
+    'plain text': {
+        data: ['This is the text']
+        , expected: [{ type: 'text', data: 'This is the text' }]
+    }
+
+    , 'split text': {
+        data: ['This is', ' the text']
+        , expected: [{ type: 'text', data: 'This is the text' }]
+    }
+
+    , 'simple tag': {
+        data: ['<div>']
+        , expected: [{ type: 'tag', name: 'div', raw: 'div' }]
+    }
+
+    , 'simple comment': {
+        data: ['<!-- content -->']
+        , expected: [{ type: 'comment', data: ' content ' }]
+    }
+
+    , 'simple cdata': {
+        data: ['<![CDATA[ content ]]>']
+        , expected: [{ type: 'cdata', data: ' content ' }]
+    }
+
+    , 'split simple tag #1': {
+        data: ['<', 'div>']
+        , expected: [{ type: 'tag', name: 'div', raw: 'div' }]
+    }
+
+    , 'split simple tag #2': {
+        data: ['<d', 'iv>']
+        , expected: [{ type: 'tag', name: 'div', raw: 'div' }]
+    }
+
+    , 'split simple tag #3': {
+        data: ['<div', '>']
+        , expected: [{ type: 'tag', name: 'div', raw: 'div' }]
+    }
+
+    , 'text before tag': {
+        data: ['xxx<div>']
+        , expected: [
+            { type: 'text', data: 'xxx'},
+            { type: 'tag', name: 'div', raw: 'div' }
+            ]
+    }
+
+    , 'text after tag': {
+        data: ['<div>xxx']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div' },
+            { type: 'text', data: 'xxx'}
+            ]
+    }
+
+    , 'text inside tag': {
+        data: ['<div>xxx</div>']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div' },
+            { type: 'text', data: 'xxx'},
+            { type: 'tag', name: '/div', raw: '/div' }
+            ]
+    }
+
+    , 'attribute with single quotes': {
+        data: ['<div a=\'1\'>']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div a=\'1\'' },
+            { type: 'attr', name:'a', data: '1'}
+            ]
+    }
+
+    , 'attribute with double quotes': {
+        data: ['<div a="1">']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div a="1"' },
+            { type: 'attr', name:'a', data: '1'}
+            ]
+    }
+
+    , 'attribute with no quotes': {
+        data: ['<div a=1>']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div a=1' },
+            { type: 'attr', name:'a', data: '1'}
+            ]
+    }
+
+    , 'attribute with no value': {
+        data: ['<div wierd>']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div wierd' },
+            { type: 'attr', name:'wierd', data: null}
+            ]
+    }
+
+    , 'attribute with no value, trailing text': {
+        data: ['<div wierd>xxx']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div wierd' },
+            { type: 'attr', name:'wierd', data: null},
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'tag with multiple attributes': {
+        data: ['<div a="1" b="2">']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div a="1" b="2"' },
+            { type: 'attr', name:'a', data: '1'},
+            { type: 'attr', name:'b', data: '2'}
+            ]
+    }
+
+    , 'tag with multiple attributes, trailing text': {
+        data: ['<div a="1" b="2">xxx']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div a="1" b="2"' },
+            { type: 'attr', name:'a', data: '1'},
+            { type: 'attr', name:'b', data: '2'},
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'tag with mixed attributes #1': {
+        data: ['<div a=1 b=\'2\' c="3">']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div a=1 b=\'2\' c="3"' },
+            { type: 'attr', name:'a', data: '1'},
+            { type: 'attr', name:'b', data: '2'},
+            { type: 'attr', name:'c', data: '3'}
+            ]
+    }
+
+    , 'tag with mixed attributes #2': {
+        data: ['<div a=1 b="2" c=\'3\'>']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div a=1 b="2" c=\'3\'' },
+            { type: 'attr', name:'a', data: '1'},
+            { type: 'attr', name:'b', data: '2'},
+            { type: 'attr', name:'c', data: '3'}
+            ]
+    }
+
+    , 'tag with mixed attributes #3': {
+        data: ['<div a=\'1\' b=2 c="3">']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div a=\'1\' b=2 c="3"' },
+            { type: 'attr', name:'a', data: '1'},
+            { type: 'attr', name:'b', data: '2'},
+            { type: 'attr', name:'c', data: '3'}
+            ]
+    }
+
+    , 'tag with mixed attributes #4': {
+        data: ['<div a=\'1\' b="2" c=3>']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div a=\'1\' b="2" c=3' },
+            { type: 'attr', name:'a', data: '1'},
+            { type: 'attr', name:'b', data: '2'},
+            { type: 'attr', name:'c', data: '3'}
+            ]
+    }
+
+    , 'tag with mixed attributes #5': {
+        data: ['<div a="1" b=2 c=\'3\'>']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div a="1" b=2 c=\'3\'' },
+            { type: 'attr', name:'a', data: '1'},
+            { type: 'attr', name:'b', data: '2'},
+            { type: 'attr', name:'c', data: '3'}
+            ]
+    }
+
+    , 'tag with mixed attributes #6': {
+        data: ['<div a="1" b=\'2\' c="3">']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div a="1" b=\'2\' c="3"' },
+            { type: 'attr', name:'a', data: '1'},
+            { type: 'attr', name:'b', data: '2'},
+            { type: 'attr', name:'c', data: '3'}
+            ]
+    }
+
+    , 'tag with mixed attributes, trailing text': {
+        data: ['<div a=1 b=\'2\' c="3">xxx']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div a=1 b=\'2\' c="3"' },
+            { type: 'attr', name:'a', data: '1'},
+            { type: 'attr', name:'b', data: '2'},
+            { type: 'attr', name:'c', data: '3'},
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'self closing tag': {
+        data: ['<div/>']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div/' },
+            { type: 'tag', name: '/div', raw: null }
+            ]
+    }
+
+    , 'self closing tag, trailing text': {
+        data: ['<div/>xxx']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div/' },
+            { type: 'tag', name: '/div', raw: null },
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'self closing tag with spaces #1': {
+        data: ['<div />']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div /' },
+            { type: 'tag', name: '/div', raw: null }
+            ]
+    }
+
+    , 'self closing tag with spaces #2': {
+        data: ['<div/ >']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div/ ' },
+            { type: 'tag', name: '/div', raw: null }
+            ]
+    }
+
+    , 'self closing tag with spaces #3': {
+        data: ['<div / >']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div / ' },
+            { type: 'tag', name: '/div', raw: null }
+            ]
+    }
+
+    , 'self closing tag with spaces, trailing text': {
+        data: ['<div / >xxx']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div / ' },
+            { type: 'tag', name: '/div', raw: null },
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'self closing tag with attribute': {
+        data: ['<div a=b />']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div a=b /' },
+            { type: 'attr', name:'a', data: 'b'},
+            { type: 'tag', name: '/div', raw: null }
+            ]
+    }
+
+    , 'self closing tag with attribute, trailing text': {
+        data: ['<div a=b />xxx']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div a=b /' },
+            { type: 'attr', name:'a', data: 'b'},
+            { type: 'tag', name: '/div', raw: null },
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'self closing tag split #1': {
+        data: ['<div/', '>']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div/' },
+            { type: 'tag', name: '/div', raw: null }
+            ]
+    }
+
+    , 'self closing tag split #2': {
+        data: ['<div', '/>']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div/' },
+            { type: 'tag', name: '/div', raw: null }
+            ]
+    }
+
+    , 'attribute missing close quote': {
+        data: ['<div a="1><span id="foo">xxx']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div a="1><span id="foo' },
+            { type: 'attr', name:'a', data: '1><span id='},
+            { type: 'attr', name:'foo', data: null},
+            { type: 'text', data: 'xxx'}
+            ]
+    }
+
+    , 'split attribute #1': {
+        data: ['<div x', 'xx="yyy">']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div xxx="yyy"' },
+            { type: 'attr', name:'xxx', data: 'yyy'}
+            ]
+    }
+
+    , 'split attribute #2': {
+        data: ['<div xxx', '="yyy">']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div xxx="yyy"' },
+            { type: 'attr', name:'xxx', data: 'yyy'}
+            ]
+    }
+
+    , 'split attribute #3': {
+        data: ['<div xxx=', '"yyy">']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div xxx="yyy"' },
+            { type: 'attr', name:'xxx', data: 'yyy'}
+            ]
+    }
+
+    , 'split attribute #4': {
+        data: ['<div xxx="', 'yyy">']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div xxx="yyy"' },
+            { type: 'attr', name:'xxx', data: 'yyy'}
+            ]
+    }
+
+    , 'split attribute #5': {
+        data: ['<div xxx="yy', 'y">']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div xxx="yyy"' },
+            { type: 'attr', name:'xxx', data: 'yyy'}
+            ]
+    }
+
+    , 'split attribute #6': {
+        data: ['<div xxx="yyy', '">']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div xxx="yyy"' },
+            { type: 'attr', name:'xxx', data: 'yyy'}
+            ]
+    }
+
+    , 'attribute split from tag #1': {
+        data: ['<div ', 'xxx="yyy">']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div xxx="yyy"' },
+            { type: 'attr', name:'xxx', data: 'yyy'}
+            ]
+    }
+
+    , 'attribute split from tag #2': {
+        data: ['<div', ' xxx="yyy">']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div xxx="yyy"' },
+            { type: 'attr', name:'xxx', data: 'yyy'}
+            ]
+    }
+
+    , 'text before complex tag': {
+        data: ['xxx<div yyy="123">']
+        , expected: [
+            { type: 'text', data: 'xxx' },
+            { type: 'tag', name: 'div', raw: 'div yyy="123"'},
+            { type: 'attr', name: 'yyy', data: '123' }
+            ]
+    }
+
+    , 'text after complex tag': {
+        data: ['<div yyy="123">xxx']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div yyy="123"'},
+            { type: 'attr', name: 'yyy', data: '123' },
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'text inside complex tag': {
+        data: ['<div yyy="123">xxx</div>']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div yyy="123"'},
+            { type: 'attr', name: 'yyy', data: '123' },
+            { type: 'text', data: 'xxx' },
+            { type: 'tag', name: '/div', raw: '/div'}
+            ]
+    }
+
+    , 'nested tags': {
+        data: ['<div><span></span></div>']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div'},
+            { type: 'tag', name: 'span', raw: 'span'},
+            { type: 'tag', name: '/span', raw: '/span'},
+            { type: 'tag', name: '/div', raw: '/div'}
+            ]
+    }
+
+    , 'nested tags with attributes': {
+        data: ['<div aaa="bbb"><span 123=\'456\'>xxx</span></div>']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div aaa="bbb"'},
+            { type: 'attr', name: 'aaa', data: 'bbb' },
+            { type: 'tag', name: 'span', raw: 'span 123=\'456\''},
+            { type: 'attr', name: '123', data: '456' },
+            { type: 'text', data: 'xxx' },
+            { type: 'tag', name: '/span', raw: '/span'},
+            { type: 'tag', name: '/div', raw: '/div'}
+            ]
+    }
+
+    , 'comment inside tag': {
+        data: ['<div><!-- comment text --></div>']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div'},
+            { type: 'comment', data: ' comment text '},
+            { type: 'tag', name: '/div', raw: '/div'}
+            ]
+    }
+
+    , 'cdata inside tag': {
+        data: ['<div><![CDATA[ CData content ]]></div>']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div'},
+            { type: 'cdata', data: ' CData content '},
+            { type: 'tag', name: '/div', raw: '/div'}
+            ]
+    }
+
+    , 'html inside comment': {
+        data: ['<!-- <div>foo</div> -->']
+        , expected: [{ type: 'comment', data: ' <div>foo</div> '}]
+    }
+
+    , 'html inside cdata': {
+        data: ['<![CDATA[ <div>foo</div> ]]>']
+        , expected: [{ type: 'cdata', data: ' <div>foo</div> '}]
+    }
+
+    , 'quotes in attribute #1': {
+        data: ['<div xxx=\'a"b\'>']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div xxx=\'a"b\''},
+            { type: 'attr', name: 'xxx', data: 'a"b' }
+            ]
+    }
+
+    , 'quotes in attribute #2': {
+        data: ['<div xxx="a\'b">']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div xxx="a\'b"'},
+            { type: 'attr', name: 'xxx', data: 'a\'b' }
+            ]
+    }
+
+    , 'brackets in attribute': {
+        data: ['<div xxx="</div>">']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div xxx="</div>"'},
+            { type: 'attr', name: 'xxx', data: '</div>' }
+            ]
+    }
+
+    , 'split comment #1': {
+        data: ['<','!-- comment text -->xxx']
+        , expected: [
+            { type: 'comment', data: ' comment text '},
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'split comment #2': {
+        data: ['<!','-- comment text -->xxx']
+        , expected: [
+            { type: 'comment', data: ' comment text '},
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'split comment #3': {
+        data: ['<!-','- comment text -->xxx']
+        , expected: [
+            { type: 'comment', data: ' comment text '},
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'split comment #4': {
+        data: ['<!--',' comment text -->xxx']
+        , expected: [
+            { type: 'comment', data: ' comment text '},
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'split comment #5': {
+        data: ['<!-- comment',' text -->xxx']
+        , expected: [
+            { type: 'comment', data: ' comment text '},
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'split comment #6': {
+        data: ['<!-- comment text ','-->xxx']
+        , expected: [
+            { type: 'comment', data: ' comment text '},
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'split comment #7': {
+        data: ['<!-- comment text -','->xxx']
+        , expected: [
+            { type: 'comment', data: ' comment text '},
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'split comment #8': {
+        data: ['<!-- comment text --','>xxx']
+        , expected: [
+            { type: 'comment', data: ' comment text '},
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'split cdata #1': {
+        data: ['<','![CDATA[ CData content ]]>']
+        , expected: [{ type: 'cdata', data: ' CData content '}]
+    }
+
+    , 'split cdata #2': {
+        data: ['<!','[CDATA[ CData content ]]>']
+        , expected: [{ type: 'cdata', data: ' CData content '}]
+    }
+
+    , 'split cdata #3': {
+        data: ['<![','CDATA[ CData content ]]>']
+        , expected: [{ type: 'cdata', data: ' CData content '}]
+    }
+
+    , 'split cdata #4': {
+        data: ['<![C','DATA[ CData content ]]>']
+        , expected: [{ type: 'cdata', data: ' CData content '}]
+    }
+
+    , 'split cdata #5': {
+        data: ['<![CD','ATA[ CData content ]]>']
+        , expected: [{ type: 'cdata', data: ' CData content '}]
+    }
+
+    , 'split cdata #6': {
+        data: ['<![CDA','TA[ CData content ]]>']
+        , expected: [{ type: 'cdata', data: ' CData content '}]
+    }
+
+    , 'split cdata #7': {
+        data: ['<![CDAT','A[ CData content ]]>']
+        , expected: [{ type: 'cdata', data: ' CData content '}]
+    }
+
+    , 'split cdata #8': {
+        data: ['<![CDATA','[ CData content ]]>']
+        , expected: [{ type: 'cdata', data: ' CData content '}]
+    }
+
+    , 'split cdata #9': {
+        data: ['<![CDATA[',' CData content ]]>']
+        , expected: [{ type: 'cdata', data: ' CData content '}]
+    }
+
+    , 'split cdata #10': {
+        data: ['<![CDATA[ CData ','content ]]>']
+        , expected: [{ type: 'cdata', data: ' CData content '}]
+    }
+
+    , 'split cdata #11': {
+        data: ['<![CDATA[ CData content ',']]>']
+        , expected: [{ type: 'cdata', data: ' CData content '}]
+    }
+
+    , 'split cdata #12': {
+        data: ['<![CDATA[ CData content ]',']>']
+        , expected: [{ type: 'cdata', data: ' CData content '}]
+    }
+
+    , 'split cdata #13': {
+        data: ['<![CDATA[ CData content ]]','>']
+        , expected: [{ type: 'cdata', data: ' CData content '}]
+    }
+
+    , 'unfinished simple tag #1': {
+        data: ['<div']
+        , expected: [{ type: 'tag', name: 'div', raw: 'div'}]
+    }
+
+    , 'unfinished simple tag #2': {
+        data: ['<div ']
+        , expected: [{ type: 'tag', name: 'div', raw: 'div '}]
+    }
+
+    , 'unfinished complex tag #1': {
+        data: ['<div foo="bar"']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div foo="bar"'},
+            { type: 'attr', name: 'foo', data: 'bar' }
+            ]
+    }
+
+    , 'unfinished complex tag #2': {
+        data: ['<div foo="bar" ']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div foo="bar" '},
+            { type: 'attr', name: 'foo', data: 'bar' }
+            ]
+    }
+
+    , 'unfinished comment #1': {
+        data: ['<!-- comment text']
+        , expected: [{ type: 'comment', data: ' comment text'}]
+    }
+
+    , 'unfinished comment #2': {
+        data: ['<!-- comment text ']
+        , expected: [{ type: 'comment', data: ' comment text '}]
+    }
+
+    , 'unfinished comment #3': {
+        data: ['<!-- comment text -']
+        , expected: [{ type: 'comment', data: ' comment text -'}]
+    }
+
+    , 'unfinished comment #4': {
+        data: ['<!-- comment text --']
+        , expected: [{ type: 'comment', data: ' comment text --'}]
+    }
+
+    , 'unfinished cdata #1': {
+        data: ['<![CDATA[ content']
+        , expected: [{ type: 'cdata', data: ' content'}]
+    }
+
+    , 'unfinished cdata #2': {
+        data: ['<![CDATA[ content ']
+        , expected: [{ type: 'cdata', data: ' content '}]
+    }
+
+    , 'unfinished cdata #3': {
+        data: ['<![CDATA[ content ]']
+        , expected: [{ type: 'cdata', data: ' content ]'}]
+    }
+
+    , 'unfinished cdata #4': {
+        data: ['<![CDATA[ content ]]']
+        , expected: [{ type: 'cdata', data: ' content ]]'}]
+    }
+
+    , 'unfinished attribute #1': {
+        data: ['<div foo="bar']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div foo="bar' },
+            { type: 'attr', name: 'foo', data: 'bar' }
+            ]
+    }
+
+    , 'unfinished attribute #2': {
+        data: ['<div foo="']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div foo="' },
+            { type: 'attr', name: 'foo', data: null }
+            ]
+    }
+
+    , 'spaces in tag #1': {
+        data: ['< div>']
+        , expected: [{ type: 'tag', name: 'div', raw: ' div' }]
+    }
+
+    , 'spaces in tag #2': {
+        data: ['<div >']
+        , expected: [{ type: 'tag', name: 'div', raw: 'div ' }]
+    }
+
+    , 'spaces in tag #3': {
+        data: ['< div >']
+        , expected: [{ type: 'tag', name: 'div', raw: ' div ' }]
+    }
+
+    , 'spaces in closing tag #1': {
+        data: ['< /div>']
+        , expected: [{ type: 'tag', name: '/div', raw: ' /div' }]
+    }
+
+    , 'spaces in closing tag #2': {
+        data: ['</ div>']
+        , expected: [{ type: 'tag', name: '/div', raw: '/ div' }]
+    }
+
+    , 'spaces in closing tag #3': {
+        data: ['</div >']
+        , expected: [{ type: 'tag', name: '/div', raw: '/div ' }]
+    }
+
+    , 'spaces in closing tag #4': {
+        data: ['< / div >']
+        , expected: [{ type: 'tag', name: '/div', raw: ' / div ' }]
+    }
+
+    , 'spaces in tag, trailing text': {
+        data: ['< div >xxx']
+        , expected: [
+            { type: 'tag', name: 'div', raw: ' div ' },
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'spaces in attributes #1': {
+        data: ['<div foo ="bar">']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div foo ="bar"' },
+            { type: 'attr', name: 'foo', data: 'bar' }
+            ]
+    }
+
+    , 'spaces in attributes #2': {
+        data: ['<div foo= "bar">']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div foo= "bar"' },
+            { type: 'attr', name: 'foo', data: 'bar' }
+            ]
+    }
+
+    , 'spaces in attributes #3': {
+        data: ['<div foo = "bar">']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div foo = "bar"' },
+            { type: 'attr', name: 'foo', data: 'bar' }
+            ]
+    }
+
+    , 'spaces in attributes #4': {
+        data: ['<div foo =bar>']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div foo =bar' },
+            { type: 'attr', name: 'foo', data: 'bar' }
+            ]
+    }
+
+    , 'spaces in attributes #5': {
+        data: ['<div foo= bar>']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div foo= bar' },
+            { type: 'attr', name: 'foo', data: 'bar' }
+            ]
+    }
+
+    , 'spaces in attributes #6': {
+        data: ['<div foo = bar>']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div foo = bar' },
+            { type: 'attr', name: 'foo', data: 'bar' }
+            ]
+    }
+
+    , 'mixed case tag': {
+        data: ['<diV>']
+        , expected: [{ type: 'tag', name: 'diV', raw: 'diV' }]
+    }
+
+    , 'upper case tag': {
+        data: ['<DIV>']
+        , expected: [{ type: 'tag', name: 'DIV', raw: 'DIV' }]
+    }
+
+    , 'mixed case attribute': {
+        data: ['<div xXx="yyy">']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div xXx="yyy"' },
+            { type: 'attr', name: 'xXx', data: 'yyy' }
+            ]
+    }
+
+    , 'upper case case attribute': {
+        data: ['<div XXX="yyy">']
+        , expected: [
+            { type: 'tag', name: 'div', raw: 'div XXX="yyy"' },
+            { type: 'attr', name: 'XXX', data: 'yyy' }
+            ]
+    }
+
+    , 'multiline simple tag': {
+        data: ["<\ndiv\n>"]
+        , expected: [
+            { type: 'tag', name: 'div', raw: "\ndiv\n" }
+            ]
+    }
+
+    , 'multiline complex tag': {
+        data: ["<\ndiv\nid='foo'\n>"]
+        , expected: [
+            { type: 'tag', name: 'div', raw: "\ndiv\nid='foo'\n" },
+            { type: 'attr', name: 'id', data: 'foo' }
+            ]
+    }
+
+    , 'multiline comment': {
+        data: ["<!--\ncomment text\n-->"]
+        , expected: [
+            { type: 'comment', data: "\ncomment text\n" }
+            ]
+    }
+
+    , 'cdata comment': {
+        data: ["<![CDATA[\nCData content\n]]>"]
+        , expected: [
+            { type: 'cdata', data: "\nCData content\n" }
+            ]
+    }
+
+    , 'multiline attribute #1': {
+        data: ["<div id='\nxxx\nyyy\n'>"]
+        , expected: [
+            { type: 'tag', name: 'div', raw: "div id='\nxxx\nyyy\n'" },
+            { type: 'attr', name: 'id', data: "\nxxx\nyyy\n" }
+            ]
+    }
+
+    , 'multiline attribute #2': {
+        data: ["<div id=\"\nxxx\nyyy\n\">"]
+        , expected: [
+            { type: 'tag', name: 'div', raw: "div id=\"\nxxx\nyyy\n\"" },
+            { type: 'attr', name: 'id', data: "\nxxx\nyyy\n" }
+            ]
+    }
+
+    , 'tags in script tag code': {
+        data: ["<script language='javascript'>\nvar foo = '<bar>xxx</bar>';\n</script>"]
+        , expected: [
+            { type: 'tag', name: 'script', raw: "script language='javascript'" },
+            { type: 'attr', name: 'language', data: 'javascript' },
+            { type: 'text', data: "\nvar foo = '<bar>xxx</bar>';\n" },
+            { type: 'tag', name: '/script', raw: "/script" },
+            ]
+    }
+
+    , 'closing script tag in script tag code': {
+        data: ["<script language='javascript'>\nvar foo = '</script>';\n</script>"]
+        , expected: [
+            { type: 'tag', name: 'script', raw: "script language='javascript'" },
+            { type: 'attr', name: 'language', data: 'javascript' },
+            { type: 'text', data: "\nvar foo = '" },
+            { type: 'tag', name: '/script', raw: "/script" },
+            { type: 'text', data: "';\n" },
+            { type: 'tag', name: '/script', raw: "/script" }
+            ]
+    }
+
+    , 'comment in script tag code': {
+        data: ["<script language='javascript'>\nvar foo = '<!-- xxx -->';\n</script>"]
+        , expected: [
+            { type: 'tag', name: 'script', raw: "script language='javascript'" },
+            { type: 'attr', name: 'language', data: 'javascript' },
+            { type: 'text', data: "\nvar foo = '<!-- xxx -->';\n" },
+            { type: 'tag', name: '/script', raw: "/script" },
+            ]
+    }
+
+    , 'cdata in script tag code': {
+        data: ["<script language='javascript'>\nvar foo = '<![CDATA[ xxx ]]>';\n</script>"]
+        , expected: [
+            { type: 'tag', name: 'script', raw: "script language='javascript'" },
+            { type: 'attr', name: 'language', data: 'javascript' },
+            { type: 'text', data: "\nvar foo = '<![CDATA[ xxx ]]>';\n" },
+            { type: 'tag', name: '/script', raw: "/script" },
+            ]
+    }
+
+    , 'commented script tag code': {
+        data: ["<script language='javascript'>\n<!--\nvar foo = '<bar>xxx</bar>';\n//-->\n</script>"]
+        , expected: [
+            { type: 'tag', name: 'script', raw: "script language='javascript'" },
+            { type: 'attr', name: 'language', data: 'javascript' },
+            { type: 'text', data: "\n<!--\nvar foo = '<bar>xxx</bar>';\n//-->\n" },
+            { type: 'tag', name: '/script', raw: "/script" },
+            ]
+    }
+
+    , 'cdata in script tag': {
+        data: ["<script language='javascript'>\n<![CDATA[\nvar foo = '<bar>xxx</bar>';\n]]>\n</script>"]
+        , expected: [
+            { type: 'tag', name: 'script', raw: "script language='javascript'" },
+            { type: 'attr', name: 'language', data: 'javascript' },
+            { type: 'text', data: "\n<![CDATA[\nvar foo = '<bar>xxx</bar>';\n]]>\n" },
+            { type: 'tag', name: '/script', raw: "/script" },
+            ]
+    }
+
+};
+
+function runTests (permutator) {
+    var callback = function handlerCallback (err) {
+        if (err) {
+            console.log('Handler error', err);
+        }
+    }
+    var handler = new htmlparser_new.HtmlHandler(callback);
+    var parser = new htmlparser_new.Parser(handler);
+
+    var passed = 0;
+    var failed = 0;
+
+    console.time('Tests');
+    for (var testName in tests) {
+        var test = permutator ? permutator(tests[testName]) : tests[testName];
+        process.stdout.write('[TEST] ' + testName + ' : ');
+        parser.reset();
+        for (var i = 0, len = test.data.length; i < len; i++) {
+            parser.parseChunk(test.data[i]);
+        }
+        parser.done();
+        var expected = JSON.stringify(test.expected);
+        var result = JSON.stringify(parser.state.output);
+        if (expected !== result) {
+            failed++;
+            process.stdout.write("FAIL\n");
+            console.log('    [EXPECTED]', expected);
+            console.log('    [ RESULT ]', result);
+        } else {
+            passed++;
+            process.stdout.write("Ok\n");
+        }
+    }
+    console.timeEnd('Tests');
+    console.log('Passed tests: ' + passed + '/' + (passed + failed) + ' (' + Math.round(passed / (passed + failed) * 100) + '%)');
+}
+
+runTests();
+runTests(function (test) {
+    test.data = test.data.join('').split('');
+    return test;
+});
+
+function handlerCallback (err, dom) {
+    console.log(err || dom);
+}
+
+var handlerOld = new htmlparser_old.DefaultHandler(handlerCallback);
+var parserOld = new htmlparser_old.Parser(handlerOld);
+
+var handlerNew = new htmlparser_new.HtmlHandler(null, handlerCallback);
+var parserNew = new htmlparser_new.Parser(handlerNew);
+parserNew.parseComplete('<html></html>');
+
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/new/htmlparser.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/new/htmlparser.js
new file mode 100644
index 0000000..6b9bfe9
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/new/htmlparser.js
@@ -0,0 +1,645 @@
+(function () {
+
+function runningInNode () {
+    return(
+        (typeof require) == "function"
+        &&
+        (typeof exports) == "object"
+        &&
+        (typeof module) == "object"
+        &&
+        (typeof __filename) == "string"
+        &&
+        (typeof __dirname) == "string"
+        );
+}
+
+if (!runningInNode()) {
+    if (!this.Tautologistics)
+        this.Tautologistics = {};
+    else if (this.Tautologistics.NodeHtmlParser)
+        return; //NodeHtmlParser already defined!
+    this.Tautologistics.NodeHtmlParser = {};
+    exports = this.Tautologistics.NodeHtmlParser;
+}
+
+var Mode = {
+    Text: 'text',
+    Tag: 'tag',
+    Attr: 'attr',
+    CData: 'cdata',
+    Comment: 'comment'
+};
+
+var re_parseText_scriptClose = /<\s*\/\s*script/ig;
+function parseText (state) {
+    var foundPos;
+    if (state.isScript) {
+        re_parseText_scriptClose.lastIndex = state.pos;
+        foundPos = re_parseText_scriptClose.exec(state.data);
+        foundPos = (foundPos) ?
+            foundPos.index
+            :
+            -1
+            ;
+    } else {
+        foundPos = state.data.indexOf('<', state.pos);
+    }
+    var text = (foundPos === -1) ? state.data.substring(state.pos, state.data.length) : state.data.substring(state.pos, foundPos);
+    if (foundPos < 0 && state.done) {
+        foundPos = state.data.length;
+    }
+    if (foundPos < 0) {
+        if (state.isScript) {
+            state.needData = true;
+            return;
+        }
+        if (!state.pendingText) {
+            state.pendingText = [];
+        }
+        state.pendingText.push(state.data.substring(state.pos, state.data.length));
+        state.pos = state.data.length;
+    } else {
+        if (state.pendingText) {
+            state.pendingText.push(state.data.substring(state.pos, foundPos));
+            text = state.pendingText.join('');
+            state.pendingText = null;
+        } else {
+            text = state.data.substring(state.pos, foundPos);
+        }
+        if (text !== '') {
+            state.output.push({ type: Mode.Text, data: text });
+        }
+        state.pos = foundPos + 1;
+        state.mode = Mode.Tag;
+    }
+}
+
+var re_parseTag = /\s*(\/?)\s*([^\s>\/]+)(\s*)(>?)/g;
+function parseTag (state) {
+    re_parseTag.lastIndex = state.pos;
+    var match = re_parseTag.exec(state.data);
+    if (match) {
+        if (!match[1] && match[2].substr(0, 3) === '!--') {
+            state.mode = Mode.Comment;
+            state.pos += 3;
+            return;
+        }
+        if (!match[1] && match[2].substr(0, 8) === '![CDATA[') {
+            state.mode = Mode.CData;
+            state.pos += 8;
+            return;
+        }
+        if (!state.done && (state.pos + match[0].length) === state.data.length) {
+            //We're at the and of the data, might be incomplete
+            state.needData = true;
+            return;
+        }
+        var raw;
+        if (match[4] === '>') {
+            state.mode = Mode.Text;
+            raw = match[0].substr(0, match[0].length - 1);
+        } else {
+            state.mode = Mode.Attr;
+            raw = match[0];
+        }
+        state.pos += match[0].length;
+        var tag = { type: Mode.Tag, name: match[1] + match[2], raw: raw };
+        if (state.mode === Mode.Attr) {
+            state.lastTag = tag;
+        }
+        if (tag.name.toLowerCase() === 'script') {
+            state.isScript = true;
+        } else if (tag.name.toLowerCase() === '/script') {
+            state.isScript = false;
+        }
+        state.output.push(tag);
+    } else {
+        //TODO: end of tag?
+        //TODO: push to pending?
+        state.needData = true;
+    }
+}
+
+var re_parseAttr_findName = /\s*([^=<>\s'"\/]+)\s*/g;
+function parseAttr_findName (state) {
+    re_parseAttr_findName.lastIndex = state.pos;
+    var match = re_parseAttr_findName.exec(state.data);
+    if (!match) {
+        return null;
+    }
+    if (state.pos + match[0].length !== re_parseAttr_findName.lastIndex) {
+        return null;
+    }
+    return {
+          match: match[0]
+        , name: match[1]
+        };
+}
+var re_parseAttr_findValue = /\s*=\s*(?:'([^']*)'|"([^"]*)"|([^'"\s\/>]+))\s*/g;
+var re_parseAttr_findValue_last = /\s*=\s*['"]?(.*)$/g;
+function parseAttr_findValue (state) {
+    re_parseAttr_findValue.lastIndex = state.pos;
+    var match = re_parseAttr_findValue.exec(state.data);
+    if (!match) {
+        if (!state.done) {
+            return null;
+        }
+        re_parseAttr_findValue_last.lastIndex = state.pos;
+        match = re_parseAttr_findValue_last.exec(state.data);
+        if (!match) {
+            return null;
+        }
+        return {
+              match: match[0]
+            , value: (match[1] !== '') ? match[1] : null
+            };
+    }
+    if (state.pos + match[0].length !== re_parseAttr_findValue.lastIndex) {
+        return null;
+    }
+    return {
+          match: match[0]
+        , value: match[1] || match[2] || match[3]
+        };
+}
+var re_parseAttr_splitValue = /\s*=\s*['"]?/g;
+var re_parseAttr_selfClose = /(\s*\/\s*)(>?)/g;
+function parseAttr (state) {
+    var name_data = parseAttr_findName(state);
+    if (!name_data) {
+        re_parseAttr_selfClose.lastIndex = state.pos;
+        var matchTrailingSlash = re_parseAttr_selfClose.exec(state.data);
+        if (matchTrailingSlash && matchTrailingSlash.index === state.pos) {
+            if (!state.done && !matchTrailingSlash[2] && state.pos + matchTrailingSlash[0].length === state.data.length) {
+                state.needData = true;
+                return;
+            }
+            state.lastTag.raw += matchTrailingSlash[1];
+            state.output.push({ type: Mode.Tag, name: '/' + state.lastTag.name, raw: null });
+            state.pos += matchTrailingSlash[1].length;
+        }
+        var foundPos = state.data.indexOf('>', state.pos);
+        if (foundPos < 0) {
+            if (state.done) { //TODO: is this needed?
+                state.lastTag.raw += state.data.substr(state.pos);
+                state.pos = state.data.length;
+                return;
+            }
+            state.needData = true;
+        } else {
+            // state.lastTag = null;
+            state.pos = foundPos + 1;
+            state.mode = Mode.Text;
+        }
+        return;
+    }
+    if (!state.done && state.pos + name_data.match.length === state.data.length) {
+        state.needData = true;
+        return null;
+    }
+    state.pos += name_data.match.length;
+    var value_data = parseAttr_findValue(state);
+    if (value_data) {
+        if (!state.done && state.pos + value_data.match.length === state.data.length) {
+            state.needData = true;
+            state.pos -= name_data.match.length;
+            return;
+        }
+        state.pos += value_data.match.length;
+    } else {
+        re_parseAttr_splitValue.lastIndex = state.pos;
+        if (re_parseAttr_splitValue.exec(state.data)) {
+            state.needData = true;
+            state.pos -= name_data.match.length;
+            return;
+        }
+        value_data = {
+              match: ''
+            , value: null
+            };
+    }
+    state.lastTag.raw += name_data.match + value_data.match;
+
+    state.output.push({ type: Mode.Attr, name: name_data.name, data: value_data.value });
+}
+
+var re_parseCData_findEnding = /\]{1,2}$/;
+function parseCData (state) {
+    var foundPos = state.data.indexOf(']]>', state.pos);
+    if (foundPos < 0 && state.done) {
+        foundPos = state.data.length;
+    }
+    if (foundPos < 0) {
+        re_parseCData_findEnding.lastIndex = state.pos;
+        var matchPartialCDataEnd = re_parseCData_findEnding.exec(state.data);
+        if (matchPartialCDataEnd) {
+            state.needData = true;
+            return;
+        }
+        if (!state.pendingText) {
+            state.pendingText = [];
+        }
+        state.pendingText.push(state.data.substr(state.pos, state.data.length));
+        state.pos = state.data.length;
+        state.needData = true;
+    } else {
+        var text;
+        if (state.pendingText) {
+            state.pendingText.push(state.data.substring(state.pos, foundPos));
+            text = state.pendingText.join('');
+            state.pendingText = null;
+        } else {
+            text = state.data.substring(state.pos, foundPos);
+        }
+        state.output.push({ type: Mode.CData, data: text });
+        state.mode = Mode.Text;
+        state.pos = foundPos + 3;
+    }
+}
+
+var re_parseComment_findEnding = /\-{1,2}$/;
+function parseComment (state) {
+    var foundPos = state.data.indexOf('-->', state.pos);
+    if (foundPos < 0 && state.done) {
+        foundPos = state.data.length;
+    }
+    if (foundPos < 0) {
+        re_parseComment_findEnding.lastIndex = state.pos;
+        var matchPartialCommentEnd = re_parseComment_findEnding.exec(state.data);
+        if (matchPartialCommentEnd) {
+            state.needData = true;
+            return;
+        }
+        if (!state.pendingText) {
+            state.pendingText = [];
+        }
+        state.pendingText.push(state.data.substr(state.pos, state.data.length));
+        state.pos = state.data.length;
+        state.needData = true;
+    } else {
+        var text;
+        if (state.pendingText) {
+            state.pendingText.push(state.data.substring(state.pos, foundPos));
+            text = state.pendingText.join('');
+            state.pendingText = null;
+        } else {
+            text = state.data.substring(state.pos, foundPos);
+        }
+        state.output.push({ type: Mode.Comment, data: text });
+        state.mode = Mode.Text;
+        state.pos = foundPos + 3;
+    }
+}
+
+function parse (state) {
+    switch (state.mode) {
+        case Mode.Text:
+            return parseText(state);
+        case Mode.Tag:
+            return parseTag(state);
+        case Mode.Attr:
+            return parseAttr(state);
+        case Mode.CData:
+            return parseCData(state);
+        case Mode.Comment:
+            return parseComment(state);
+    }
+}
+
+function Parser (handler, options) {
+    this._options = options ? options : { };
+    if (this._options.includeLocation == undefined) {
+        this._options.includeLocation = false; //Do not track element position in document by default
+    }
+
+    this.validateHandler(handler);
+    var self = this;
+    this._handler = handler;
+    this.reset();
+}
+
+    Parser.prototype.reset = function Parser$reset () {
+        this.state = {
+            mode: Mode.Text,
+            pos: 0,
+            data: null,
+            pendingText: null,
+            lastTag: null,
+            isScript: false,
+            needData: false,
+            // output: [],
+            done: false
+        };
+    };
+
+    Parser.prototype.parseChunk = function Parser$parseChunk (chunk) {
+        this.state.needData = false;
+        this.state.data = (this.state.data !== null) ?
+             this.state.data.substr(this.pos) + chunk
+             :
+            chunk
+            ;
+        while (this.state.pos < this.state.data.length && !this.state.needData) {
+            parse(this.state);
+        }
+    };
+
+    Parser.prototype.parseComplete = function Parser$parseComplete (data) {
+        this.reset();
+        this.parseChunk(data);
+        this.done();
+    }
+
+    Parser.prototype.done = function Parser$done () {
+        this.state.done = true;
+        parse(this.state);
+
+    };
+
+    Parser.prototype.validateHandler = function Parser$validateHandler (handler) {
+        if ((typeof handler) != "object") {
+            throw new Error("Handler is not an object");
+        }
+        if ((typeof handler.reset) != "function") {
+            throw new Error("Handler method 'reset' is invalid");
+        }
+        if ((typeof handler.done) != "function") {
+            throw new Error("Handler method 'done' is invalid");
+        }
+        if ((typeof handler.write) != "function") {
+            throw new Error("Handler method 'write' is invalid");
+        }
+        if ((typeof handler.error) != "function") {
+            throw new Error("Handler method 'error' is invalid");
+        }
+    }
+
+// Parser.prototype.done_old = function Parser$done_old () {
+//     if (this.state.pendingText) {
+//         this.state.output.push({ type: this.state.mode, data: this.state.pendingText.join('') });
+//         this.state.pendingText = null;
+//     }
+//     console.log(this.state);
+
+//     var buffer = [];
+//     var lastType;
+//     for (var i = 0, len = this.state.output.length; i < len; i++) {
+//         var node = this.state.output[i];
+//         if ((lastType === Mode.Attr && node.type !== Mode.Attr) || (lastType === Mode.Tag && node.type !== Mode.Attr)) {
+//             buffer.push('>');
+//         }
+//         switch (node.type) {
+
+//             case Mode.Text:
+//                 buffer.push(node.data);
+//                 break;
+
+//             case Mode.Comment:
+//                 buffer.push('<!--', node.data, '-->');
+//                 break;
+
+//             case Mode.CData:
+//                 buffer.push('<![CDATA[', node.data, ']]>');
+//                 break;
+
+//             case Mode.Tag:
+//                 buffer.push('<', node.name);
+//                 break;
+
+//             case Mode.Attr:
+//                 var quoteChar = (node.value.indexOf('\'') < 0) ? '\'' : '"';
+//                 buffer.push(' ', node.name, '=', quoteChar, node.value, quoteChar);
+//                 break;
+
+//         }
+//         lastType = node.type;
+//     }
+//     if (lastType === Mode.Tag || lastType === Mode.Attr) {
+//         buffer.push('>');
+//     }
+//     console.log(buffer.join(''));
+// };
+
+function HtmlHandler (options, callback) {
+    this.reset();
+    this._options = options ? options : { };
+    if (this._options.ignoreWhitespace == undefined) {
+        this._options.ignoreWhitespace = false; //Keep whitespace-only text nodes
+    }
+    if (this._options.trackPosition == undefined) {
+        this._options.trackPosition = false; //Include position of element (row, col) on nodes
+    }
+    if (this._options.verbose == undefined) {
+        this._options.verbose = true; //Keep data property for tags and raw property for all
+    }
+    if (this._options.enforceEmptyTags == undefined) {
+        this._options.enforceEmptyTags = true; //Don't allow children for HTML tags defined as empty in spec
+    }
+    if (this._options.caseSensitiveTags == undefined) {
+        this._options.caseSensitiveTags = false; //Lowercase all tag names
+    }
+    if (this._options.caseSensitiveAttr == undefined) {
+        this._options.caseSensitiveAttr = false; //Lowercase all attribute names
+    }
+    if ((typeof callback) == "function") {
+        this._callback = callback;
+    }
+}
+
+    //**"Static"**//
+    //HTML Tags that shouldn't contain child nodes
+    HtmlHandler._emptyTags = {
+          area: 1
+        , base: 1
+        , basefont: 1
+        , br: 1
+        , col: 1
+        , frame: 1
+        , hr: 1
+        , img: 1
+        , input: 1
+        , isindex: 1
+        , link: 1
+        , meta: 1
+        , param: 1
+        , embed: 1
+    }
+    //Regex to detect whitespace only text nodes
+    HtmlHandler.reWhitespace = /^\s*$/;
+
+    //**Public**//
+    //Properties//
+    HtmlHandler.prototype.dom = null; //The hierarchical object containing the parsed HTML
+    //Methods//
+    //Resets the handler back to starting state
+    HtmlHandler.prototype.reset = function HtmlHandler$reset() {
+        this.dom = [];
+        this._done = false;
+        this._tagStack = [];
+        this._tagStack.last = function HtmlHandler$_tagStack$last () {
+            return(this.length ? this[this.length - 1] : null);
+        }
+    }
+    //Signals the handler that parsing is done
+    HtmlHandler.prototype.done = function HtmlHandler$done () {
+        this._done = true;
+        this.handleCallback(null);
+    }
+
+    HtmlHandler.prototype.error = function HtmlHandler$error (error) {
+        this.handleCallback(error);
+    }
+
+    HtmlHandler.prototype.handleCallback = function HtmlHandler$handleCallback (error) {
+            if ((typeof this._callback) != "function")
+                if (error)
+                    throw error;
+                else
+                    return;
+            this._callback(error, this.dom);
+    }
+    
+    HtmlHandler.prototype.isEmptyTag = function HtmlHandler$isEmptyTag (element) {
+        var name = element.name.toLowerCase();
+        if (name.charAt(0) == '/') {
+            name = name.substring(1);
+        }
+        return this._options.enforceEmptyTags && !!HtmlHandler._emptyTags[name];
+    };
+
+    HtmlHandler.prototype._copyElement = function HtmlHandler$_copyElement (element) {
+        var newElement = { type: element.type };
+
+        if (this._options.verbose && element['raw'] !== undefined) {
+            newElement.raw = element.raw;
+        }
+        if (element['name'] !== undefined) {
+            switch (element.type) {
+
+                case Mode.Tag:
+                    newElement.name = this._options.caseSensitiveTags ?
+                        element.name
+                        :
+                        element.name.toLowerCase()
+                        ;
+                    break;
+
+                case Mode.Attr:
+                    newElement.name = this._options.caseSensitiveAttr ?
+                        element.name
+                        :
+                        element.name.toLowerCase()
+                        ;
+                    break;
+
+                default:
+                    newElement.name = this._options.caseSensitiveTags ?
+                        element.name
+                        :
+                        element.name.toLowerCase()
+                        ;
+                    break;
+
+            }
+        }
+        if (element['data'] !== undefined) {
+            newElement.data = element.name;
+        }
+
+        return newElement;
+    }
+
+    HtmlHandler.prototype.write = function HtmlHandler$write (element) {
+        if (this._done) {
+            this.handleCallback(new Error("Writing to the handler after done() called is not allowed without a reset()"));
+        }
+        if (element.type === Mode.Text && this._options.ignoreWhitespace) {
+            if (HtmlHandler.reWhitespace.test(element.data)) {
+                return;
+            }
+        }
+        var node;
+        if (!this._options.verbose) {
+//          element.raw = null; //FIXME: Not clean
+            //FIXME: Serious performance problem using delete
+            delete element.raw;
+            if (element.type == "tag" || element.type == "script" || element.type == "style") {
+                delete element.data;
+            }
+        }
+        if (!this._tagStack.last()) { //There are no parent elements
+            //If the element can be a container, add it to the tag stack and the top level list
+            if (element.type != Mode.Text && element.type != Mode.Comment && element.type != Mode.CData) {
+                if (element.name.charAt(0) != "/") { //Ignore closing tags that obviously don't have an opening tag
+                    node = this._copyElement(element);
+                    this.dom.push(node);
+                    if (!this.isEmptyTag(node)) { //Don't add tags to the tag stack that can't have children
+                        this._tagStack.push(node);
+                    }
+                }
+            }
+            else //Otherwise just add to the top level list
+                this.dom.push(this._copyElement(element));
+        }
+        else { //There are parent elements
+            //If the element can be a container, add it as a child of the element
+            //on top of the tag stack and then add it to the tag stack
+            if (element.type != Mode.Text && element.type != Mode.Comment && element.type != Mode.CData) {
+                if (element.name.charAt(0) == "/") {
+                    //This is a closing tag, scan the tagStack to find the matching opening tag
+                    //and pop the stack up to the opening tag's parent
+                    var baseName = this._options.caseSensitiveTags ?
+                        element.name.substring(1)
+                        :
+                        element.name.substring(1).toLowerCase()
+                        ;
+                    if (!this.isEmptyTag(element)) {
+                        var pos = this._tagStack.length - 1;
+                        while (pos > -1 && this._tagStack[pos--].name != baseName) { }
+                        if (pos > -1 || this._tagStack[0].name == baseName) {
+                            while (pos < this._tagStack.length - 1) {
+                                this._tagStack.pop();
+                            }
+                        }
+                    }
+                }
+                else { //This is not a closing tag
+                    if (!this._tagStack.last().children) {
+                        this._tagStack.last().children = [];
+                    }
+                    node = this._copyElement(element);
+                    this._tagStack.last().children.push(node);
+                    if (!this.isEmptyTag(node)) { //Don't add tags to the tag stack that can't have children
+                        this._tagStack.push(node);
+                    }
+                }
+            }
+            else { //This is not a container element
+                if (!this._tagStack.last().children)
+                    this._tagStack.last().children = [];
+                this._tagStack.last().children.push(this._copyElement(element));
+            }
+        }
+    }
+
+
+    //**Private**//
+    //Properties//
+    HtmlHandler.prototype._options = null; //Handler options for how to behave
+    HtmlHandler.prototype._callback = null; //Callback to respond to when parsing done
+    HtmlHandler.prototype._done = false; //Flag indicating whether handler has been notified of parsing completed
+    HtmlHandler.prototype._tagStack = null; //List of parents to the currently element being processed
+    //Methods//
+
+exports.Parser = Parser;
+
+exports.HtmlHandler = HtmlHandler;
+
+// exports.RssHandler = RssHandler;
+
+exports.ElementType = Mode;
+
+// exports.DomUtils = DomUtils;
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/new/parser.zip b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/new/parser.zip
new file mode 100644
index 0000000..c562a64
Binary files /dev/null and b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/new/parser.zip differ
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/new/test01.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/new/test01.js
new file mode 100644
index 0000000..3582584
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/new/test01.js
@@ -0,0 +1,258 @@
+var data = "\
+starting text\n\
+aaa<!--xxx-->bbb\n\
+<![CDATA[This is the CData content]]>\n\
+< htmL >\n\
+    <body>\n\
+        <div style=\"width:100%\"></div>\n\
+        <div name='\"foo\"'>xxx</div>\n\
+        <div bar=baz>yyyyyyyyyyyy</div>\n\
+        <div wrong='<foo>'> zzzz zzz </div>\n\
+        <div a='b' c=d e=\"f\">aaaa</div>\n\
+    </BODY>\n\
+</html>\n\
+ending text\
+<unclosed tag='foo' xxx='\
+";
+
+var Mode = {
+    Text: 'text',
+    Tag: 'tag',
+    Attr: 'attr',
+    CData: 'cdata',
+    Comment: 'comment',
+};
+
+var state = {
+    mode: Mode.Text,
+    pos: 0,
+    data: data,
+    pendingText: null,
+    lastTag: null,
+    needData: false,
+    output: [],
+};
+
+function parse (state) {
+    switch (state.mode) {
+        case Mode.Text:
+            return parseText(state);
+        case Mode.Tag:
+            return parseTag(state);
+        case Mode.Attr:
+            return parseAttr(state);
+        case Mode.CData:
+            return parseCData(state);
+        case Mode.Comment:
+            return parseComment(state);
+    }
+}
+
+function parseText (state) {
+    // console.log('parseText', state);
+    // console.log('parseText');
+    var foundPos = state.data.indexOf('<', state.pos);
+    var text = (foundPos === -1) ? state.data.substring(state.pos, state.data.length) : state.data.substring(state.pos, foundPos);
+    if (foundPos === -1) {
+        if (!state.pendingText) {
+            state.pendingText = [];
+        }
+        state.pendingText.push(state.data.substring(state.pos, state.data.length));
+        state.pos = state.data.length;
+    } else {
+        var text;
+        if (state.pendingText) {
+            state.pendingText.push(state.data.substring(state.pos, foundPos));
+            text = state.pendingText.join('');
+            state.pendingText = null;
+        } else {
+            text = state.data.substring(state.pos, foundPos)
+        }
+        state.output.push({ type: Mode.Text, data: text });
+        state.pos = foundPos + 1;
+        state.mode = Mode.Tag;
+    }
+}
+
+var re_parseTag = /(\s*)([^\s>]+)(\s*)(>?)/g;
+function parseTag (state) {
+    // console.log('parseTag', state);
+    // console.log('parseTag');
+    re_parseTag.lastIndex = state.pos;
+    var match = re_parseTag.exec(state.data);
+    if (match) {
+        if (match[2].substr(0, 3) === '!--') {
+            state.mode = Mode.Comment;
+            state.pos += 3;
+            return;
+        }
+        if (match[2].substr(0, 8) === '![CDATA[') {
+            state.mode = Mode.CData;
+            state.pos += 8;
+            return;
+        }
+        var raw;
+        if (match[4] === '>') {
+            state.mode = Mode.Text;
+            raw = match[0].substr(0, match[0].length - 1);
+        } else {
+            state.mode = Mode.Attr;
+            raw = match[0];
+        }
+        state.pos += match[0].length;
+        var tag = { type: Mode.Tag, name: match[2].toLowerCase(), name_raw: match[2], raw: raw };
+        if (state.mode === Mode.Attr) {
+            state.lastTag = tag;
+        }
+        state.output.push(tag);
+    } else {
+        //TODO: end of tag?
+        //TODO: push to pending?
+        state.needData = true;
+    }
+}
+
+var re_parseAttr_findName = /\s*([^=<>\s'"]+)\s*/g;
+function parseAttr_findName (state) {
+    re_parseAttr_findName.lastIndex = state.pos;
+    var match = re_parseAttr_findName.exec(state.data);
+    if (!match) {
+        return null;
+    }
+    if (state.pos + match[0].length !== re_parseAttr_findName.lastIndex) {
+        return null;
+    }
+    state.pos += match[0].length;
+    state.lastTag.raw += match[0];
+    return match[1];
+}
+var re_parseAttr_findValue = /\s*=\s*(?:'([^']*)'|"([^"]*)"|([^'"\s>]*))/g;
+function parseAttr_findValue (state) {
+    re_parseAttr_findValue.lastIndex = state.pos;
+    var match = re_parseAttr_findValue.exec(state.data);
+    if (!match) {
+        return null;
+    }
+    if (state.pos + match[0].length !== re_parseAttr_findValue.lastIndex) {
+        return null;
+    }
+    state.pos += match[0].length;
+    state.lastTag.raw += match[0];
+    return match[1] || match[2] || match[3];
+};
+function parseAttr (state) {
+    // console.log('parseAttr', state);
+    // console.log('parseAttr');
+    var name = parseAttr_findName(state);
+    if (!name) {
+        var foundPos = state.data.indexOf('>', state.pos);
+        if (foundPos < 0) {
+            state.needData = true;
+        } else {
+            state.lastTag = null;
+            state.pos = foundPos + 1;
+            state.mode = Mode.Text;
+        }
+        return;
+    }
+    state.output.push({ type: Mode.Attr, name: name, name_raw: name.toLowerCase(), value: parseAttr_findValue(state) });
+}
+
+function parseCData (state) {
+    // console.log('parseCData', state);
+    // console.log('parseCData');
+    var foundPos = state.data.indexOf(']]>', state.pos);
+    if (foundPos < 0) {
+        if (!state.pendingText) {
+            state.pendingText = [];
+        }
+        state.pendingText.push(state.data.substr(state.pos, state.data.length));
+        state.pos = state.data.length;
+        state.needData = true;
+    } else {
+        var text;
+        if (state.pendingText) {
+            state.pendingText.push(state.data.substring(state.pos, foundPos));
+            text = state.pendingText.join('');
+            state.pendingText = null;
+        } else {
+            text = state.data.substring(state.pos, foundPos);
+        }
+        state.output.push({ type: Mode.CData, data: text });
+        state.mode = Mode.Text;
+        state.pos = foundPos + 3;
+    }
+}
+
+function parseComment (state) {
+    // console.log('parseComment', state);
+    // console.log('parseComment');
+    var foundPos = state.data.indexOf('-->', state.pos);
+    if (foundPos < 0) {
+        if (!state.pendingText) {
+            state.pendingText = [];
+        }
+        state.pendingText.push(state.data.substr(state.pos, state.data.length));
+        state.pos = state.data.length;
+        state.needData = true;
+    } else {
+        var text;
+        if (state.pendingText) {
+            state.pendingText.push(state.data.substring(state.pos, foundPos));
+            text = state.pendingText.join('');
+            state.pendingText = null;
+        } else {
+            text = state.data.substring(state.pos, foundPos);
+        }
+        state.output.push({ type: Mode.Comment, data: text });
+        state.mode = Mode.Text;
+        state.pos = foundPos + 3;
+    }
+}
+
+while (state.pos < state.data.length && !state.needData) {
+    parse(state);
+}
+if (state.pendingText) {
+    state.output.push({ type: state.mode, data: state.pendingText });
+    state.pendingText = null;
+}
+console.log(state);
+
+var buffer = [];
+var lastType;
+for (var i = 0, len = state.output.length; i < len; i++) {
+    var node = state.output[i];
+    if ((lastType === Mode.Attr && node.type !== Mode.Attr) || (lastType === Mode.Tag && node.type !== Mode.Attr)) {
+        buffer.push('>');
+    }
+    switch (node.type) {
+
+        case Mode.Text:
+            buffer.push(node.data);
+            break;
+
+        case Mode.Comment:
+            buffer.push('<!--', node.data, '-->');
+            break;
+
+        case Mode.CData:
+            buffer.push('<![CDATA[', node.data, ']]>');
+            break;
+
+        case Mode.Tag:
+            buffer.push('<', node.name);
+            break;
+
+        case Mode.Attr:
+            var quoteChar = (node.value.indexOf('\'') < 0) ? '\'' : '"';
+            buffer.push(' ', node.name, '=', quoteChar, node.value, quoteChar);
+            break;
+
+    }
+    lastType = node.type;
+}
+if (lastType === Mode.Tag || lastType === Mode.Attr) {
+    buffer.push('>');
+}
+console.log(buffer.join(''));
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/new/test02.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/new/test02.js
new file mode 100644
index 0000000..6221c95
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/new/test02.js
@@ -0,0 +1,856 @@
+var htmlparser = require('./htmlparser');
+
+var tests = {
+
+    'plain text': {
+        data: ['This is the text']
+        , expected: [{ type: 'text', data: 'This is the text' }]
+    }
+
+    , 'split text': {
+        data: ['This is', ' the text']
+        , expected: [{ type: 'text', data: 'This is the text' }]
+    }
+
+    , 'simple tag': {
+        data: ['<div>']
+        , expected: [{ type: 'tag', name: 'div', name_raw: 'div', raw: 'div' }]
+    }
+
+    , 'simple comment': {
+        data: ['<!-- content -->']
+        , expected: [{ type: 'comment', data: ' content ' }]
+    }
+
+    , 'simple cdata': {
+        data: ['<![CDATA[ content ]]>']
+        , expected: [{ type: 'cdata', data: ' content ' }]
+    }
+
+    , 'split simple tag #1': {
+        data: ['<', 'div>']
+        , expected: [{ type: 'tag', name: 'div', name_raw: 'div', raw: 'div' }]
+    }
+
+    , 'split simple tag #2': {
+        data: ['<d', 'iv>']
+        , expected: [{ type: 'tag', name: 'div', name_raw: 'div', raw: 'div' }]
+    }
+
+    , 'split simple tag #3': {
+        data: ['<div', '>']
+        , expected: [{ type: 'tag', name: 'div', name_raw: 'div', raw: 'div' }]
+    }
+
+    , 'text before tag': {
+        data: ['xxx<div>']
+        , expected: [
+            { type: 'text', data: 'xxx'},
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div' }
+            ]
+    }
+
+    , 'text after tag': {
+        data: ['<div>xxx']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div' },
+            { type: 'text', data: 'xxx'}
+            ]
+    }
+
+    , 'text inside tag': {
+        data: ['<div>xxx</div>']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div' },
+            { type: 'text', data: 'xxx'},
+            { type: 'tag', name: '/div', name_raw: '/div', raw: '/div' }
+            ]
+    }
+
+    , 'attribute with single quotes': {
+        data: ['<div a=\'1\'>']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a=\'1\'' },
+            { type: 'attr', name:'a', name_raw: 'a', value: '1'}
+            ]
+    }
+
+    , 'attribute with double quotes': {
+        data: ['<div a="1">']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a="1"' },
+            { type: 'attr', name:'a', name_raw: 'a', value: '1'}
+            ]
+    }
+
+    , 'attribute with no quotes': {
+        data: ['<div a=1>']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a=1' },
+            { type: 'attr', name:'a', name_raw: 'a', value: '1'}
+            ]
+    }
+
+    , 'attribute with no value': {
+        data: ['<div wierd>']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div wierd' },
+            { type: 'attr', name:'wierd', name_raw: 'wierd', value: null}
+            ]
+    }
+
+    , 'attribute with no value, trailing text': {
+        data: ['<div wierd>xxx']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div wierd' },
+            { type: 'attr', name:'wierd', name_raw: 'wierd', value: null},
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'tag with multiple attributes': {
+        data: ['<div a="1" b="2">']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a="1" b="2"' },
+            { type: 'attr', name:'a', name_raw: 'a', value: '1'},
+            { type: 'attr', name:'b', name_raw: 'b', value: '2'}
+            ]
+    }
+
+    , 'tag with multiple attributes, trailing text': {
+        data: ['<div a="1" b="2">xxx']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a="1" b="2"' },
+            { type: 'attr', name:'a', name_raw: 'a', value: '1'},
+            { type: 'attr', name:'b', name_raw: 'b', value: '2'},
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'tag with mixed attributes #1': {
+        data: ['<div a=1 b=\'2\' c="3">']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a=1 b=\'2\' c="3"' },
+            { type: 'attr', name:'a', name_raw: 'a', value: '1'},
+            { type: 'attr', name:'b', name_raw: 'b', value: '2'},
+            { type: 'attr', name:'c', name_raw: 'c', value: '3'}
+            ]
+    }
+
+    , 'tag with mixed attributes #2': {
+        data: ['<div a=1 b="2" c=\'3\'>']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a=1 b="2" c=\'3\'' },
+            { type: 'attr', name:'a', name_raw: 'a', value: '1'},
+            { type: 'attr', name:'b', name_raw: 'b', value: '2'},
+            { type: 'attr', name:'c', name_raw: 'c', value: '3'}
+            ]
+    }
+
+    , 'tag with mixed attributes #3': {
+        data: ['<div a=\'1\' b=2 c="3">']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a=\'1\' b=2 c="3"' },
+            { type: 'attr', name:'a', name_raw: 'a', value: '1'},
+            { type: 'attr', name:'b', name_raw: 'b', value: '2'},
+            { type: 'attr', name:'c', name_raw: 'c', value: '3'}
+            ]
+    }
+
+    , 'tag with mixed attributes #4': {
+        data: ['<div a=\'1\' b="2" c=3>']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a=\'1\' b="2" c=3' },
+            { type: 'attr', name:'a', name_raw: 'a', value: '1'},
+            { type: 'attr', name:'b', name_raw: 'b', value: '2'},
+            { type: 'attr', name:'c', name_raw: 'c', value: '3'}
+            ]
+    }
+
+    , 'tag with mixed attributes #5': {
+        data: ['<div a="1" b=2 c=\'3\'>']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a="1" b=2 c=\'3\'' },
+            { type: 'attr', name:'a', name_raw: 'a', value: '1'},
+            { type: 'attr', name:'b', name_raw: 'b', value: '2'},
+            { type: 'attr', name:'c', name_raw: 'c', value: '3'}
+            ]
+    }
+
+    , 'tag with mixed attributes #6': {
+        data: ['<div a="1" b=\'2\' c="3">']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a="1" b=\'2\' c="3"' },
+            { type: 'attr', name:'a', name_raw: 'a', value: '1'},
+            { type: 'attr', name:'b', name_raw: 'b', value: '2'},
+            { type: 'attr', name:'c', name_raw: 'c', value: '3'}
+            ]
+    }
+
+    , 'tag with mixed attributes, trailing text': {
+        data: ['<div a=1 b=\'2\' c="3">xxx']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a=1 b=\'2\' c="3"' },
+            { type: 'attr', name:'a', name_raw: 'a', value: '1'},
+            { type: 'attr', name:'b', name_raw: 'b', value: '2'},
+            { type: 'attr', name:'c', name_raw: 'c', value: '3'},
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'self closing tag': {
+        data: ['<div/>']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div/' },
+            { type: 'tag', name: '/div', name_raw: '/div', raw: null }
+            ]
+    }
+
+    , 'self closing tag, trailing text': {
+        data: ['<div/>xxx']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div/' },
+            { type: 'tag', name: '/div', name_raw: '/div', raw: null },
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'self closing tag with spaces #1': {
+        data: ['<div />']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div /' },
+            { type: 'tag', name: '/div', name_raw: '/div', raw: null }
+            ]
+    }
+
+    , 'self closing tag with spaces #2': {
+        data: ['<div/ >']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div/ ' },
+            { type: 'tag', name: '/div', name_raw: '/div', raw: null }
+            ]
+    }
+
+    , 'self closing tag with spaces #3': {
+        data: ['<div / >']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div / ' },
+            { type: 'tag', name: '/div', name_raw: '/div', raw: null }
+            ]
+    }
+
+    , 'self closing tag with spaces, trailing text': {
+        data: ['<div / >xxx']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div / ' },
+            { type: 'tag', name: '/div', name_raw: '/div', raw: null },
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'self closing tag with attribute': {
+        data: ['<div a=b />']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a=b /' },
+            { type: 'attr', name:'a', name_raw: 'a', value: 'b'},
+            { type: 'tag', name: '/div', name_raw: '/div', raw: null }
+            ]
+    }
+
+    , 'self closing tag with attribute, trailing text': {
+        data: ['<div a=b />xxx']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a=b /' },
+            { type: 'attr', name:'a', name_raw: 'a', value: 'b'},
+            { type: 'tag', name: '/div', name_raw: '/div', raw: null },
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'self closing tag split #1': {
+        data: ['<div/', '>']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div/' },
+            { type: 'tag', name: '/div', name_raw: '/div', raw: null }
+            ]
+    }
+
+    , 'self closing tag split #2': {
+        data: ['<div', '/>']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div/' },
+            { type: 'tag', name: '/div', name_raw: '/div', raw: null }
+            ]
+    }
+
+    , 'attribute missing close quote': {
+        data: ['<div a="1><span id="foo">xxx']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a="1><span id="foo' },
+            { type: 'attr', name:'a', name_raw: 'a', value: '1><span id='},
+            { type: 'attr', name:'foo', name_raw: 'foo', value: null},
+            { type: 'text', data: 'xxx'}
+            ]
+    }
+
+    , 'split attribute #1': {
+        data: ['<div x', 'xx="yyy">']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div xxx="yyy"' },
+            { type: 'attr', name:'xxx', name_raw: 'xxx', value: 'yyy'}
+            ]
+    }
+
+    , 'split attribute #2': {
+        data: ['<div xxx', '="yyy">']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div xxx="yyy"' },
+            { type: 'attr', name:'xxx', name_raw: 'xxx', value: 'yyy'}
+            ]
+    }
+
+    , 'split attribute #3': {
+        data: ['<div xxx=', '"yyy">']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div xxx="yyy"' },
+            { type: 'attr', name:'xxx', name_raw: 'xxx', value: 'yyy'}
+            ]
+    }
+
+    , 'split attribute #4': {
+        data: ['<div xxx="', 'yyy">']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div xxx="yyy"' },
+            { type: 'attr', name:'xxx', name_raw: 'xxx', value: 'yyy'}
+            ]
+    }
+
+    , 'split attribute #5': {
+        data: ['<div xxx="yy', 'y">']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div xxx="yyy"' },
+            { type: 'attr', name:'xxx', name_raw: 'xxx', value: 'yyy'}
+            ]
+    }
+
+    , 'split attribute #6': {
+        data: ['<div xxx="yyy', '">']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div xxx="yyy"' },
+            { type: 'attr', name:'xxx', name_raw: 'xxx', value: 'yyy'}
+            ]
+    }
+
+    , 'attribute split from tag #1': {
+        data: ['<div ', 'xxx="yyy">']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div xxx="yyy"' },
+            { type: 'attr', name:'xxx', name_raw: 'xxx', value: 'yyy'}
+            ]
+    }
+
+    , 'attribute split from tag #2': {
+        data: ['<div', ' xxx="yyy">']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div xxx="yyy"' },
+            { type: 'attr', name:'xxx', name_raw: 'xxx', value: 'yyy'}
+            ]
+    }
+
+    , 'text before complex tag': {
+        data: ['xxx<div yyy="123">']
+        , expected: [
+            { type: 'text', data: 'xxx' },
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div yyy="123"'},
+            { type: 'attr', name: 'yyy', name_raw: 'yyy', value: '123' }
+            ]
+    }
+
+    , 'text after complex tag': {
+        data: ['<div yyy="123">xxx']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div yyy="123"'},
+            { type: 'attr', name: 'yyy', name_raw: 'yyy', value: '123' },
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'text inside complex tag': {
+        data: ['<div yyy="123">xxx</div>']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div yyy="123"'},
+            { type: 'attr', name: 'yyy', name_raw: 'yyy', value: '123' },
+            { type: 'text', data: 'xxx' },
+            { type: 'tag', name: '/div', name_raw: '/div', raw: '/div'}
+            ]
+    }
+
+    , 'nested tags': {
+        data: ['<div><span></span></div>']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div'},
+            { type: 'tag', name: 'span', name_raw: 'span', raw: 'span'},
+            { type: 'tag', name: '/span', name_raw: '/span', raw: '/span'},
+            { type: 'tag', name: '/div', name_raw: '/div', raw: '/div'}
+            ]
+    }
+
+    , 'nested tags with attributes': {
+        data: ['<div aaa="bbb"><span 123=\'456\'>xxx</span></div>']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div aaa="bbb"'},
+            { type: 'attr', name: 'aaa', name_raw: 'aaa', value: 'bbb' },
+            { type: 'tag', name: 'span', name_raw: 'span', raw: 'span 123=\'456\''},
+            { type: 'attr', name: '123', name_raw: '123', value: '456' },
+            { type: 'text', data: 'xxx' },
+            { type: 'tag', name: '/span', name_raw: '/span', raw: '/span'},
+            { type: 'tag', name: '/div', name_raw: '/div', raw: '/div'}
+            ]
+    }
+
+    , 'comment inside tag': {
+        data: ['<div><!-- comment text --></div>']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div'},
+            { type: 'comment', data: ' comment text '},
+            { type: 'tag', name: '/div', name_raw: '/div', raw: '/div'}
+            ]
+    }
+
+    , 'cdata inside tag': {
+        data: ['<div><![CDATA[ CData content ]]></div>']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div'},
+            { type: 'cdata', data: ' CData content '},
+            { type: 'tag', name: '/div', name_raw: '/div', raw: '/div'}
+            ]
+    }
+
+    , 'html inside comment': {
+        data: ['<!-- <div>foo</div> -->']
+        , expected: [{ type: 'comment', data: ' <div>foo</div> '}]
+    }
+
+    , 'html inside cdata': {
+        data: ['<![CDATA[ <div>foo</div> ]]>']
+        , expected: [{ type: 'cdata', data: ' <div>foo</div> '}]
+    }
+
+    , 'quotes in attribute #1': {
+        data: ['<div xxx=\'a"b\'>']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div xxx=\'a"b\''},
+            { type: 'attr', name: 'xxx', name_raw: 'xxx', value: 'a"b' }
+            ]
+    }
+
+    , 'quotes in attribute #2': {
+        data: ['<div xxx="a\'b">']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div xxx="a\'b"'},
+            { type: 'attr', name: 'xxx', name_raw: 'xxx', value: 'a\'b' }
+            ]
+    }
+
+    , 'brackets in attribute': {
+        data: ['<div xxx="</div>">']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div xxx="</div>"'},
+            { type: 'attr', name: 'xxx', name_raw: 'xxx', value: '</div>' }
+            ]
+    }
+
+    , 'split comment #1': {
+        data: ['<','!-- comment text -->xxx']
+        , expected: [
+            { type: 'comment', data: ' comment text '},
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'split comment #2': {
+        data: ['<!','-- comment text -->xxx']
+        , expected: [
+            { type: 'comment', data: ' comment text '},
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'split comment #3': {
+        data: ['<!-','- comment text -->xxx']
+        , expected: [
+            { type: 'comment', data: ' comment text '},
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'split comment #4': {
+        data: ['<!--',' comment text -->xxx']
+        , expected: [
+            { type: 'comment', data: ' comment text '},
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'split comment #5': {
+        data: ['<!-- comment',' text -->xxx']
+        , expected: [
+            { type: 'comment', data: ' comment text '},
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'split comment #6': {
+        data: ['<!-- comment text ','-->xxx']
+        , expected: [
+            { type: 'comment', data: ' comment text '},
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'split comment #7': {
+        data: ['<!-- comment text -','->xxx']
+        , expected: [
+            { type: 'comment', data: ' comment text '},
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'split comment #8': {
+        data: ['<!-- comment text --','>xxx']
+        , expected: [
+            { type: 'comment', data: ' comment text '},
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'split cdata #1': {
+        data: ['<','![CDATA[ CData content ]]>']
+        , expected: [{ type: 'cdata', data: ' CData content '}]
+    }
+
+    , 'split cdata #2': {
+        data: ['<!','[CDATA[ CData content ]]>']
+        , expected: [{ type: 'cdata', data: ' CData content '}]
+    }
+
+    , 'split cdata #3': {
+        data: ['<![','CDATA[ CData content ]]>']
+        , expected: [{ type: 'cdata', data: ' CData content '}]
+    }
+
+    , 'split cdata #4': {
+        data: ['<![C','DATA[ CData content ]]>']
+        , expected: [{ type: 'cdata', data: ' CData content '}]
+    }
+
+    , 'split cdata #5': {
+        data: ['<![CD','ATA[ CData content ]]>']
+        , expected: [{ type: 'cdata', data: ' CData content '}]
+    }
+
+    , 'split cdata #6': {
+        data: ['<![CDA','TA[ CData content ]]>']
+        , expected: [{ type: 'cdata', data: ' CData content '}]
+    }
+
+    , 'split cdata #7': {
+        data: ['<![CDAT','A[ CData content ]]>']
+        , expected: [{ type: 'cdata', data: ' CData content '}]
+    }
+
+    , 'split cdata #8': {
+        data: ['<![CDATA','[ CData content ]]>']
+        , expected: [{ type: 'cdata', data: ' CData content '}]
+    }
+
+    , 'split cdata #9': {
+        data: ['<![CDATA[',' CData content ]]>']
+        , expected: [{ type: 'cdata', data: ' CData content '}]
+    }
+
+    , 'split cdata #10': {
+        data: ['<![CDATA[ CData ','content ]]>']
+        , expected: [{ type: 'cdata', data: ' CData content '}]
+    }
+
+    , 'split cdata #11': {
+        data: ['<![CDATA[ CData content ',']]>']
+        , expected: [{ type: 'cdata', data: ' CData content '}]
+    }
+
+    , 'split cdata #12': {
+        data: ['<![CDATA[ CData content ]',']>']
+        , expected: [{ type: 'cdata', data: ' CData content '}]
+    }
+
+    , 'split cdata #13': {
+        data: ['<![CDATA[ CData content ]]','>']
+        , expected: [{ type: 'cdata', data: ' CData content '}]
+    }
+
+    , 'unfinished simple tag #1': {
+        data: ['<div']
+        , expected: [{ type: 'tag', name: 'div', name_raw: 'div', raw: 'div'}]
+    }
+
+    , 'unfinished simple tag #2': {
+        data: ['<div ']
+        , expected: [{ type: 'tag', name: 'div', name_raw: 'div', raw: 'div '}]
+    }
+
+    , 'unfinished complex tag #1': {
+        data: ['<div foo="bar"']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div foo="bar"'},
+            { type: 'attr', name: 'foo', name_raw: 'foo', value: 'bar' }
+            ]
+    }
+
+    , 'unfinished complex tag #2': {
+        data: ['<div foo="bar" ']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div foo="bar" '},
+            { type: 'attr', name: 'foo', name_raw: 'foo', value: 'bar' }
+            ]
+    }
+
+    , 'unfinished comment #1': {
+        data: ['<!-- comment text']
+        , expected: [{ type: 'comment', data: ' comment text'}]
+    }
+
+    , 'unfinished comment #2': {
+        data: ['<!-- comment text ']
+        , expected: [{ type: 'comment', data: ' comment text '}]
+    }
+
+    , 'unfinished comment #3': {
+        data: ['<!-- comment text -']
+        , expected: [{ type: 'comment', data: ' comment text -'}]
+    }
+
+    , 'unfinished comment #4': {
+        data: ['<!-- comment text --']
+        , expected: [{ type: 'comment', data: ' comment text --'}]
+    }
+
+    , 'unfinished cdata #1': {
+        data: ['<![CDATA[ content']
+        , expected: [{ type: 'cdata', data: ' content'}]
+    }
+
+    , 'unfinished cdata #2': {
+        data: ['<![CDATA[ content ']
+        , expected: [{ type: 'cdata', data: ' content '}]
+    }
+
+    , 'unfinished cdata #3': {
+        data: ['<![CDATA[ content ]']
+        , expected: [{ type: 'cdata', data: ' content ]'}]
+    }
+
+    , 'unfinished cdata #4': {
+        data: ['<![CDATA[ content ]]']
+        , expected: [{ type: 'cdata', data: ' content ]]'}]
+    }
+
+    , 'unfinished attribute #1': {
+        data: ['<div foo="bar']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div foo="bar' },
+            { type: 'attr', name: 'foo', name_raw: 'foo', value: 'bar' }
+            ]
+    }
+
+    , 'unfinished attribute #2': {
+        data: ['<div foo="']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div foo="' },
+            { type: 'attr', name: 'foo', name_raw: 'foo', value: null }
+            ]
+    }
+
+    , 'spaces in tag #1': {
+        data: ['< div>']
+        , expected: [{ type: 'tag', name: 'div', name_raw: 'div', raw: ' div' }]
+    }
+
+    , 'spaces in tag #2': {
+        data: ['<div >']
+        , expected: [{ type: 'tag', name: 'div', name_raw: 'div', raw: 'div ' }]
+    }
+
+    , 'spaces in tag #3': {
+        data: ['< div >']
+        , expected: [{ type: 'tag', name: 'div', name_raw: 'div', raw: ' div ' }]
+    }
+
+    , 'spaces in tag, trailing text': {
+        data: ['< div >xxx']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: ' div ' },
+            { type: 'text', data: 'xxx' }
+            ]
+    }
+
+    , 'spaces in attributes #1': {
+        data: ['<div foo ="bar">']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div foo ="bar"' },
+            { type: 'attr', name: 'foo', name_raw: 'foo', value: 'bar' }
+            ]
+    }
+
+    , 'spaces in attributes #2': {
+        data: ['<div foo= "bar">']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div foo= "bar"' },
+            { type: 'attr', name: 'foo', name_raw: 'foo', value: 'bar' }
+            ]
+    }
+
+    , 'spaces in attributes #3': {
+        data: ['<div foo = "bar">']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div foo = "bar"' },
+            { type: 'attr', name: 'foo', name_raw: 'foo', value: 'bar' }
+            ]
+    }
+
+    , 'spaces in attributes #4': {
+        data: ['<div foo =bar>']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div foo =bar' },
+            { type: 'attr', name: 'foo', name_raw: 'foo', value: 'bar' }
+            ]
+    }
+
+    , 'spaces in attributes #5': {
+        data: ['<div foo= bar>']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div foo= bar' },
+            { type: 'attr', name: 'foo', name_raw: 'foo', value: 'bar' }
+            ]
+    }
+
+    , 'spaces in attributes #6': {
+        data: ['<div foo = bar>']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div foo = bar' },
+            { type: 'attr', name: 'foo', name_raw: 'foo', value: 'bar' }
+            ]
+    }
+
+    , 'mixed case tag': {
+        data: ['<diV>']
+        , expected: [{ type: 'tag', name: 'div', name_raw: 'diV', raw: 'diV' }]
+    }
+
+    , 'upper case case tag': {
+        data: ['<DIV>']
+        , expected: [{ type: 'tag', name: 'div', name_raw: 'DIV', raw: 'DIV' }]
+    }
+
+    , 'mixed case attribute': {
+        data: ['<div xXx="yyy">']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div xXx="yyy"' },
+            { type: 'attr', name: 'xxx', name_raw: 'xXx', value: 'yyy' }
+            ]
+    }
+
+    , 'upper case case attribute': {
+        data: ['<div XXX="yyy">']
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: 'div XXX="yyy"' },
+            { type: 'attr', name: 'xxx', name_raw: 'XXX', value: 'yyy' }
+            ]
+    }
+
+    , 'multiline simple tag': {
+        data: ["<\ndiv\n>"]
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: "\ndiv\n" }
+            ]
+    }
+
+    , 'multiline complex tag': {
+        data: ["<\ndiv\nid='foo'\n>"]
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: "\ndiv\nid='foo'\n" },
+            { type: 'attr', name: 'id', name_raw: 'id', value: 'foo' }
+            ]
+    }
+
+    , 'multiline comment': {
+        data: ["<!--\ncomment text\n-->"]
+        , expected: [
+            { type: 'comment', data: "\ncomment text\n" }
+            ]
+    }
+
+    , 'cdata comment': {
+        data: ["<![CDATA[\nCData content\n]]>"]
+        , expected: [
+            { type: 'cdata', data: "\nCData content\n" }
+            ]
+    }
+
+    , 'multiline attribute #1': {
+        data: ["<div id='\nxxx\nyyy\n'>"]
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: "div id='\nxxx\nyyy\n'" },
+            { type: 'attr', name: 'id', name_raw: 'id', value: "\nxxx\nyyy\n" }
+            ]
+    }
+
+    , 'multiline attribute #2': {
+        data: ["<div id=\"\nxxx\nyyy\n\">"]
+        , expected: [
+            { type: 'tag', name: 'div', name_raw: 'div', raw: "div id=\"\nxxx\nyyy\n\"" },
+            { type: 'attr', name: 'id', name_raw: 'id', value: "\nxxx\nyyy\n" }
+            ]
+    }
+
+    // script tags
+    // style tags
+
+};
+
+function runTests (permutator) {
+    var parser = new htmlparser();
+
+    var passed = 0;
+    var failed = 0;
+
+    console.time('Tests');
+    for (var testName in tests) {
+        var test = permutator ? permutator(tests[testName]) : tests[testName];
+        process.stdout.write('[TEST] ' + testName + ' : ');
+        parser.reset();
+        for (var i = 0, len = test.data.length; i < len; i++) {
+            parser.parse(test.data[i]);
+        }
+        parser.done();
+        var expected = JSON.stringify(test.expected);
+        var result = JSON.stringify(parser.state.output);
+        if (expected !== result) {
+            failed++;
+            process.stdout.write("FAIL\n");
+            console.log('    [EXPECTED]', expected);
+            console.log('    [ RESULT ]', result);
+        } else {
+            passed++;
+            process.stdout.write("Ok\n");
+        }
+    }
+    console.timeEnd('Tests');
+    console.log('Passed tests: ' + passed + '/' + (passed + failed) + ' (' + Math.round(passed / (passed + failed) * 100) + '%)');
+}
+
+runTests();
+runTests(function (test) {
+    test.data = test.data.join('').split('');
+    return test;
+});
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/newparser.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/newparser.js
new file mode 100644
index 0000000..2487f23
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/newparser.js
@@ -0,0 +1,54 @@
+//node --prof --prof_auto profile.js
+//deps/v8/tools/mac-tick-processor v8.log
+var sys = require("sys");
+var fs = require("fs");
+
+var testHtml = "./testdata/api.html"; //Test HTML file to load
+var testIterations = 100; //Number of test loops to run
+
+var html = fs.readFileSync(testHtml).toString();
+
+function getMillisecs () {
+	return((new Date()).getTime());
+}
+
+function timeExecutions (loops, func) {
+	var start = getMillisecs();
+
+	while (loops--)
+		func();
+
+	return(getMillisecs() - start);
+}
+
+sys.puts("HTML Length: " + html.length);
+
+sys.puts("Test 1: " + timeExecutions(testIterations, function () {
+//	function parseText (data) {
+//		//
+//	}
+//	function parseTag (data) {
+//		//
+//	}
+//	function parseAttrib (data) {
+//		//
+//	}
+//	function parseComment (data) {
+//		//
+//	}
+	var data = html.split("");
+	data.meta = {
+		  length: data.length
+		, pos: 0
+	}
+	while (data.meta.length > data.meta.pos && data[data.meta.pos++] !== "");
+//	sys.puts("Found: " + [data.meta.pos, data[data.meta.pos]]);
+}) + "ms");
+
+sys.puts("Test 2: " + timeExecutions(testIterations, function () {
+	var data = html;
+	var dataLen = data.length;
+	var pos = 0;
+	while (dataLen > pos && data.charAt(pos++) !== "");
+//	sys.puts("Found: " + [pos, data.charAt(pos)]);
+}) + "ms");
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/node-htmlparser.old.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/node-htmlparser.old.js
new file mode 100644
index 0000000..cfc1664
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/node-htmlparser.old.js
@@ -0,0 +1,754 @@
+/***********************************************
+Copyright 2010, Chris Winberry <chris at winberry.net>. All rights reserved.
+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.
+***********************************************/
+/* v1.5.0 */
+
+(function () {
+
+function runningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!runningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	else if (this.Tautologistics.NodeHtmlParser)
+		return; //NodeHtmlParser already defined!
+	this.Tautologistics.NodeHtmlParser = {};
+	exports = this.Tautologistics.NodeHtmlParser;
+}
+
+//Types of elements found in the DOM
+var ElementType = {
+	  Text: "text" //Plain text
+	, Directive: "directive" //Special tag <!...>
+	, Comment: "comment" //Special tag <!--...-->
+	, Script: "script" //Special tag <script>...</script>
+	, Style: "style" //Special tag <style>...</style>
+	, Tag: "tag" //Any tag that isn't special
+}
+
+function Parser (handler) {
+	this.validateHandler(handler);
+	this._handler = handler;
+	this.reset();
+}
+
+	//**"Static"**//
+	//Regular expressions used for cleaning up and parsing (stateless)
+	Parser._reTrim = /(^\s+|\s+$)/g; //Trim leading/trailing whitespace
+	Parser._reTrimComment = /(^\!--|--$)/g; //Remove comment tag markup from comment contents
+	Parser._reWhitespace = /\s/g; //Used to find any whitespace to split on
+	Parser._reTagName = /^\s*(\/?)\s*([^\s\/]+)/; //Used to find the tag name for an element
+
+	//Regular expressions used for parsing (stateful)
+	Parser._reAttrib = //Find attributes in a tag
+		/([^=<>\"\'\s]+)\s*=\s*"([^"]*)"|([^=<>\"\'\s]+)\s*=\s*'([^']*)'|([^=<>\"\'\s]+)\s*=\s*([^'"\s]+)|([^=<>\"\'\s\/]+)/g;
+	Parser._reTags = /[\<\>]/g; //Find tag markers
+
+	//**Public**//
+	//Methods//
+	//Parses a complete HTML and pushes it to the handler
+	Parser.prototype.parseComplete = function Parser$parseComplete (data) {
+		this.reset();
+		this.parseChunk(data);
+		this.done();
+	}
+
+	//Parses a piece of an HTML document
+	Parser.prototype.parseChunk = function Parser$parseChunk (data) {
+		if (this._done)
+			this.handleError(new Error("Attempted to parse chunk after parsing already done"));
+		this._buffer += data; //FIXME: this can be a bottleneck
+		this.parseTags();
+	}
+
+	//Tells the parser that the HTML being parsed is complete
+	Parser.prototype.done = function Parser$done () {
+		if (this._done)
+			return;
+		this._done = true;
+	
+		//Push any unparsed text into a final element in the element list
+		if (this._buffer.length) {
+			var rawData = this._buffer;
+			this._buffer = "";
+			var element = {
+				  raw: rawData
+				, data: (this._parseState == ElementType.Text) ? rawData : rawData.replace(Parser._reTrim, "")
+				, type: this._parseState
+				};
+			if (this._parseState == ElementType.Tag || this._parseState == ElementType.Script || this._parseState == ElementType.Style)
+				element.name = this.parseTagName(element.data);
+			this.parseAttribs(element);
+			this._elements.push(element);
+		}
+	
+		this.writeHandler();
+		this._handler.done();
+	}
+
+	//Resets the parser to a blank state, ready to parse a new HTML document
+	Parser.prototype.reset = function Parser$reset () {
+		this._buffer = "";
+		this._done = false;
+		this._elements = [];
+		this._elementsCurrent = 0;
+		this._current = 0;
+		this._next = 0;
+		this._parseState = ElementType.Text;
+		this._prevTagSep = '';
+		this._tagStack = [];
+		this._handler.reset();
+	}
+	
+	//**Private**//
+	//Properties//
+	Parser.prototype._handler = null; //Handler for parsed elements
+	Parser.prototype._buffer = null; //Buffer of unparsed data
+	Parser.prototype._done = false; //Flag indicating whether parsing is done
+	Parser.prototype._elements =  null; //Array of parsed elements
+	Parser.prototype._elementsCurrent = 0; //Pointer to last element in _elements that has been processed
+	Parser.prototype._current = 0; //Position in data that has already been parsed
+	Parser.prototype._next = 0; //Position in data of the next tag marker (<>)
+	Parser.prototype._parseState = ElementType.Text; //Current type of element being parsed
+	Parser.prototype._prevTagSep = ''; //Previous tag marker found
+	//Stack of element types previously encountered; keeps track of when
+	//parsing occurs inside a script/comment/style tag
+	Parser.prototype._tagStack = null;
+
+	//Methods//
+	//Takes an array of elements and parses any found attributes
+	Parser.prototype.parseTagAttribs = function Parser$parseTagAttribs (elements) {
+		var idxEnd = elements.length;
+		var idx = 0;
+	
+		while (idx < idxEnd) {
+			var element = elements[idx++];
+			if (element.type == ElementType.Tag || element.type == ElementType.Script || element.type == ElementType.style)
+				this.parseAttribs(element);
+		}
+	
+		return(elements);
+	}
+
+	//Takes an element and adds an "attribs" property for any element attributes found 
+	Parser.prototype.parseAttribs = function Parser$parseAttribs (element) {
+		//Only parse attributes for tags
+		if (element.type != ElementType.Script && element.type != ElementType.Style && element.type != ElementType.Tag)
+			return;
+	
+		var tagName = element.data.split(Parser._reWhitespace, 1)[0];
+		var attribRaw = element.data.substring(tagName.length);
+		if (attribRaw.length < 1)
+			return;
+	
+		var match;
+		Parser._reAttrib.lastIndex = 0;
+		while (match = Parser._reAttrib.exec(attribRaw)) {
+			if (element.attribs == undefined)
+				element.attribs = {};
+	
+			if (typeof match[1] == "string" && match[1].length) {
+				element.attribs[match[1]] = match[2];
+			} else if (typeof match[3] == "string" && match[3].length) {
+				element.attribs[match[3].toString()] = match[4].toString();
+			} else if (typeof match[5] == "string" && match[5].length) {
+				element.attribs[match[5]] = match[6];
+			} else if (typeof match[7] == "string" && match[7].length) {
+				element.attribs[match[7]] = match[7];
+			}
+		}
+	}
+
+	//Extracts the base tag name from the data value of an element
+	Parser.prototype.parseTagName = function Parser$parseTagName (data) {
+		if (data == null || data == "")
+			return("");
+		var match = Parser._reTagName.exec(data);
+		if (!match)
+			return("");
+		return((match[1] ? "/" : "") + match[2]);
+	}
+
+	//Parses through HTML text and returns an array of found elements
+	//I admit, this function is rather large but splitting up had an noticeable impact on speed
+	Parser.prototype.parseTags = function Parser$parseTags () {
+		var bufferEnd = this._buffer.length - 1;
+		while (Parser._reTags.test(this._buffer)) {
+			this._next = Parser._reTags.lastIndex - 1;
+			var tagSep = this._buffer.charAt(this._next); //The currently found tag marker
+			var rawData = this._buffer.substring(this._current, this._next); //The next chunk of data to parse
+	
+			//A new element to eventually be appended to the element list
+			var element = {
+				  raw: rawData
+				, data: (this._parseState == ElementType.Text) ? rawData : rawData.replace(Parser._reTrim, "")
+				, type: this._parseState
+			};
+	
+			var elementName = this.parseTagName(element.data);
+	
+			//This section inspects the current tag stack and modifies the current
+			//element if we're actually parsing a special area (script/comment/style tag)
+			if (this._tagStack.length) { //We're parsing inside a script/comment/style tag
+				if (this._tagStack[this._tagStack.length - 1] == ElementType.Script) { //We're currently in a script tag
+					if (elementName == "/script") //Actually, we're no longer in a script tag, so pop it off the stack
+						this._tagStack.pop();
+					else { //Not a closing script tag
+						if (element.raw.indexOf("!--") != 0) { //Make sure we're not in a comment
+							//All data from here to script close is now a text element
+							element.type = ElementType.Text;
+							//If the previous element is text, append the current text to it
+							if (this._elements.length && this._elements[this._elements.length - 1].type == ElementType.Text) {
+								var prevElement = this._elements[this._elements.length - 1];
+								prevElement.raw = prevElement.data = prevElement.raw + this._prevTagSep + element.raw;
+								element.raw = element.data = ""; //This causes the current element to not be added to the element list
+							}
+						}
+					}
+				}
+				else if (this._tagStack[this._tagStack.length - 1] == ElementType.Style) { //We're currently in a style tag
+					if (elementName == "/style") //Actually, we're no longer in a style tag, so pop it off the stack
+						this._tagStack.pop();
+					else {
+						if (element.raw.indexOf("!--") != 0) { //Make sure we're not in a comment
+							//All data from here to style close is now a text element
+							element.type = ElementType.Text;
+							//If the previous element is text, append the current text to it
+							if (this._elements.length && this._elements[this._elements.length - 1].type == ElementType.Text) {
+								if (element.raw != "") {
+									var prevElement = this._elements[this._elements.length - 1];
+									prevElement.raw = prevElement.data = prevElement.raw + this._prevTagSep + element.raw;
+									element.raw = element.data = ""; //This causes the current element to not be added to the element list
+								}
+								else //Element is empty, so just append the last tag marker found
+									prevElement.raw = prevElement.data = prevElement.raw + this._prevTagSep;
+							}
+							else //The previous element was not text
+								if (element.raw != "")
+									element.raw = element.data = element.raw;
+						}
+					}
+				}
+				else if (this._tagStack[this._tagStack.length - 1] == ElementType.Comment) { //We're currently in a comment tag
+					var rawLen = element.raw.length;
+					if (element.raw.charAt(rawLen - 2) == "-" && element.raw.charAt(rawLen - 1) == "-" && tagSep == ">") {
+						//Actually, we're no longer in a style tag, so pop it off the stack
+						this._tagStack.pop();
+						//If the previous element is a comment, append the current text to it
+						if (this._elements.length && this._elements[this._elements.length - 1].type == ElementType.Comment) {
+							var prevElement = this._elements[this._elements.length - 1];
+							prevElement.raw = prevElement.data = (prevElement.raw + element.raw).replace(Parser._reTrimComment, "");
+							element.raw = element.data = ""; //This causes the current element to not be added to the element list
+							element.type = ElementType.Text;
+						}
+						else //Previous element not a comment
+							element.type = ElementType.Comment; //Change the current element's type to a comment
+					}
+					else { //Still in a comment tag
+						element.type = ElementType.Comment;
+						//If the previous element is a comment, append the current text to it
+						if (this._elements.length && this._elements[this._elements.length - 1].type == ElementType.Comment) {
+							var prevElement = this._elements[this._elements.length - 1];
+							prevElement.raw = prevElement.data = prevElement.raw + element.raw + tagSep;
+							element.raw = element.data = ""; //This causes the current element to not be added to the element list
+							element.type = ElementType.Text;
+						}
+						else
+							element.raw = element.data = element.raw + tagSep;
+					}
+				}
+			}
+	
+			//Processing of non-special tags
+			if (element.type == ElementType.Tag) {
+				element.name = elementName;
+				
+				if (element.raw.indexOf("!--") == 0) { //This tag is really comment
+					element.type = ElementType.Comment;
+					delete element["name"];
+					var rawLen = element.raw.length;
+					//Check if the comment is terminated in the current element
+					if (element.raw.charAt(rawLen - 1) == "-" && element.raw.charAt(rawLen - 2) == "-" && tagSep == ">")
+						element.raw = element.data = element.raw.replace(Parser._reTrimComment, "");
+					else { //It's not so push the comment onto the tag stack
+						element.raw += tagSep;
+						this._tagStack.push(ElementType.Comment);
+					}
+				}
+				else if (element.raw.indexOf("!") == 0 || element.raw.indexOf("?") == 0) {
+					element.type = ElementType.Directive;
+					//TODO: what about CDATA?
+				}
+				else if (element.name == "script") {
+					element.type = ElementType.Script;
+					//Special tag, push onto the tag stack if not terminated
+					if (element.data.charAt(element.data.length - 1) != "/")
+						this._tagStack.push(ElementType.Script);
+				}
+				else if (element.name == "/script")
+					element.type = ElementType.Script;
+				else if (element.name == "style") {
+					element.type = ElementType.Style;
+					//Special tag, push onto the tag stack if not terminated
+					if (element.data.charAt(element.data.length - 1) != "/")
+						this._tagStack.push(ElementType.Style);
+				}
+				else if (element.name == "/style")
+					element.type = ElementType.Style;
+				if (element.name && element.name.charAt(0) == "/")
+					element.data = element.name;
+			}
+	
+			//Add all tags and non-empty text elements to the element list
+			if (element.raw != "" || element.type != ElementType.Text) {
+				this.parseAttribs(element);
+				this._elements.push(element);
+				//If tag self-terminates, add an explicit, separate closing tag
+				if (
+					element.type != ElementType.Text
+					&&
+					element.type != ElementType.Comment
+					&&
+					element.type != ElementType.Directive
+					&&
+					element.data.charAt(element.data.length - 1) == "/"
+					)
+					this._elements.push({
+						  raw: "/" + element.name
+						, data: "/" + element.name
+						, name: "/" + element.name
+						, type: element.type
+					});
+			}
+			this._parseState = (tagSep == "<") ? ElementType.Tag : ElementType.Text;
+			this._current = this._next + 1;
+			this._prevTagSep = tagSep;
+		}
+	
+		this._buffer = (this._current <= bufferEnd) ? this._buffer.substring(this._current) : "";
+		this._current = 0;
+	
+		this.writeHandler();
+	}
+
+	//Checks the handler to make it is an object with the right "interface"
+	Parser.prototype.validateHandler = function Parser$validateHandler (handler) {
+		if ((typeof handler) != "object")
+			throw new Error("Handler is not an object");
+		if ((typeof handler.reset) != "function")
+			throw new Error("Handler method 'reset' is invalid");
+		if ((typeof handler.done) != "function")
+			throw new Error("Handler method 'done' is invalid");
+		if ((typeof handler.writeTag) != "function")
+			throw new Error("Handler method 'writeTag' is invalid");
+		if ((typeof handler.writeText) != "function")
+			throw new Error("Handler method 'writeText' is invalid");
+		if ((typeof handler.writeComment) != "function")
+			throw new Error("Handler method 'writeComment' is invalid");
+		if ((typeof handler.writeDirective) != "function")
+			throw new Error("Handler method 'writeDirective' is invalid");
+	}
+
+	//Writes parsed elements out to the handler
+	Parser.prototype.writeHandler = function Parser$writeHandler (forceFlush) {
+		forceFlush = !!forceFlush;
+		if (this._tagStack.length && !forceFlush)
+			return;
+		while (this._elements.length) {
+			var element = this._elements.shift();
+			switch (element.type) {
+				case ElementType.Comment:
+					this._handler.writeComment(element);
+					break;
+				case ElementType.Directive:
+					this._handler.writeDirective(element);
+					break;
+				case ElementType.Text:
+					this._handler.writeText(element);
+					break;
+				default:
+					this._handler.writeTag(element);
+					break;
+			}
+		}
+	}
+
+	Parser.prototype.handleError = function Parser$handleError (error) {
+		if ((typeof this._handler.error) == "function")
+			this._handler.error(error);
+		else
+			throw error;
+	}
+
+//TODO: make this a trully streamable handler
+function RssHandler (callback) {
+	RssHandler.super_.call(this, callback, { ignoreWhitespace: true, verbose: false, enforceEmptyTags: false });
+}
+inherits(RssHandler, DefaultHandler);
+
+	RssHandler.prototype.done = function RssHandler$done () {
+		var feed = { };
+		var feedRoot;
+
+		var found = DomUtils.getElementsByTagName(function (value) { return(value == "rss" || value == "feed"); }, this.dom, false);
+		if (found.length) {
+			feedRoot = found[0];
+		}
+		if (feedRoot) {
+			if (feedRoot.name == "rss") {
+				feed.type = "rss";
+				feedRoot = feedRoot.children[0]; //<channel/>
+				feed.id = "";
+//				require("sys").debug(require("sys").inspect(feedRoot, false, null));
+//				require("sys").debug(require("sys").inspect(DomUtils.getElementsByTagName("title", feedRoot.children, false)[0].children[0].data, false, null));
+				try {
+					feed.title = DomUtils.getElementsByTagName("title", feedRoot.children, false)[0].children[0].data;
+				} catch (ex) { }
+				try {
+					feed.link = DomUtils.getElementsByTagName("link", feedRoot.children, false)[0].children[0].data;
+				} catch (ex) { }
+				try {
+					feed.description = DomUtils.getElementsByTagName("description", feedRoot.children, false)[0].children[0].data;
+				} catch (ex) { }
+				try {
+					feed.updated = new Date(DomUtils.getElementsByTagName("lastBuildDate", feedRoot.children, false)[0].children[0].data);
+				} catch (ex) { }
+				try {
+					feed.author = DomUtils.getElementsByTagName("managingEditor", feedRoot.children, false)[0].children[0].data;
+				} catch (ex) { }
+				feed.items = [];
+				DomUtils.getElementsByTagName("item", feedRoot.children).forEach(function (item, index, list) {
+					var entry = {};
+					try {
+						entry.id = DomUtils.getElementsByTagName("guid", item.children, false)[0].children[0].data;
+					} catch (ex) { }
+					try {
+						entry.title = DomUtils.getElementsByTagName("title", item.children, false)[0].children[0].data;
+					} catch (ex) { }
+					try {
+						entry.link = DomUtils.getElementsByTagName("link", item.children, false)[0].children[0].data;
+					} catch (ex) { }
+					try {
+						entry.description = DomUtils.getElementsByTagName("description", item.children, false)[0].children[0].data;
+					} catch (ex) { }
+					try {
+						entry.pubDate = new Date(DomUtils.getElementsByTagName("pubDate", item.children, false)[0].children[0].data);
+					} catch (ex) { }
+					feed.items.push(entry);
+				});
+			} else {
+				feed.type = "atom";
+				try {
+					feed.id = DomUtils.getElementsByTagName("id", feedRoot.children, false)[0].children[0].data;
+				} catch (ex) { }
+				try {
+					feed.title = DomUtils.getElementsByTagName("title", feedRoot.children, false)[0].children[0].data;
+				} catch (ex) { }
+				try {
+					feed.link = DomUtils.getElementsByTagName("link", feedRoot.children, false)[0].attribs.href;
+				} catch (ex) { }
+				try {
+					feed.description = DomUtils.getElementsByTagName("subtitle", feedRoot.children, false)[0].children[0].data;
+				} catch (ex) { }
+				try {
+					feed.updated = new Date(DomUtils.getElementsByTagName("updated", feedRoot.children, false)[0].children[0].data);
+				} catch (ex) { }
+				try {
+					feed.author = DomUtils.getElementsByTagName("email", feedRoot.children, true)[0].children[0].data;
+				} catch (ex) { }
+				feed.items = [];
+				DomUtils.getElementsByTagName("entry", feedRoot.children).forEach(function (item, index, list) {
+					var entry = {};
+					try {
+						entry.id = DomUtils.getElementsByTagName("id", item.children, false)[0].children[0].data;
+					} catch (ex) { }
+					try {
+						entry.title = DomUtils.getElementsByTagName("title", item.children, false)[0].children[0].data;
+					} catch (ex) { }
+					try {
+						entry.link = DomUtils.getElementsByTagName("link", item.children, false)[0].attribs.href;
+					} catch (ex) { }
+					try {
+						entry.description = DomUtils.getElementsByTagName("summary", item.children, false)[0].children[0].data;
+					} catch (ex) { }
+					try {
+						entry.pubDate = new Date(DomUtils.getElementsByTagName("updated", item.children, false)[0].children[0].data);
+					} catch (ex) { }
+					feed.items.push(entry);
+				});
+			}
+
+			this.dom = feed;
+		}
+		RssHandler.super_.prototype.done.call(this);
+	}
+
+///////////////////////////////////////////////////
+
+function DefaultHandler (callback, options) {
+	this.reset();
+	this._options = options ? options : { };
+	if (this._options.ignoreWhitespace == undefined)
+		this._options.ignoreWhitespace = false; //Keep whitespace-only text nodes
+	if (this._options.verbose == undefined)
+		this._options.verbose = true; //Keep data property for tags and raw property for all
+	if (this._options.enforceEmptyTags == undefined)
+		this._options.enforceEmptyTags = true; //Don't allow children for HTML tags defined as empty in spec
+	if ((typeof callback) == "function")
+		this._callback = callback;
+}
+
+	//**"Static"**//
+	//HTML Tags that shouldn't contain child nodes
+	DefaultHandler._emptyTags = {
+		  area: 1
+		, base: 1
+		, basefont: 1
+		, br: 1
+		, col: 1
+		, frame: 1
+		, hr: 1
+		, img: 1
+		, input: 1
+		, isindex: 1
+		, link: 1
+		, meta: 1
+		, param: 1
+		, embed: 1
+	}
+	//Regex to detect whitespace only text nodes
+	DefaultHandler.reWhitespace = /^\s*$/;
+
+	//**Public**//
+	//Properties//
+	DefaultHandler.prototype.dom = null; //The hierarchical object containing the parsed HTML
+	//Methods//
+	//Resets the handler back to starting state
+	DefaultHandler.prototype.reset = function DefaultHandler$reset() {
+		this.dom = [];
+		this._done = false;
+		this._tagStack = [];
+		this._tagStack.last = function DefaultHandler$_tagStack$last () {
+			return(this.length ? this[this.length - 1] : null);
+		}
+	}
+	//Signals the handler that parsing is done
+	DefaultHandler.prototype.done = function DefaultHandler$done () {
+		this._done = true;
+		this.handleCallback(null);
+	}
+	DefaultHandler.prototype.writeTag = function DefaultHandler$writeTag (element) {
+		this.handleElement(element);
+	} 
+	DefaultHandler.prototype.writeText = function DefaultHandler$writeText (element) {
+		if (this._options.ignoreWhitespace)
+			if (DefaultHandler.reWhitespace.test(element.data))
+				return;
+		this.handleElement(element);
+	} 
+	DefaultHandler.prototype.writeComment = function DefaultHandler$writeComment (element) {
+		this.handleElement(element);
+	} 
+	DefaultHandler.prototype.writeDirective = function DefaultHandler$writeDirective (element) {
+		this.handleElement(element);
+	}
+	DefaultHandler.prototype.error = function DefaultHandler$error (error) {
+		this.handleCallback(error);
+	}
+
+	//**Private**//
+	//Properties//
+	DefaultHandler.prototype._options = null; //Handler options for how to behave
+	DefaultHandler.prototype._callback = null; //Callback to respond to when parsing done
+	DefaultHandler.prototype._done = false; //Flag indicating whether handler has been notified of parsing completed
+	DefaultHandler.prototype._tagStack = null; //List of parents to the currently element being processed
+	//Methods//
+	DefaultHandler.prototype.handleCallback = function DefaultHandler$handleCallback (error) {
+			if ((typeof this._callback) != "function")
+				if (error)
+					throw error;
+				else
+					return;
+			this._callback(error, this.dom);
+	}
+	DefaultHandler.prototype.handleElement = function DefaultHandler$handleElement (element) {
+		if (this._done)
+			this.handleCallback(new Error("Writing to the handler after done() called is not allowed without a reset()"));
+		if (!this._options.verbose) {
+//			element.raw = null; //FIXME: Not clean
+			//FIXME: Serious performance problem using delete
+			delete element.raw;
+			if (element.type == "tag" || element.type == "script" || element.type == "style")
+				delete element.data;
+		}
+		if (!this._tagStack.last()) { //There are no parent elements
+			//If the element can be a container, add it to the tag stack and the top level list
+			if (element.type != ElementType.Text && element.type != ElementType.Comment && element.type != ElementType.Directive) {
+				if (element.name.charAt(0) != "/") { //Ignore closing tags that obviously don't have an opening tag
+					this.dom.push(element);
+					if (!this._options.enforceEmptyTags || !DefaultHandler._emptyTags[element.name]) { //Don't add tags to the tag stack that can't have children
+						this._tagStack.push(element);
+					}
+				}
+			}
+			else //Otherwise just add to the top level list
+				this.dom.push(element);
+		}
+		else { //There are parent elements
+			//If the element can be a container, add it as a child of the element
+			//on top of the tag stack and then add it to the tag stack
+			if (element.type != ElementType.Text && element.type != ElementType.Comment && element.type != ElementType.Directive) {
+				if (element.name.charAt(0) == "/") {
+					//This is a closing tag, scan the tagStack to find the matching opening tag
+					//and pop the stack up to the opening tag's parent
+					var baseName = element.name.substring(1);
+					if (!this._options.enforceEmptyTags || !DefaultHandler._emptyTags[baseName]) {
+						var pos = this._tagStack.length - 1;
+						while (pos > -1 && this._tagStack[pos--].name != baseName) { }
+						if (pos > -1 || this._tagStack[0].name == baseName)
+							while (pos < this._tagStack.length - 1)
+								this._tagStack.pop();
+					}
+				}
+				else { //This is not a closing tag
+					if (!this._tagStack.last().children)
+						this._tagStack.last().children = [];
+					this._tagStack.last().children.push(element);
+					if (!this._options.enforceEmptyTags || !DefaultHandler._emptyTags[element.name]) //Don't add tags to the tag stack that can't have children
+						this._tagStack.push(element);
+				}
+			}
+			else { //This is not a container element
+				if (!this._tagStack.last().children)
+					this._tagStack.last().children = [];
+				this._tagStack.last().children.push(element);
+			}
+		}
+	}
+
+	var DomUtils = {
+		  testElement: function DomUtils$testElement (options, element) {
+			if (!element) {
+				return(false);
+			}
+	
+			for (var key in options) {
+				if (key == "tag_name") {
+					if (element.type != "tag" && element.type != "script" && element.type != "style") {
+						return(false);
+					}
+					return(options["tag_name"](element.name));
+				} else if (key == "tag_type") {
+					return(options["tag_type"](element.type));
+				} else if (key == "tag_contains") {
+					if (element.type != "text" && element.type != "comment" && element.type != "directive") {
+						return(false);
+					}
+					return(options["tag_contains"](element.data));
+				} else {
+					return(element.attribs && options[key](element.attribs[key]));
+				}
+			}
+		
+			return(true);
+		}
+	
+		, getElements: function DomUtils$getElements (options, currentElement, recurse) {
+			recurse = (recurse === undefined || recurse === null) || !!recurse;
+
+			if (!currentElement) {
+				return([]);
+			}
+	
+			var found = [];
+			var elementList;
+
+			function getTest (checkVal) {
+				return(((typeof options[key]) == "function") ? checkVal : function (value) { return(value == checkVal); });
+			}
+			for (var key in options) {
+				options[key] = getTest(options[key]);
+			}
+	
+			if (DomUtils.testElement(options, currentElement)) {
+				found.push(currentElement);
+			}
+	
+			if (recurse && currentElement.children)
+				elementList = currentElement.children;
+			else if (currentElement instanceof Array)
+				elementList = currentElement;
+			else
+				return(found);
+	
+			for (var i = 0; i < elementList.length; i++)
+				found = found.concat(DomUtils.getElements(options, elementList[i], recurse));
+	
+			return(found);
+		}
+		
+		, getElementById: function DomUtils$getElementById (id, currentElement, recurse) {
+			recurse = (recurse === undefined || recurse === null) || !!recurse;
+			var result = DomUtils.getElements({ id: id }, currentElement, recurse);
+			return(result.length ? result[0] : null);
+		}
+		
+		, getElementsByTagName: function DomUtils$getElementsByTagName (name, currentElement, recurse) {
+			recurse = (recurse === undefined || recurse === null) || !!recurse;
+			return(DomUtils.getElements({ tag_name: name }, currentElement, recurse));
+		}
+		
+		, getElementsByTagType: function DomUtils$getElementsByTagType (type, currentElement, recurse) {
+			recurse = (recurse === undefined || recurse === null) || !!recurse;
+			return(DomUtils.getElements({ tag_type: type }, currentElement, recurse));
+		}
+	}
+
+	function inherits (ctor, superCtor) {
+		var tempCtor = function(){};
+		tempCtor.prototype = superCtor.prototype;
+		ctor.super_ = superCtor;
+		ctor.prototype = new tempCtor();
+		ctor.prototype.constructor = ctor;
+	}
+
+exports.Parser = Parser;
+
+exports.DefaultHandler = DefaultHandler;
+
+exports.RssHandler = RssHandler;
+
+exports.ElementType = ElementType;
+
+exports.DomUtils = DomUtils;
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/package.json b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/package.json
new file mode 100644
index 0000000..a57689e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/package.json
@@ -0,0 +1,41 @@
+{
+  "name": "htmlparser",
+  "description": "Forgiving HTML/XML/RSS Parser in JS for *both* Node and Browsers",
+  "version": "1.7.6",
+  "author": {
+    "name": "Chris Winberry",
+    "email": "chris at winberry.net"
+  },
+  "contributors": [],
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/tautologistics/node-htmlparser"
+  },
+  "keywords": [
+    "html",
+    "xml",
+    "rss",
+    "parser"
+  ],
+  "directories": {
+    "lib": "./lib/"
+  },
+  "main": "./lib/htmlparser",
+  "homepage": "http://github.com/tautologistics/node-htmlparser",
+  "bugs": {
+    "url": "http://github.com/tautologistics/node-htmlparser/issues"
+  },
+  "engines": {
+    "node": ">=0.1.33"
+  },
+  "licenses": [
+    {
+      "type": "MIT",
+      "url": "http://github.com/tautologistics/node-htmlparser/raw/master/LICENSE"
+    }
+  ],
+  "readme": "#NodeHtmlParser\nA forgiving HTML/XML/RSS parser written in JS for both the browser and NodeJS (yes, despite the name it works just fine in any modern browser). The parser can handle streams (chunked data) and supports custom handlers for writing custom DOMs/output.\n\n##Installing\n\n\tnpm install htmlparser\n\n##Running Tests\n\n###Run tests under node:\n\tnode runtests.js\n\n###Run tests in browser:\nView runtests.html in any browser\n\n##Usage In Node\n\n```javascript\nv [...]
+  "readmeFilename": "README.md",
+  "_id": "htmlparser at 1.7.6",
+  "_from": "htmlparser@>= 1.7.3"
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/profile b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/profile
new file mode 100755
index 0000000..e0109b0
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/profile
@@ -0,0 +1,4 @@
+#!/bin/sh
+node --prof --prof_auto profile.js
+~/Documents/src/NodeJS/node-v0.1.91/deps/v8/tools/mac-tick-processor v8.log > profileresults.txt
+
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/profile.getelement.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/profile.getelement.js
new file mode 100644
index 0000000..a5768df
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/profile.getelement.js
@@ -0,0 +1,53 @@
+//node --prof --prof_auto profile.getelement.js
+//deps/v8/tools/mac-tick-processor v8.log > profile.getelement.txt
+var sys = require("sys");
+var fs = require("fs");
+var htmlparser = require("./node-htmlparser");
+var htmlparser_old = require("./node-htmlparser.old");
+
+var testIterations = 100; //Number of test loops to run
+
+function getMillisecs () {
+	return((new Date()).getTime());
+}
+
+function timeExecutions (loops, func) {
+	var start = getMillisecs();
+
+	while (loops--)
+		func();
+
+	return(getMillisecs() - start);
+}
+
+var html = fs.readFileSync("testdata/getelement.html");
+var handler = new htmlparser.DefaultHandler(function(err, dom) {
+	if (err)
+		sys.debug("Error: " + err);
+});
+var parser = new htmlparser.Parser(handler);
+parser.parseComplete(html);
+var dom = handler.dom;
+
+//sys.debug(sys.inspect(dom, false, null));
+sys.puts("New: " + timeExecutions(testIterations, function () {
+	var foundDivs = htmlparser.DomUtils.getElementsByTagName("div", dom);
+//	sys.puts("Found: " + foundDivs.length);
+
+	var foundLimitDivs = htmlparser.DomUtils.getElementsByTagName("div", dom, null, 100);
+//	sys.puts("Found: " + foundLimitDivs.length);
+
+	var foundId = htmlparser.DomUtils.getElementById("question-summary-3018026", dom);
+//	sys.puts("Found: " + foundId);
+}));
+
+sys.puts("Old: " + timeExecutions(testIterations, function () {
+	var foundDivs = htmlparser_old.DomUtils.getElementsByTagName("div", dom);
+//	sys.puts("Found: " + foundDivs.length);
+
+//	var foundLimitDivs = htmlparser.DomUtils.getElementsByTagName("div", dom);
+//	sys.puts("Found: " + foundLimitDivs.length);
+
+	var foundId = htmlparser_old.DomUtils.getElementById("question-summary-3018026", dom);
+//	sys.puts("Found: " + foundId);
+}));
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/profile.getelement.txt b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/profile.getelement.txt
new file mode 100644
index 0000000..41b4e50
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/profile.getelement.txt
@@ -0,0 +1,199 @@
+line 656: unknown command: .str.split.
+line 657: unknown command: .map.join.
+line 658: unknown command:  sys:139"
+Statistical profiling result from v8.log, (429 ticks, 26 unaccounted, 0 excluded).
+
+ [Unknown]:
+   ticks  total  nonlib   name
+     26    6.1%
+
+ [Shared libraries]:
+   ticks  total  nonlib   name
+
+ [JavaScript]:
+   ticks  total  nonlib   name
+    108   25.2%   25.2%  Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+     19    4.4%    4.4%  Function: DomUtils$testElement /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:658
+      8    1.9%    1.9%  Stub: FastNewClosure
+      8    1.9%    1.9%  Stub: Compare
+      7    1.6%    1.6%  Stub: ToBoolean
+      7    1.6%    1.6%  LazyCompile: isNaN native v8natives.js:78
+      7    1.6%    1.6%  KeyedLoadIC: A keyed load IC from the snapshot
+      7    1.6%    1.6%  Builtin: A builtin from the snapshot
+      5    1.2%    1.2%  LazyCompile: parseInt native v8natives.js:94
+      4    0.9%    0.9%  Stub: FastCloneShallowArray
+      4    0.9%    0.9%  Stub: CEntry
+      4    0.9%    0.9%  Function: Parser$parseTags /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:204
+      3    0.7%    0.7%  Stub: SubString
+      3    0.7%    0.7%  Stub: Compare {1}
+      3    0.7%    0.7%  Function: Module._compile module:348
+      3    0.7%    0.7%  Function: <anonymous> /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:697
+      2    0.5%    0.5%  Stub: Instanceof
+      2    0.5%    0.5%  RegExp: (^\\s+|\\s+$) {1}
+      2    0.5%    0.5%  LazyCompile: split native string.js:587
+      2    0.5%    0.5%  LazyCompile: exec native regexp.js:186
+      2    0.5%    0.5%  LazyCompile: StringReplaceRegExp native string.js:278
+      2    0.5%    0.5%  Function: Parser$parseAttribs /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:164
+      2    0.5%    0.5%  Function: DefaultHandler$_tagStack$last /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:559
+      1    0.2%    0.2%  Stub: StringAdd
+      1    0.2%    0.2%  RegExp: ^\\s*(\\/?)\\s*([^\\s\\/]+)
+      1    0.2%    0.2%  RegExp: \\s
+      1    0.2%    0.2%  RegExp: [\\<\\>]
+      1    0.2%    0.2%  RegExp: (^\\s+|\\s+$)
+      1    0.2%    0.2%  RegExp: ([^=<>\\
+      1    0.2%    0.2%  LazyCompile: test native regexp.js:264
+      1    0.2%    0.2%  LazyCompile: substring native string.js:707
+      1    0.2%    0.2%  LazyCompile: slice native string.js:552
+      1    0.2%    0.2%  LazyCompile: charAt native string.js:64
+      1    0.2%    0.2%  LazyCompile: SubString native string.js:214
+      1    0.2%    0.2%  LazyCompile: EQUALS native runtime.js:54
+      1    0.2%    0.2%  Function: createInternalModule module:26
+      1    0.2%    0.2%  Function: Parser$writeHandler /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:383
+      1    0.2%    0.2%  Function: Parser$parseChunk /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:87
+      1    0.2%    0.2%  Function: DomUtils$getElementsByTagName /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:736
+      1    0.2%    0.2%  Function: DefaultHandler$writeTag /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:568
+
+ [C++]:
+   ticks  total  nonlib   name
+     24    5.6%    5.6%  v8::internal::Builtin_ArrayConcat
+     13    3.0%    3.0%  v8::internal::Heap::AllocateJSObjectFromMap
+     13    3.0%    3.0%  v8::internal::ArrayPrototypeHasNoElements
+     12    2.8%    2.8%  v8::internal::CopyElements
+     10    2.3%    2.3%  v8::internal::Context::global_context
+      8    1.9%    1.9%  v8::internal::Heap::Allocate
+      7    1.6%    1.6%  v8::internal::AllocateFixedArrayWithFiller
+      6    1.4%    1.4%  v8::internal::CharacterStreamUTF16Buffer::Advance
+      6    1.4%    1.4%  v8::internal::Builtin_ArrayPush
+      4    0.9%    0.9%  v8::internal::String::SlowEquals
+      4    0.9%    0.9%  v8::internal::Heap::AllocateUninitializedFixedArray
+      4    0.9%    0.9%  v8::internal::Heap::AllocateJSObject
+      3    0.7%    0.7%  v8::internal::String::ComputeAndSetHash
+      3    0.7%    0.7%  v8::internal::Scanner::ScanJavaScript
+      3    0.7%    0.7%  v8::internal::JSObject::LocalLookup
+      3    0.7%    0.7%  v8::internal::Heap::AllocateRawFixedArray
+      2    0.5%    0.5%  v8::internal::VirtualFrame::PrepareMergeTo
+      2    0.5%    0.5%  v8::internal::ScavengeVisitor::VisitPointers
+      2    0.5%    0.5%  v8::internal::Runtime_StringEquals
+      2    0.5%    0.5%  v8::internal::MarkingVisitor::VisitPointers
+      2    0.5%    0.5%  v8::internal::KeywordMatcher::Step
+      2    0.5%    0.5%  v8::internal::JumpTarget::DoBind
+      2    0.5%    0.5%  v8::internal::JumpTarget::ComputeEntryFrame
+      2    0.5%    0.5%  v8::internal::Heap::IterateRSetRange
+      2    0.5%    0.5%  v8::internal::Heap::AllocateStringFromUtf8
+      2    0.5%    0.5%  v8::internal::Heap::AllocateFixedArray
+      2    0.5%    0.5%  ___dtoa
+      1    0.2%    0.2%  v8::internal::VirtualFrame::SyncRange
+      1    0.2%    0.2%  v8::internal::VirtualFrame::SyncElementByPushing
+      1    0.2%    0.2%  v8::internal::VirtualFrame::Push
+      1    0.2%    0.2%  v8::internal::VirtualFrame::MergeMoveMemoryToRegisters
+      1    0.2%    0.2%  v8::internal::SweepNewSpace
+      1    0.2%    0.2%  v8::internal::String::WriteToFlat<unsigned short>
+      1    0.2%    0.2%  v8::internal::String::IsEqualTo
+      1    0.2%    0.2%  v8::internal::SetElement
+      1    0.2%    0.2%  v8::internal::Scanner::ScanIdentifier
+      1    0.2%    0.2%  v8::internal::Runtime_StringReplaceRegExpWithString
+      1    0.2%    0.2%  v8::internal::Runtime_StringIndexOf
+      1    0.2%    0.2%  v8::internal::RegisterAllocator::Allocate
+      1    0.2%    0.2%  v8::internal::RegExpMacroAssemblerIA32::PushBacktrack
+      1    0.2%    0.2%  v8::internal::Object::GetPrototype
+      1    0.2%    0.2%  v8::internal::Object::GetProperty
+      1    0.2%    0.2%  v8::internal::MemoryAllocator::InitializePagesInChunk
+      1    0.2%    0.2%  v8::internal::Map::PropertyIndexFor
+      1    0.2%    0.2%  v8::internal::Map::FindInCodeCache
+      1    0.2%    0.2%  v8::internal::MacroAssembler::InvokeFunction
+      1    0.2%    0.2%  v8::internal::JumpTarget::DoJump
+      1    0.2%    0.2%  v8::internal::JumpTarget::DoBranch
+      1    0.2%    0.2%  v8::internal::HeapObject::IterateBody
+      1    0.2%    0.2%  v8::internal::HeapObject::Iterate
+      1    0.2%    0.2%  v8::internal::Heap::Scavenge
+      1    0.2%    0.2%  v8::internal::Heap::AllocateSubString
+      1    0.2%    0.2%  v8::internal::Heap::AllocateStringFromAscii
+      1    0.2%    0.2%  v8::internal::Heap::AllocateRawAsciiString
+      1    0.2%    0.2%  v8::internal::HashTable<v8::internal::StringDictionaryShape, v8::internal::String*>::FindEntry
+      1    0.2%    0.2%  v8::internal::FreeListNode::set_size
+      1    0.2%    0.2%  v8::internal::Deserializer::ReadChunk
+      1    0.2%    0.2%  v8::internal::DescriptorArray::CopyInsert
+      1    0.2%    0.2%  v8::internal::CompareStub::MinorKey
+      1    0.2%    0.2%  v8::internal::CompareLocal
+      1    0.2%    0.2%  v8::internal::CodeGenerator::VisitStatements
+      1    0.2%    0.2%  v8::internal::CodeGenerator::Load
+      1    0.2%    0.2%  v8::internal::CodeGenerator::Comparison
+      1    0.2%    0.2%  v8::internal::CallIC::LoadFunction
+      1    0.2%    0.2%  v8::internal::AssignedVariablesAnalyzer::ProcessExpression
+      1    0.2%    0.2%  v8::internal::Assembler::mov
+      1    0.2%    0.2%  v8::internal::Assembler::jmp
+      1    0.2%    0.2%  v8::internal::AllocateEmptyJSArray
+      1    0.2%    0.2%  unibrow::Utf8::ReadBlock
+      1    0.2%    0.2%  node::Cipher::Initialize
+      1    0.2%    0.2%  _szone_free
+      1    0.2%    0.2%  _small_malloc_from_region_no_lock
+      1    0.2%    0.2%  _sha1_block_data_order
+      1    0.2%    0.2%  _pthread_mutex_unlock
+      1    0.2%    0.2%  _ares_library_init
+      1    0.2%    0.2%  _aes_decrypt_cbc
+      1    0.2%    0.2%  __mh_dylib_header
+      1    0.2%    0.2%  _NSGetNextSearchPathEnumeration
+
+ [GC]:
+   ticks  total  nonlib   name
+     13    3.0%
+
+ [Bottom up (heavy) profile]:
+  Note: percentage shows a share of a particular caller in the total
+  amount of its parent calls.
+  Callers occupying less than 2.0% are not shown.
+
+   ticks parent  name
+    108   25.2%  Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+    108  100.0%    Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+    108  100.0%      Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+    103   95.4%        Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+    103  100.0%          Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+    102   99.0%            Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+      5    4.6%        Function: DomUtils$getElementsByTagName /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:736
+      5  100.0%          Function: <anonymous> /Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.getelement.js:33
+      5  100.0%            Function: timeExecutions /Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.getelement.js:14
+
+     24    5.6%  v8::internal::Builtin_ArrayConcat
+     24  100.0%    Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+     24  100.0%      Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+     24  100.0%        Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+     24  100.0%          Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+     23   95.8%            Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+      1    4.2%            Function: DomUtils$getElementsByTagName /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:736
+
+     19    4.4%  Function: DomUtils$testElement /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:658
+     18   94.7%    Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+     18  100.0%      Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+     18  100.0%        Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+     18  100.0%          Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+     18  100.0%            Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+
+     13    3.0%  v8::internal::Heap::AllocateJSObjectFromMap
+     13  100.0%    Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+     13  100.0%      Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+     13  100.0%        Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+     13  100.0%          Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+     13  100.0%            Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+
+     13    3.0%  v8::internal::ArrayPrototypeHasNoElements
+     13  100.0%    Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+     13  100.0%      Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+     13  100.0%        Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+     13  100.0%          Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+     13  100.0%            Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+
+     12    2.8%  v8::internal::CopyElements
+     12  100.0%    Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+     12  100.0%      Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+     12  100.0%        Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+     12  100.0%          Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+     12  100.0%            Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+
+     10    2.3%  v8::internal::Context::global_context
+     10  100.0%    Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+     10  100.0%      Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+     10  100.0%        Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+     10  100.0%          Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+     10  100.0%            Function: DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684
+
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/profile.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/profile.js
new file mode 100644
index 0000000..f9d0ef2
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/profile.js
@@ -0,0 +1,63 @@
+//node --prof --prof_auto profile.js
+//deps/v8/tools/mac-tick-processor v8.log
+var sys = require("sys");
+var fs = require("fs");
+var http = require("http");
+var htmlparser = require("./lib/htmlparser");
+//var libxml = require('./libxmljs');
+
+var testNHP = true; //Should node-htmlparser be exercised?
+var testLXJS = false; //Should libxmljs be exercised?
+var testIterations = 100; //Number of test loops to run
+
+var testHost = "localhost"; //Host to fetch test HTML from
+var testPort = 80; //Port on host to fetch test HTML from
+var testPath = "/~chris/feed.xml"; //Path on host to fetch HTML from
+
+function getMillisecs () {
+	return((new Date()).getTime());
+}
+
+function timeExecutions (loops, func) {
+	var start = getMillisecs();
+
+	while (loops--)
+		func();
+
+	return(getMillisecs() - start);
+}
+
+var html = "";
+http.createClient(testPort, testHost)
+	.request("GET", testPath, { host: testHost })
+	.addListener("response", function (response) {
+		if (response.statusCode == "200") {
+			response.setEncoding("utf8");
+			response.addListener("data", function (chunk) {
+				html += chunk;
+			}).addListener("end", function() {
+				var timeNodeHtmlParser = !testNHP ? 0 : timeExecutions(testIterations, function () {
+					var handler = new htmlparser.DefaultHandler(function(err, dom) {
+						if (err)
+							sys.debug("Error: " + err);
+					});
+					var parser = new htmlparser.Parser(handler, { includeLocation: true });
+					parser.parseComplete(html);
+				})
+				
+				var timeLibXmlJs = !testLXJS ? 0 : timeExecutions(testIterations, function () {
+					var dom = libxml.parseHtmlString(html);
+				})
+
+				if (testNHP)
+					sys.debug("NodeHtmlParser: "  + timeNodeHtmlParser);
+				if (testLXJS)
+					sys.debug("LibXmlJs: "  + timeLibXmlJs);
+				if (testNHP && testLXJS)
+					sys.debug("Difference: " + ((timeNodeHtmlParser - timeLibXmlJs) / timeLibXmlJs) * 100);
+			});
+		}
+		else
+			sys.debug("Error: got response status " + response.statusCode);
+	})
+	.end();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/profileresults.txt b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/profileresults.txt
new file mode 100644
index 0000000..933a319
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/profileresults.txt
@@ -0,0 +1,301 @@
+line 663: unknown command: .str.split.
+line 664: unknown command: .map.join.
+line 665: unknown command:  sys:139"
+Statistical profiling result from v8.log, (3681 ticks, 563 unaccounted, 0 excluded).
+
+ [Unknown]:
+   ticks  total  nonlib   name
+    563   15.3%
+
+ [Shared libraries]:
+   ticks  total  nonlib   name
+
+ [JavaScript]:
+   ticks  total  nonlib   name
+    545   14.8%   14.8%  Function: timeLibXmlJs.testLXJS.timeExecutions.testIterations /Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.js:48
+    225    6.1%    6.1%  Function: Parser$parseTags /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:205
+    110    3.0%    3.0%  Function: Parser$parseChunk /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:88
+     91    2.5%    2.5%  LazyCompile: test native regexp.js:264
+     81    2.2%    2.2%  Stub: RegExpExecStub
+     73    2.0%    2.0%  LazyCompile: exec native regexp.js:186
+     66    1.8%    1.8%  Stub: SubString
+     66    1.8%    1.8%  LazyCompile: BuildResultFromMatchInfo native regexp.js:151
+     54    1.5%    1.5%  RegExp: ^\\s*(\\/?)\\s*([^\\s\\/]+)
+     52    1.4%    1.4%  LazyCompile: substring native string.js:707
+     50    1.4%    1.4%  LazyCompile: split native string.js:587
+     46    1.2%    1.2%  Stub: CEntry
+     44    1.2%    1.2%  Function: DefaultHandler$writeTag /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:465
+     42    1.1%    1.1%  Stub: Compare {1}
+     38    1.0%    1.0%  LazyCompile: slice native string.js:552
+     31    0.8%    0.8%  LazyCompile: indexOf native string.js:109
+     29    0.8%    0.8%  RegExp: [\\<\\>]
+     29    0.8%    0.8%  LazyCompile: SubString native string.js:214
+     29    0.8%    0.8%  Function: DefaultHandler$handleElement /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:499
+     28    0.8%    0.8%  Function: Parser$parseTagName /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:194
+     26    0.7%    0.7%  Stub: Compare {2}
+     26    0.7%    0.7%  Function: DefaultHandler$writeText /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:468
+     20    0.5%    0.5%  KeyedLoadIC: A keyed load IC from the snapshot
+     20    0.5%    0.5%  Function: Parser$writeHandler /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:384
+     19    0.5%    0.5%  LazyCompile: STRING_ADD_LEFT native runtime.js:175
+     19    0.5%    0.5%  Function: Parser$parseAttribs /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:165
+     17    0.5%    0.5%  LazyCompile: EQUALS native runtime.js:54
+     16    0.4%    0.4%  Stub: ToBoolean
+     16    0.4%    0.4%  RegExp: ^\\s*(\\/?)\\s*([^\\s\\/]+) {1}
+     15    0.4%    0.4%  RegExp: (^\\s+|\\s+$) {1}
+     14    0.4%    0.4%  RegExp: (^\\s+|\\s+$)
+     13    0.4%    0.4%  LazyCompile: StringReplaceRegExp native string.js:278
+     12    0.3%    0.3%  LazyCompile: replace native string.js:236
+     12    0.3%    0.3%  LazyCompile: charAt native string.js:64
+     12    0.3%    0.3%  KeyedStoreIC: A keyed store IC from the snapshot
+     10    0.3%    0.3%  RegExp: \\s
+      9    0.2%    0.2%  Stub: StringAdd
+      9    0.2%    0.2%  Stub: FastCloneShallowArray
+      9    0.2%    0.2%  Function: DefaultHandler$_tagStack$last /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:456
+      8    0.2%    0.2%  RegExp: \\s {1}
+      7    0.2%    0.2%  Stub: Compare {3}
+      7    0.2%    0.2%  LazyCompile: splitMatch native string.js:696
+      4    0.1%    0.1%  Stub: Compare
+      4    0.1%    0.1%  LazyCompile: DoRegExpExec native regexp.js:117
+      3    0.1%    0.1%  Builtin: A builtin from the snapshot
+      2    0.1%    0.1%  Stub: GenericBinaryOpStub_ADD_Alloc_RegArgs_UnknownType_Default
+      1    0.0%    0.0%  Stub: ArgumentsAccess
+      1    0.0%    0.0%  RegExp: ([^=<>\\ {1}
+      1    0.0%    0.0%  RegExp: ([^=<>\\
+      1    0.0%    0.0%  Function: DefaultHandler /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:415
+
+ [C++]:
+   ticks  total  nonlib   name
+    214    5.8%    5.8%  _libinfoDSmig_Query_async
+     74    2.0%    2.0%  v8::internal::String::ReadBlock
+     63    1.7%    1.7%  v8::internal::JSObject::LocalLookupRealNamedProperty
+     61    1.7%    1.7%  v8::internal::CallIC::UpdateCaches
+     55    1.5%    1.5%  v8::internal::CallIC::LoadFunction
+     53    1.4%    1.4%  v8::internal::Object::GetProperty
+     53    1.4%    1.4%  v8::String::WriteUtf8
+     52    1.4%    1.4%  v8::internal::CallIC_Miss
+     46    1.2%    1.2%  v8::internal::JSObject::LocalLookup
+     36    1.0%    1.0%  v8::internal::JSObject::LookupInDescriptor
+     31    0.8%    0.8%  v8::internal::JSObject::Lookup
+     26    0.7%    0.7%  v8::internal::Object::Lookup
+     26    0.7%    0.7%  ___vfprintf
+     25    0.7%    0.7%  v8::internal::String::Utf8Length
+     25    0.7%    0.7%  v8::internal::Heap::AllocateRawFixedArray
+     23    0.6%    0.6%  v8::internal::Heap::CopyJSObject
+     23    0.6%    0.6%  __mh_dylib_header
+     22    0.6%    0.6%  v8::internal::SharedStoreIC_ExtendStorage
+     22    0.6%    0.6%  v8::internal::SetElement
+     22    0.6%    0.6%  v8::internal::Runtime_CreateObjectLiteralShallow
+     22    0.6%    0.6%  v8::internal::HashTable<v8::internal::StringDictionaryShape, v8::internal::String*>::FindEntry
+     21    0.6%    0.6%  v8::internal::Runtime::StringMatch
+     20    0.5%    0.5%  v8::internal::JSObject::SetFastElement
+     19    0.5%    0.5%  v8::internal::IC::StateFrom
+     19    0.5%    0.5%  v8::internal::Heap::AllocateSubString
+     19    0.5%    0.5%  v8::internal::Heap::AllocateRawTwoByteString
+     19    0.5%    0.5%  _asprintf
+     18    0.5%    0.5%  v8::internal::Runtime_StringReplaceRegExpWithString
+     18    0.5%    0.5%  v8::internal::Object::GetPrototype
+     18    0.5%    0.5%  v8::internal::DescriptorArray::BinarySearch
+     17    0.5%    0.5%  v8::internal::Runtime::SetObjectProperty
+     16    0.4%    0.4%  v8::internal::String::SlowEquals
+     15    0.4%    0.4%  v8::internal::AllocateFixedArrayWithFiller
+     14    0.4%    0.4%  v8::internal::LookupForRead
+     14    0.4%    0.4%  v8::internal::Heap::AllocateRawAsciiString
+     13    0.4%    0.4%  v8::internal::Runtime_StringIndexOf
+     12    0.3%    0.3%  v8::internal::JSObject::SetFastElements
+     11    0.3%    0.3%  v8::internal::Runtime_SubString
+     11    0.3%    0.3%  v8::internal::Runtime_StringEquals
+     11    0.3%    0.3%  v8::internal::Heap::AllocateFixedArray
+     10    0.3%    0.3%  v8::internal::RegExpImpl::IrregexpExecOnce
+     10    0.3%    0.3%  _szone_calloc
+     10    0.3%    0.3%  _nanosleep$UNIX2003
+     10    0.3%    0.3%  _mach_init_doit
+      9    0.2%    0.2%  v8::internal::TwoCharHashTableKey::IsMatch
+      9    0.2%    0.2%  v8::internal::JSObject::GetNormalizedProperty
+      9    0.2%    0.2%  _bootstrap_look_up
+      8    0.2%    0.2%  v8::internal::String::ComputeAndSetHash
+      8    0.2%    0.2%  v8::internal::RegExpStack::RegExpStack
+      8    0.2%    0.2%  v8::internal::RegExpImpl::IrregexpPrepare
+      8    0.2%    0.2%  v8::internal::RegExpImpl::IrregexpExec
+      8    0.2%    0.2%  v8::internal::JSObject::SetElementWithoutInterceptor
+      7    0.2%    0.2%  v8::internal::String::WriteToFlat<unsigned short>
+      7    0.2%    0.2%  v8::internal::SimpleIndexOf<char, unsigned short>
+      7    0.2%    0.2%  v8::internal::ScavengeVisitor::VisitPointers
+      7    0.2%    0.2%  v8::internal::HashTable<v8::internal::SymbolTableShape, v8::internal::HashTableKey*>::FindEntry
+      6    0.2%    0.2%  v8::internal::ArrayPrototypeHasNoElements
+      5    0.1%    0.1%  v8::internal::SymbolTable::LookupTwoCharsSymbolIfExists
+      5    0.1%    0.1%  v8::internal::Runtime_SetProperty
+      5    0.1%    0.1%  v8::internal::Runtime_KeyedGetProperty
+      5    0.1%    0.1%  v8::internal::Runtime::GetObjectProperty
+      5    0.1%    0.1%  v8::internal::NativeRegExpMacroAssembler::Match
+      5    0.1%    0.1%  v8::internal::JumpTarget::ComputeEntryFrame
+      5    0.1%    0.1%  v8::internal::Heap::AllocateConsString
+      5    0.1%    0.1%  v8::internal::Builtin_ArrayShift
+      5    0.1%    0.1%  v8::internal::Builtin_ArrayPush
+      5    0.1%    0.1%  _small_malloc_from_region_no_lock
+      4    0.1%    0.1%  v8::internal::String::WriteToFlat<char>
+      4    0.1%    0.1%  v8::internal::String::SubString
+      4    0.1%    0.1%  v8::internal::NativeRegExpMacroAssembler::StringCharacterPosition
+      4    0.1%    0.1%  v8::internal::LeftTrimFixedArray
+      4    0.1%    0.1%  v8::internal::JSObject::SetElement
+      4    0.1%    0.1%  v8::internal::Heap::AllocateFixedArrayWithHoles
+      3    0.1%    0.1%  v8::internal::String::ToUC16Vector
+      3    0.1%    0.1%  v8::internal::RegExpImpl::Exec
+      3    0.1%    0.1%  v8::internal::NativeRegExpMacroAssembler::Execute
+      3    0.1%    0.1%  v8::internal::JumpTarget::DoBind
+      3    0.1%    0.1%  v8::internal::HeapObject::IterateBody
+      3    0.1%    0.1%  v8::internal::Heap::DoScavenge
+      3    0.1%    0.1%  v8::internal::AssignedVariablesAnalyzer::ProcessExpression
+      3    0.1%    0.1%  _select$NOCANCEL$UNIX2003
+      3    0.1%    0.1%  _mach_init
+      2    0.1%    0.1%  v8::internal::VirtualFrame::PrepareMergeTo
+      2    0.1%    0.1%  v8::internal::StringHasher::GetHashField
+      2    0.1%    0.1%  v8::internal::String::ToAsciiVector
+      2    0.1%    0.1%  v8::internal::Scanner::ScanJavaScript
+      2    0.1%    0.1%  v8::internal::Result::Result
+      2    0.1%    0.1%  v8::internal::RegExpStack::~RegExpStack
+      2    0.1%    0.1%  v8::internal::HeapObject::SlowSizeFromMap
+      2    0.1%    0.1%  v8::internal::Heap::ScavengeObjectSlow
+      2    0.1%    0.1%  v8::internal::Context::global_context
+      2    0.1%    0.1%  v8::internal::CharacterStreamUTF16Buffer::Advance
+      2    0.1%    0.1%  v8::internal::AstVisitor::CheckStackOverflow
+      2    0.1%    0.1%  v8::internal::AstOptimizer::VisitVariableProxy
+      2    0.1%    0.1%  unibrow::Utf8::ReadBlock
+      2    0.1%    0.1%  _mach_reply_port
+      2    0.1%    0.1%  __keymgr_get_and_lock_processwide_ptr_2
+      1    0.0%    0.0%  v8::internal::Zone::NewExpand
+      1    0.0%    0.0%  v8::internal::VirtualFrame::Pop
+      1    0.0%    0.0%  v8::internal::TypeInfo::TypeFromValue
+      1    0.0%    0.0%  v8::internal::SweepNewSpace
+      1    0.0%    0.0%  v8::internal::String::ToCString
+      1    0.0%    0.0%  v8::internal::String::IsEqualTo
+      1    0.0%    0.0%  v8::internal::String::ComputeHashField
+      1    0.0%    0.0%  v8::internal::Slot::AsSlot
+      1    0.0%    0.0%  v8::internal::SetProperty
+      1    0.0%    0.0%  v8::internal::ScopeInfo<v8::internal::ZoneListAllocationPolicy>::ScopeInfo
+      1    0.0%    0.0%  v8::internal::Scope::Scope
+      1    0.0%    0.0%  v8::internal::ScavengeVisitor::VisitPointer
+      1    0.0%    0.0%  v8::internal::Scanner::ScanIdentifier
+      1    0.0%    0.0%  v8::internal::Runtime::GetElementOrCharAt
+      1    0.0%    0.0%  v8::internal::RelocIterator::next
+      1    0.0%    0.0%  v8::internal::Parser::ParseUnaryExpression
+      1    0.0%    0.0%  v8::internal::Parser::ParseStatement
+      1    0.0%    0.0%  v8::internal::OldSpace::SlowAllocateRaw
+      1    0.0%    0.0%  v8::internal::MarkingVisitor::VisitPointer
+      1    0.0%    0.0%  v8::internal::Literal::IsPropertyName
+      1    0.0%    0.0%  v8::internal::KeyedLookupCache::Lookup
+      1    0.0%    0.0%  v8::internal::JumpTarget::DoBranch
+      1    0.0%    0.0%  v8::internal::JumpTarget::Branch
+      1    0.0%    0.0%  v8::internal::HeapObject::Iterate
+      1    0.0%    0.0%  v8::internal::Heap::UpdateRSet
+      1    0.0%    0.0%  v8::internal::Heap::CreateFillerObjectAt
+      1    0.0%    0.0%  v8::internal::Heap::AllocateUninitializedFixedArray
+      1    0.0%    0.0%  v8::internal::Heap::AllocateStringFromUtf8
+      1    0.0%    0.0%  v8::internal::Heap::AllocateStringFromAscii
+      1    0.0%    0.0%  v8::internal::HashTable<v8::internal::StringDictionaryShape, v8::internal::String*>::EnsureCapacity
+      1    0.0%    0.0%  v8::internal::HashMap::HashMap
+      1    0.0%    0.0%  v8::internal::FreeListNode::set_size
+      1    0.0%    0.0%  v8::internal::FixedArray::CopySize
+      1    0.0%    0.0%  v8::internal::Deserializer::GetAddressFromStart
+      1    0.0%    0.0%  v8::internal::DescriptorArray::LinearSearch
+      1    0.0%    0.0%  v8::internal::ContextSlotCache::Lookup
+      1    0.0%    0.0%  v8::internal::CodeGenerator::VisitObjectLiteral
+      1    0.0%    0.0%  v8::internal::CodeGenerator::VisitAssignment
+      1    0.0%    0.0%  v8::internal::AstOptimizer::VisitCompareOperation
+      1    0.0%    0.0%  v8::internal::Assembler::push
+      1    0.0%    0.0%  v8::internal::Assembler::j
+      1    0.0%    0.0%  v8::Integer::New
+      1    0.0%    0.0%  node::Socket
+      1    0.0%    0.0%  node::DLOpen
+      1    0.0%    0.0%  _tiny_malloc_from_free_list
+      1    0.0%    0.0%  _szone_free
+      1    0.0%    0.0%  _small_free_list_remove_ptr
+      1    0.0%    0.0%  _sha1_block_data_order
+      1    0.0%    0.0%  _pthread_mutex_unlock
+      1    0.0%    0.0%  _memset_pattern4
+      1    0.0%    0.0%  _memset_pattern16
+      1    0.0%    0.0%  _mach_port_allocate
+      1    0.0%    0.0%  _mach_msg_trap
+      1    0.0%    0.0%  _localeconv_l
+      1    0.0%    0.0%  _libSystem_initializer
+      1    0.0%    0.0%  _getsectbynamefromheader
+      1    0.0%    0.0%  _get_or_create_key_element
+      1    0.0%    0.0%  _expl
+      1    0.0%    0.0%  __nc_table_insert_n
+      1    0.0%    0.0%  ___sfvwrite
+      1    0.0%    0.0%  __LI_async_send
+
+ [GC]:
+   ticks  total  nonlib   name
+     30    0.8%
+
+ [Bottom up (heavy) profile]:
+  Note: percentage shows a share of a particular caller in the total
+  amount of its parent calls.
+  Callers occupying less than 2.0% are not shown.
+
+   ticks parent  name
+    545   14.8%  Function: timeLibXmlJs.testLXJS.timeExecutions.testIterations /Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.js:48
+    545  100.0%    Function: timeExecutions /Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.js:21
+    545  100.0%      Function: <anonymous> /Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.js:38
+    545  100.0%        LazyCompile: process.EventEmitter.emit events:4
+    545  100.0%          Function: parser.onMessageComplete http:99
+    545  100.0%            Function: Client.self.ondata http:635
+
+    225    6.1%  Function: Parser$parseTags /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:205
+    225  100.0%    Function: Parser$parseChunk /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:88
+    225  100.0%      Function: Parser$parseComplete /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:81
+    225  100.0%        Function: timeNodeHtmlParser.testNHP.timeExecutions.testIterations /Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.js:39
+    225  100.0%          Function: timeExecutions /Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.js:21
+    225  100.0%            Function: <anonymous> /Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.js:38
+
+    214    5.8%  _libinfoDSmig_Query_async
+    214  100.0%    node::Loop
+    214  100.0%      LazyCompile: <anonymous> node.js:1
+
+    110    3.0%  Function: Parser$parseChunk /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:88
+    110  100.0%    Function: Parser$parseComplete /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:81
+    110  100.0%      Function: timeNodeHtmlParser.testNHP.timeExecutions.testIterations /Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.js:39
+    110  100.0%        Function: timeExecutions /Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.js:21
+    110  100.0%          Function: <anonymous> /Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.js:38
+    110  100.0%            LazyCompile: process.EventEmitter.emit events:4
+
+     91    2.5%  LazyCompile: test native regexp.js:264
+     89   97.8%    Function: Parser$parseTags /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:205
+     89  100.0%      Function: Parser$parseChunk /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:88
+     89  100.0%        Function: Parser$parseComplete /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:81
+     89  100.0%          Function: timeNodeHtmlParser.testNHP.timeExecutions.testIterations /Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.js:39
+     89  100.0%            Function: timeExecutions /Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.js:21
+      2    2.2%    Function: Parser$parseChunk /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:88
+      2  100.0%      Function: Parser$parseComplete /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:81
+      2  100.0%        Function: timeNodeHtmlParser.testNHP.timeExecutions.testIterations /Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.js:39
+      2  100.0%          Function: timeExecutions /Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.js:21
+      2  100.0%            Function: <anonymous> /Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.js:38
+
+     81    2.2%  Stub: RegExpExecStub
+     38   46.9%    LazyCompile: test native regexp.js:264
+     38  100.0%      Function: Parser$parseTags /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:205
+     38  100.0%        Function: Parser$parseChunk /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:88
+     38  100.0%          Function: Parser$parseComplete /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:81
+     38  100.0%            Function: timeNodeHtmlParser.testNHP.timeExecutions.testIterations /Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.js:39
+     31   38.3%    LazyCompile: exec native regexp.js:186
+     30   96.8%      Function: Parser$parseTagName /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:194
+     30  100.0%        Function: Parser$parseTags /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:205
+     30  100.0%          Function: Parser$parseChunk /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:88
+     30  100.0%            Function: Parser$parseComplete /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:81
+      1    3.2%      Function: Parser$parseAttribs /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:165
+      1  100.0%        Function: Parser$parseTags /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:205
+      1  100.0%          Function: Parser$parseChunk /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:88
+      1  100.0%            Function: Parser$parseComplete /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:81
+     12   14.8%    LazyCompile: DoRegExpExec native regexp.js:117
+     12  100.0%      LazyCompile: splitMatch native string.js:696
+     12  100.0%        LazyCompile: split native string.js:587
+     12  100.0%          Function: Parser$parseAttribs /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:165
+     12  100.0%            Function: Parser$parseTags /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:205
+
+     74    2.0%  v8::internal::String::ReadBlock
+     74  100.0%    Function: timeLibXmlJs.testLXJS.timeExecutions.testIterations /Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.js:48
+     74  100.0%      Function: timeExecutions /Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.js:21
+     74  100.0%        Function: <anonymous> /Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.js:38
+     74  100.0%          LazyCompile: process.EventEmitter.emit events:4
+     74  100.0%            Function: parser.onMessageComplete http:99
+
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/CHANGELOG b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/CHANGELOG
new file mode 100644
index 0000000..c02e8e2
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/CHANGELOG
@@ -0,0 +1,9 @@
+
+v1.5.0
+	* Added DefaultHandler option "enforceEmptyTags" so that XML can be parsed correctly
+
+v1.4.2
+	* Added tests for parsing XML with namespaces
+
+v1.4.1
+	* Added minified version
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/LICENSE b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/LICENSE
new file mode 100644
index 0000000..3196dba
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/LICENSE
@@ -0,0 +1,18 @@
+Copyright 2010, Chris Winberry <chris at winberry.net>. All rights reserved.
+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/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/README.md b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/README.md
new file mode 100644
index 0000000..e81ceb3
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/README.md
@@ -0,0 +1,186 @@
+#NodeHtmlParser
+A forgiving HTML/XML/RSS parser written in JS for both the browser and NodeJS (yes, despite the name it works just fine in any modern browser). The parser can handle streams (chunked data) and supports custom handlers for writing custom DOMs/output.
+
+##Installing
+
+	npm install htmlparser
+
+##Running Tests
+
+###Run tests under node:
+	node runtests.js
+
+###Run tests in browser:
+View runtests.html in any browser
+
+##Usage In Node
+	var htmlparser = require("node-htmlparser");
+	var rawHtml = "Xyz <script language= javascript>var foo = '<<bar>>';< /  script><!--<!-- Waah! -- -->";
+	var handler = new htmlparser.DefaultHandler(function (error, dom) {
+		if (error)
+			[...do something for errors...]
+		else
+			[...parsing done, do something...]
+	});
+	var parser = new htmlparser.Parser(handler);
+	parser.parseComplete(rawHtml);
+	sys.puts(sys.inspect(handler.dom, false, null));
+
+##Usage In Browser
+	var handler = new Tautologistics.NodeHtmlParser.DefaultHandler(function (error, dom) {
+		if (error)
+			[...do something for errors...]
+		else
+			[...parsing done, do something...]
+	});
+	var parser = new Tautologistics.NodeHtmlParser.Parser(handler);
+	parser.parseComplete(document.body.innerHTML);
+	alert(JSON.stringify(handler.dom, null, 2));
+
+##Example output
+	[ { raw: 'Xyz ', data: 'Xyz ', type: 'text' }
+	, { raw: 'script language= javascript'
+	  , data: 'script language= javascript'
+	  , type: 'script'
+	  , name: 'script'
+	  , attribs: { language: 'javascript' }
+	  , children: 
+	     [ { raw: 'var foo = \'<bar>\';<'
+	       , data: 'var foo = \'<bar>\';<'
+	       , type: 'text'
+	       }
+	     ]
+	  }
+	, { raw: '<!-- Waah! -- '
+	  , data: '<!-- Waah! -- '
+	  , type: 'comment'
+	  }
+	]
+
+##Streaming To Parser
+	while (...) {
+		...
+		parser.parseChunk(chunk);
+	}
+	parser.done();	
+
+##Parsing RSS/Atom Feeds
+
+	new htmlparser.RssHandler(function (error, dom) {
+		...
+	});
+
+##DefaultHandler Options
+
+###Usage
+	var handler = new htmlparser.DefaultHandler(
+		  function (error) { ... }
+		, { verbose: false, ignoreWhitespace: true }
+		);
+	
+###Option: ignoreWhitespace
+Indicates whether the DOM should exclude text nodes that consists solely of whitespace. The default value is "false".
+
+####Example: true
+The following HTML:
+	<font>
+		<br>this is the text
+	<font>
+becomes:
+	[ { raw: 'font'
+	  , data: 'font'
+	  , type: 'tag'
+	  , name: 'font'
+	  , children: 
+	     [ { raw: 'br', data: 'br', type: 'tag', name: 'br' }
+	     , { raw: 'this is the text\n'
+	       , data: 'this is the text\n'
+	       , type: 'text'
+	       }
+	     , { raw: 'font', data: 'font', type: 'tag', name: 'font' }
+	     ]
+	  }
+	]
+
+####Example: false
+The following HTML:
+	<font>
+		<br>this is the text
+	<font>
+becomes:
+	[ { raw: 'font'
+	  , data: 'font'
+	  , type: 'tag'
+	  , name: 'font'
+	  , children: 
+	     [ { raw: '\n\t', data: '\n\t', type: 'text' }
+	     , { raw: 'br', data: 'br', type: 'tag', name: 'br' }
+	     , { raw: 'this is the text\n'
+	       , data: 'this is the text\n'
+	       , type: 'text'
+	       }
+	     , { raw: 'font', data: 'font', type: 'tag', name: 'font' }
+	     ]
+	  }
+	]
+
+###Option: verbose
+Indicates whether to include extra information on each node in the DOM. This information consists of the "raw" attribute (original, unparsed text found between "<" and ">") and the "data" attribute on "tag", "script", and "comment" nodes. The default value is "true". 
+
+####Example: true
+The following HTML:
+	<a href="test.html">xxx</a>
+becomes:
+	[ { raw: 'a href="test.html"'
+	  , data: 'a href="test.html"'
+	  , type: 'tag'
+	  , name: 'a'
+	  , attribs: { href: 'test.html' }
+	  , children: [ { raw: 'xxx', data: 'xxx', type: 'text' } ]
+	  }
+	]
+
+####Example: false
+The following HTML:
+	<a href="test.html">xxx</a>
+becomes:
+	[ { type: 'tag'
+	  , name: 'a'
+	  , attribs: { href: 'test.html' }
+	  , children: [ { data: 'xxx', type: 'text' } ]
+	  }
+	]
+
+###Option: enforceEmptyTags
+Indicates whether the DOM should prevent children on tags marked as empty in the HTML spec. Typically this should be set to "true" HTML parsing and "false" for XML parsing. The default value is "true".
+
+####Example: true
+The following HTML:
+	<link>text</link>
+becomes:
+	[ { raw: 'link', data: 'link', type: 'tag', name: 'link' }
+	, { raw: 'text', data: 'text', type: 'text' }
+	]
+
+####Example: false
+The following HTML:
+	<link>text</link>
+becomes:
+	[ { raw: 'link'
+	  , data: 'link'
+	  , type: 'tag'
+	  , name: 'link'
+	  , children: [ { raw: 'text', data: 'text', type: 'text' } ]
+	  }
+	]
+
+##DomUtils
+
+###TBD (see utils_example.js for now)
+
+##Related Projects
+
+Looking for CSS selectors to search the DOM? Try Node-SoupSelect, a port of SoupSelect to NodeJS: http://github.com/harryf/node-soupselect
+
+There's also a port of hpricot to NodeJS that uses node-HtmlParser for HTML parsing: http://github.com/silentrob/Apricot
+
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/json2.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/json2.js
new file mode 100644
index 0000000..a1a3b17
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/json2.js
@@ -0,0 +1,482 @@
+/*
+    http://www.JSON.org/json2.js
+    2010-03-20
+
+    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 */
+
+/*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 () {
+
+    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');
+        };
+    }
+}());
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/lib/node-htmlparser.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/lib/node-htmlparser.js
new file mode 100644
index 0000000..0c7da8c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/lib/node-htmlparser.js
@@ -0,0 +1,772 @@
+/***********************************************
+Copyright 2010, Chris Winberry <chris at winberry.net>. All rights reserved.
+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.
+***********************************************/
+/* v1.6.3 */
+
+(function () {
+
+    function runningInNode () {
+	return(
+	    (typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+	);
+    }
+
+    if (!runningInNode()) {
+	if (!this.Tautologistics)
+	    this.Tautologistics = {};
+	else if (this.Tautologistics.NodeHtmlParser)
+	    return; //NodeHtmlParser already defined!
+	this.Tautologistics.NodeHtmlParser = {};
+	exports = this.Tautologistics.NodeHtmlParser;
+    }
+
+    //Types of elements found in the DOM
+    var ElementType = {
+	Text: "text" //Plain text
+	, Directive: "directive" //Special tag <!...>
+	, Comment: "comment" //Special tag <!--...-->
+	, Script: "script" //Special tag <script>...</script>
+	, Style: "style" //Special tag <style>...</style>
+	, Tag: "tag" //Any tag that isn't special
+    }
+
+    function Parser (handler) {
+	this.validateHandler(handler);
+	this._handler = handler;
+	this.reset();
+    }
+
+    //**"Static"**//
+    //Regular expressions used for cleaning up and parsing (stateless)
+    Parser._reTrim = /(^\s+|\s+$)/g; //Trim leading/trailing whitespace
+    Parser._reTrimComment = /(^\!--|--$)/g; //Remove comment tag markup from comment contents
+    Parser._reWhitespace = /\s/g; //Used to find any whitespace to split on
+    Parser._reTagName = /^\s*(\/?)\s*([^\s\/]+)/; //Used to find the tag name for an element
+
+    //Regular expressions used for parsing (stateful)
+    Parser._reAttrib = //Find attributes in a tag
+	/([^=<>\"\'\s]+)\s*=\s*"([^"]*)"|([^=<>\"\'\s]+)\s*=\s*'([^']*)'|([^=<>\"\'\s]+)\s*=\s*([^'"\s]+)|([^=<>\"\'\s\/]+)/g;
+Parser._reTags = /[\<\>]/g; //Find tag markers
+
+//**Public**//
+//Methods//
+//Parses a complete HTML and pushes it to the handler
+Parser.prototype.parseComplete = function Parser$parseComplete (data) {
+    this.reset();
+    this.parseChunk(data);
+    this.done();
+}
+
+//Parses a piece of an HTML document
+Parser.prototype.parseChunk = function Parser$parseChunk (data) {
+    if (this._done)
+	this.handleError(new Error("Attempted to parse chunk after parsing already done"));
+    this._buffer += data; //FIXME: this can be a bottleneck
+    this.parseTags();
+}
+
+//Tells the parser that the HTML being parsed is complete
+Parser.prototype.done = function Parser$done () {
+    if (this._done)
+	return;
+    this._done = true;
+    
+    //Push any unparsed text into a final element in the element list
+    if (this._buffer.length) {
+	var rawData = this._buffer;
+	this._buffer = "";
+	var element = {
+	    raw: rawData
+	    , data: (this._parseState == ElementType.Text) ? rawData : rawData.replace(Parser._reTrim, "")
+	    , type: this._parseState
+	};
+	if (this._parseState == ElementType.Tag || this._parseState == ElementType.Script || this._parseState == ElementType.Style)
+	    element.name = this.parseTagName(element.data);
+	this.parseAttribs(element);
+	this._elements.push(element);
+    }
+    
+    this.writeHandler();
+    this._handler.done();
+}
+
+//Resets the parser to a blank state, ready to parse a new HTML document
+Parser.prototype.reset = function Parser$reset () {
+    this._buffer = "";
+    this._done = false;
+    this._elements = [];
+    this._elementsCurrent = 0;
+    this._current = 0;
+    this._next = 0;
+    this._parseState = ElementType.Text;
+    this._prevTagSep = '';
+    this._tagStack = [];
+    this._handler.reset();
+}
+
+//**Private**//
+//Properties//
+Parser.prototype._handler = null; //Handler for parsed elements
+Parser.prototype._buffer = null; //Buffer of unparsed data
+Parser.prototype._done = false; //Flag indicating whether parsing is done
+Parser.prototype._elements =  null; //Array of parsed elements
+Parser.prototype._elementsCurrent = 0; //Pointer to last element in _elements that has been processed
+Parser.prototype._current = 0; //Position in data that has already been parsed
+Parser.prototype._next = 0; //Position in data of the next tag marker (<>)
+Parser.prototype._parseState = ElementType.Text; //Current type of element being parsed
+Parser.prototype._prevTagSep = ''; //Previous tag marker found
+//Stack of element types previously encountered; keeps track of when
+//parsing occurs inside a script/comment/style tag
+Parser.prototype._tagStack = null;
+
+//Methods//
+//Takes an array of elements and parses any found attributes
+Parser.prototype.parseTagAttribs = function Parser$parseTagAttribs (elements) {
+    var idxEnd = elements.length;
+    var idx = 0;
+    
+    while (idx < idxEnd) {
+	var element = elements[idx++];
+	if (element.type == ElementType.Tag || element.type == ElementType.Script || element.type == ElementType.style)
+	    this.parseAttribs(element);
+    }
+    
+    return(elements);
+}
+
+//Takes an element and adds an "attribs" property for any element attributes found 
+Parser.prototype.parseAttribs = function Parser$parseAttribs (element) {
+    //Only parse attributes for tags
+    if (element.type != ElementType.Script && element.type != ElementType.Style && element.type != ElementType.Tag)
+	return;
+    
+    var tagName = element.data.split(Parser._reWhitespace, 1)[0];
+    var attribRaw = element.data.substring(tagName.length);
+    if (attribRaw.length < 1)
+	return;
+    
+    var match;
+    Parser._reAttrib.lastIndex = 0;
+    while (match = Parser._reAttrib.exec(attribRaw)) {
+	if (element.attribs == undefined)
+	    element.attribs = {};
+	
+	if (typeof match[1] == "string" && match[1].length) {
+	    element.attribs[match[1]] = match[2];
+	} else if (typeof match[3] == "string" && match[3].length) {
+	    element.attribs[match[3].toString()] = match[4].toString();
+	} else if (typeof match[5] == "string" && match[5].length) {
+	    element.attribs[match[5]] = match[6];
+	} else if (typeof match[7] == "string" && match[7].length) {
+	    element.attribs[match[7]] = match[7];
+	}
+    }
+}
+
+//Extracts the base tag name from the data value of an element
+Parser.prototype.parseTagName = function Parser$parseTagName (data) {
+    if (data == null || data == "")
+	return("");
+    var match = Parser._reTagName.exec(data);
+    if (!match)
+	return("");
+    return((match[1] ? "/" : "") + match[2]);
+}
+
+//Parses through HTML text and returns an array of found elements
+//I admit, this function is rather large but splitting up had an noticeable impact on speed
+Parser.prototype.parseTags = function Parser$parseTags () {
+    var bufferEnd = this._buffer.length - 1;
+    while (Parser._reTags.test(this._buffer)) {
+	this._next = Parser._reTags.lastIndex - 1;
+	var tagSep = this._buffer.charAt(this._next); //The currently found tag marker
+	var rawData = this._buffer.substring(this._current, this._next); //The next chunk of data to parse
+	
+	//A new element to eventually be appended to the element list
+	var element = {
+	    raw: rawData
+	    , data: (this._parseState == ElementType.Text) ? rawData : rawData.replace(Parser._reTrim, "")
+	    , type: this._parseState
+	};
+	
+	var elementName = this.parseTagName(element.data);
+	
+	//This section inspects the current tag stack and modifies the current
+	//element if we're actually parsing a special area (script/comment/style tag)
+	if (this._tagStack.length) { //We're parsing inside a script/comment/style tag
+	    if (this._tagStack[this._tagStack.length - 1] == ElementType.Script) { //We're currently in a script tag
+		if (elementName == "/script") //Actually, we're no longer in a script tag, so pop it off the stack
+		    this._tagStack.pop();
+		else { //Not a closing script tag
+		    if (element.raw.indexOf("!--") != 0) { //Make sure we're not in a comment
+			//All data from here to script close is now a text element
+			element.type = ElementType.Text;
+			//If the previous element is text, append the current text to it
+			if (this._elements.length && this._elements[this._elements.length - 1].type == ElementType.Text) {
+			    var prevElement = this._elements[this._elements.length - 1];
+			    prevElement.raw = prevElement.data = prevElement.raw + this._prevTagSep + element.raw;
+			    element.raw = element.data = ""; //This causes the current element to not be added to the element list
+			}
+		    }
+		}
+	    }
+	    else if (this._tagStack[this._tagStack.length - 1] == ElementType.Style) { //We're currently in a style tag
+		if (elementName == "/style") //Actually, we're no longer in a style tag, so pop it off the stack
+		    this._tagStack.pop();
+		else {
+		    if (element.raw.indexOf("!--") != 0) { //Make sure we're not in a comment
+			//All data from here to style close is now a text element
+			element.type = ElementType.Text;
+			//If the previous element is text, append the current text to it
+			if (this._elements.length && this._elements[this._elements.length - 1].type == ElementType.Text) {
+			    if (element.raw != "") {
+				var prevElement = this._elements[this._elements.length - 1];
+				prevElement.raw = prevElement.data = prevElement.raw + this._prevTagSep + element.raw;
+				element.raw = element.data = ""; //This causes the current element to not be added to the element list
+			    }
+			    else{ //Element is empty, so just append the last tag marker found
+				if (prevElement) {
+				    prevElement.raw = prevElement.data = prevElement.raw + this._prevTagSep;
+				}
+			    }
+			}
+			else //The previous element was not text
+			    if (element.raw != "")
+				element.raw = element.data = element.raw;
+		    }
+		}
+	    }
+	    else if (this._tagStack[this._tagStack.length - 1] == ElementType.Comment) { //We're currently in a comment tag
+		var rawLen = element.raw.length;
+		if (element.raw.charAt(rawLen - 2) == "-" && element.raw.charAt(rawLen - 1) == "-" && tagSep == ">") {
+		    //Actually, we're no longer in a style tag, so pop it off the stack
+		    this._tagStack.pop();
+		    //If the previous element is a comment, append the current text to it
+		    if (this._elements.length && this._elements[this._elements.length - 1].type == ElementType.Comment) {
+			var prevElement = this._elements[this._elements.length - 1];
+			prevElement.raw = prevElement.data = (prevElement.raw + element.raw).replace(Parser._reTrimComment, "");
+			element.raw = element.data = ""; //This causes the current element to not be added to the element list
+			element.type = ElementType.Text;
+		    }
+		    else //Previous element not a comment
+			element.type = ElementType.Comment; //Change the current element's type to a comment
+		}
+		else { //Still in a comment tag
+		    element.type = ElementType.Comment;
+		    //If the previous element is a comment, append the current text to it
+		    if (this._elements.length && this._elements[this._elements.length - 1].type == ElementType.Comment) {
+			var prevElement = this._elements[this._elements.length - 1];
+			prevElement.raw = prevElement.data = prevElement.raw + element.raw + tagSep;
+			element.raw = element.data = ""; //This causes the current element to not be added to the element list
+			element.type = ElementType.Text;
+		    }
+		    else
+			element.raw = element.data = element.raw + tagSep;
+		}
+	    }
+	}
+	
+	//Processing of non-special tags
+	if (element.type == ElementType.Tag) {
+	    element.name = elementName;
+	    
+	    if (element.raw.indexOf("!--") == 0) { //This tag is really comment
+		element.type = ElementType.Comment;
+		delete element["name"];
+		var rawLen = element.raw.length;
+		//Check if the comment is terminated in the current element
+		if (element.raw.charAt(rawLen - 1) == "-" && element.raw.charAt(rawLen - 2) == "-" && tagSep == ">")
+		    element.raw = element.data = element.raw.replace(Parser._reTrimComment, "");
+		else { //It's not so push the comment onto the tag stack
+		    element.raw += tagSep;
+		    this._tagStack.push(ElementType.Comment);
+		}
+	    }
+	    else if (element.raw.indexOf("!") == 0 || element.raw.indexOf("?") == 0) {
+		element.type = ElementType.Directive;
+		//TODO: what about CDATA?
+	    }
+	    else if (element.name == "script") {
+		element.type = ElementType.Script;
+		//Special tag, push onto the tag stack if not terminated
+		if (element.data.charAt(element.data.length - 1) != "/")
+		    this._tagStack.push(ElementType.Script);
+	    }
+	    else if (element.name == "/script")
+		element.type = ElementType.Script;
+	    else if (element.name == "style") {
+		element.type = ElementType.Style;
+		//Special tag, push onto the tag stack if not terminated
+		if (element.data.charAt(element.data.length - 1) != "/")
+		    this._tagStack.push(ElementType.Style);
+	    }
+	    else if (element.name == "/style")
+		element.type = ElementType.Style;
+	    if (element.name && element.name.charAt(0) == "/")
+		element.data = element.name;
+	}
+	
+	//Add all tags and non-empty text elements to the element list
+	if (element.raw != "" || element.type != ElementType.Text) {
+	    this.parseAttribs(element);
+	    this._elements.push(element);
+	    //If tag self-terminates, add an explicit, separate closing tag
+	    if (
+		element.type != ElementType.Text
+		    &&
+		    element.type != ElementType.Comment
+		    &&
+		    element.type != ElementType.Directive
+		    &&
+		    element.data.charAt(element.data.length - 1) == "/"
+	    )
+		this._elements.push({
+		    raw: "/" + element.name
+		    , data: "/" + element.name
+		    , name: "/" + element.name
+		    , type: element.type
+		});
+	}
+	this._parseState = (tagSep == "<") ? ElementType.Tag : ElementType.Text;
+	this._current = this._next + 1;
+	this._prevTagSep = tagSep;
+    }
+    
+    this._buffer = (this._current <= bufferEnd) ? this._buffer.substring(this._current) : "";
+    this._current = 0;
+    
+    this.writeHandler();
+}
+
+//Checks the handler to make it is an object with the right "interface"
+Parser.prototype.validateHandler = function Parser$validateHandler (handler) {
+    if ((typeof handler) != "object")
+	throw new Error("Handler is not an object");
+    if ((typeof handler.reset) != "function")
+	throw new Error("Handler method 'reset' is invalid");
+    if ((typeof handler.done) != "function")
+	throw new Error("Handler method 'done' is invalid");
+    if ((typeof handler.writeTag) != "function")
+	throw new Error("Handler method 'writeTag' is invalid");
+    if ((typeof handler.writeText) != "function")
+	throw new Error("Handler method 'writeText' is invalid");
+    if ((typeof handler.writeComment) != "function")
+	throw new Error("Handler method 'writeComment' is invalid");
+    if ((typeof handler.writeDirective) != "function")
+	throw new Error("Handler method 'writeDirective' is invalid");
+}
+
+//Writes parsed elements out to the handler
+Parser.prototype.writeHandler = function Parser$writeHandler (forceFlush) {
+    forceFlush = !!forceFlush;
+    if (this._tagStack.length && !forceFlush)
+	return;
+    while (this._elements.length) {
+	var element = this._elements.shift();
+	switch (element.type) {
+	case ElementType.Comment:
+	    this._handler.writeComment(element);
+	    break;
+	case ElementType.Directive:
+	    this._handler.writeDirective(element);
+	    break;
+	case ElementType.Text:
+	    this._handler.writeText(element);
+	    break;
+	default:
+	    this._handler.writeTag(element);
+	    break;
+	}
+    }
+}
+
+Parser.prototype.handleError = function Parser$handleError (error) {
+    if ((typeof this._handler.error) == "function")
+	this._handler.error(error);
+    else
+	throw error;
+}
+
+//TODO: make this a trully streamable handler
+function RssHandler (callback) {
+    RssHandler.super_.call(this, callback, { ignoreWhitespace: true, verbose: false, enforceEmptyTags: false });
+}
+inherits(RssHandler, DefaultHandler);
+
+RssHandler.prototype.done = function RssHandler$done () {
+    var feed = { };
+    var feedRoot;
+
+    var found = DomUtils.getElementsByTagName(function (value) { return(value == "rss" || value == "feed"); }, this.dom, false);
+    if (found.length) {
+	feedRoot = found[0];
+    }
+    if (feedRoot) {
+	if (feedRoot.name == "rss") {
+	    feed.type = "rss";
+	    feedRoot = feedRoot.children[0]; //<channel/>
+	    feed.id = "";
+	    try {
+		feed.title = DomUtils.getElementsByTagName("title", feedRoot.children, false)[0].children[0].data;
+	    } catch (ex) { }
+	    try {
+		feed.link = DomUtils.getElementsByTagName("link", feedRoot.children, false)[0].children[0].data;
+	    } catch (ex) { }
+	    try {
+		feed.description = DomUtils.getElementsByTagName("description", feedRoot.children, false)[0].children[0].data;
+	    } catch (ex) { }
+	    try {
+		feed.updated = new Date(DomUtils.getElementsByTagName("lastBuildDate", feedRoot.children, false)[0].children[0].data);
+	    } catch (ex) { }
+	    try {
+		feed.author = DomUtils.getElementsByTagName("managingEditor", feedRoot.children, false)[0].children[0].data;
+	    } catch (ex) { }
+	    feed.items = [];
+	    DomUtils.getElementsByTagName("item", feedRoot.children).forEach(function (item, index, list) {
+		var entry = {};
+		try {
+		    entry.id = DomUtils.getElementsByTagName("guid", item.children, false)[0].children[0].data;
+		} catch (ex) { }
+		try {
+		    entry.title = DomUtils.getElementsByTagName("title", item.children, false)[0].children[0].data;
+		} catch (ex) { }
+		try {
+		    entry.link = DomUtils.getElementsByTagName("link", item.children, false)[0].children[0].data;
+		} catch (ex) { }
+		try {
+		    entry.description = DomUtils.getElementsByTagName("description", item.children, false)[0].children[0].data;
+		} catch (ex) { }
+		try {
+		    entry.pubDate = new Date(DomUtils.getElementsByTagName("pubDate", item.children, false)[0].children[0].data);
+		} catch (ex) { }
+		feed.items.push(entry);
+	    });
+	} else {
+	    feed.type = "atom";
+	    try {
+		feed.id = DomUtils.getElementsByTagName("id", feedRoot.children, false)[0].children[0].data;
+	    } catch (ex) { }
+	    try {
+		feed.title = DomUtils.getElementsByTagName("title", feedRoot.children, false)[0].children[0].data;
+	    } catch (ex) { }
+	    try {
+		feed.link = DomUtils.getElementsByTagName("link", feedRoot.children, false)[0].attribs.href;
+	    } catch (ex) { }
+	    try {
+		feed.description = DomUtils.getElementsByTagName("subtitle", feedRoot.children, false)[0].children[0].data;
+	    } catch (ex) { }
+	    try {
+		feed.updated = new Date(DomUtils.getElementsByTagName("updated", feedRoot.children, false)[0].children[0].data);
+	    } catch (ex) { }
+	    try {
+		feed.author = DomUtils.getElementsByTagName("email", feedRoot.children, true)[0].children[0].data;
+	    } catch (ex) { }
+	    feed.items = [];
+	    DomUtils.getElementsByTagName("entry", feedRoot.children).forEach(function (item, index, list) {
+		var entry = {};
+		try {
+		    entry.id = DomUtils.getElementsByTagName("id", item.children, false)[0].children[0].data;
+		} catch (ex) { }
+		try {
+		    entry.title = DomUtils.getElementsByTagName("title", item.children, false)[0].children[0].data;
+		} catch (ex) { }
+		try {
+		    entry.link = DomUtils.getElementsByTagName("link", item.children, false)[0].attribs.href;
+		} catch (ex) { }
+		try {
+		    entry.description = DomUtils.getElementsByTagName("summary", item.children, false)[0].children[0].data;
+		} catch (ex) { }
+		try {
+		    entry.pubDate = new Date(DomUtils.getElementsByTagName("updated", item.children, false)[0].children[0].data);
+		} catch (ex) { }
+		feed.items.push(entry);
+	    });
+	}
+
+	this.dom = feed;
+    }
+    RssHandler.super_.prototype.done.call(this);
+}
+
+///////////////////////////////////////////////////
+
+function DefaultHandler (callback, options) {
+    this.reset();
+    this._options = options ? options : { };
+    if (this._options.ignoreWhitespace == undefined)
+	this._options.ignoreWhitespace = false; //Keep whitespace-only text nodes
+    if (this._options.verbose == undefined)
+	this._options.verbose = true; //Keep data property for tags and raw property for all
+    if (this._options.enforceEmptyTags == undefined)
+	this._options.enforceEmptyTags = true; //Don't allow children for HTML tags defined as empty in spec
+    if ((typeof callback) == "function")
+	this._callback = callback;
+}
+
+//**"Static"**//
+//HTML Tags that shouldn't contain child nodes
+DefaultHandler._emptyTags = {
+    area: 1
+    , base: 1
+    , basefont: 1
+    , br: 1
+    , col: 1
+    , frame: 1
+    , hr: 1
+    , img: 1
+    , input: 1
+    , isindex: 1
+    , link: 1
+    , meta: 1
+    , param: 1
+    , embed: 1
+}
+//Regex to detect whitespace only text nodes
+DefaultHandler.reWhitespace = /^\s*$/;
+
+//**Public**//
+//Properties//
+DefaultHandler.prototype.dom = null; //The hierarchical object containing the parsed HTML
+//Methods//
+//Resets the handler back to starting state
+DefaultHandler.prototype.reset = function DefaultHandler$reset() {
+    this.dom = [];
+    this._done = false;
+    this._tagStack = [];
+    this._tagStack.last = function DefaultHandler$_tagStack$last () {
+	return(this.length ? this[this.length - 1] : null);
+    }
+}
+//Signals the handler that parsing is done
+DefaultHandler.prototype.done = function DefaultHandler$done () {
+    this._done = true;
+    this.handleCallback(null);
+}
+DefaultHandler.prototype.writeTag = function DefaultHandler$writeTag (element) {
+    this.handleElement(element);
+} 
+DefaultHandler.prototype.writeText = function DefaultHandler$writeText (element) {
+    if (this._options.ignoreWhitespace)
+	if (DefaultHandler.reWhitespace.test(element.data))
+	    return;
+    this.handleElement(element);
+} 
+DefaultHandler.prototype.writeComment = function DefaultHandler$writeComment (element) {
+    this.handleElement(element);
+} 
+DefaultHandler.prototype.writeDirective = function DefaultHandler$writeDirective (element) {
+    this.handleElement(element);
+}
+DefaultHandler.prototype.error = function DefaultHandler$error (error) {
+    this.handleCallback(error);
+}
+
+//**Private**//
+//Properties//
+DefaultHandler.prototype._options = null; //Handler options for how to behave
+DefaultHandler.prototype._callback = null; //Callback to respond to when parsing done
+DefaultHandler.prototype._done = false; //Flag indicating whether handler has been notified of parsing completed
+DefaultHandler.prototype._tagStack = null; //List of parents to the currently element being processed
+//Methods//
+DefaultHandler.prototype.handleCallback = function DefaultHandler$handleCallback (error) {
+    if ((typeof this._callback) != "function")
+	if (error)
+	    throw error;
+    else
+	return;
+    this._callback(error, this.dom);
+}
+DefaultHandler.prototype.handleElement = function DefaultHandler$handleElement (element) {
+    if (this._done)
+	this.handleCallback(new Error("Writing to the handler after done() called is not allowed without a reset()"));
+    if (!this._options.verbose) {
+	//			element.raw = null; //FIXME: Not clean
+	//FIXME: Serious performance problem using delete
+	delete element.raw;
+	if (element.type == "tag" || element.type == "script" || element.type == "style")
+	    delete element.data;
+    }
+    if (!this._tagStack.last()) { //There are no parent elements
+	//If the element can be a container, add it to the tag stack and the top level list
+	if (element.type != ElementType.Text && element.type != ElementType.Comment && element.type != ElementType.Directive) {
+	    if (element.name.charAt(0) != "/") { //Ignore closing tags that obviously don't have an opening tag
+		this.dom.push(element);
+		if (!this._options.enforceEmptyTags || !DefaultHandler._emptyTags[element.name]) { //Don't add tags to the tag stack that can't have children
+		    this._tagStack.push(element);
+		}
+	    }
+	}
+	else //Otherwise just add to the top level list
+	    this.dom.push(element);
+    }
+    else { //There are parent elements
+	//If the element can be a container, add it as a child of the element
+	//on top of the tag stack and then add it to the tag stack
+	if (element.type != ElementType.Text && element.type != ElementType.Comment && element.type != ElementType.Directive) {
+	    if (element.name.charAt(0) == "/") {
+		//This is a closing tag, scan the tagStack to find the matching opening tag
+		//and pop the stack up to the opening tag's parent
+		var baseName = element.name.substring(1);
+		if (!this._options.enforceEmptyTags || !DefaultHandler._emptyTags[baseName]) {
+		    var pos = this._tagStack.length - 1;
+		    while (pos > -1 && this._tagStack[pos--].name != baseName) { }
+		    if (pos > -1 || this._tagStack[0].name == baseName)
+			while (pos < this._tagStack.length - 1)
+			    this._tagStack.pop();
+		}
+	    }
+	    else { //This is not a closing tag
+		if (!this._tagStack.last().children)
+		    this._tagStack.last().children = [];
+		this._tagStack.last().children.push(element);
+		if (!this._options.enforceEmptyTags || !DefaultHandler._emptyTags[element.name]) //Don't add tags to the tag stack that can't have children
+		    this._tagStack.push(element);
+	    }
+	}
+	else { //This is not a container element
+	    if (!this._tagStack.last().children)
+		this._tagStack.last().children = [];
+	    this._tagStack.last().children.push(element);
+	}
+    }
+}
+
+var DomUtils = {
+    testElement: function DomUtils$testElement (options, element) {
+	if (!element) {
+	    return false;
+	}
+	
+	for (var key in options) {
+	    if (key == "tag_name") {
+		if (element.type != "tag" && element.type != "script" && element.type != "style") {
+		    return false;
+		}
+		if (!options["tag_name"](element.name)) {
+		    return false;
+		}
+	    } else if (key == "tag_type") {
+		if (!options["tag_type"](element.type)) {
+		    return false;
+		}
+	    } else if (key == "tag_contains") {
+		if (element.type != "text" && element.type != "comment" && element.type != "directive") {
+		    return false;
+		}
+		if (!options["tag_contains"](element.data)) {
+		    return false;
+		}
+	    } else {
+		if (!element.attribs || !options[key](element.attribs[key])) {
+		    return false;
+		}
+	    }
+	}
+	
+	return true;
+    }
+    
+    , getElements: function DomUtils$getElements (options, currentElement, recurse, limit) {
+	recurse = (recurse === undefined || recurse === null) || !!recurse;
+	limit = isNaN(parseInt(limit)) ? -1 : parseInt(limit);
+
+	if (!currentElement) {
+	    return([]);
+	}
+	
+	var found = [];
+	var elementList;
+
+	function getTest (checkVal) {
+	    return(function (value) { return(value == checkVal); });
+	}
+	for (var key in options) {
+	    if ((typeof options[key]) != "function") {
+		options[key] = getTest(options[key]);
+	    }
+	}
+	
+	if (DomUtils.testElement(options, currentElement)) {
+	    found.push(currentElement);
+	}
+
+	if (limit >= 0 && found.length >= limit) {
+	    return(found);
+	}
+
+	if (recurse && currentElement.children) {
+	    elementList = currentElement.children;
+	} else if (currentElement instanceof Array) {
+	    elementList = currentElement;
+	} else {
+	    return(found);
+	}
+	
+	for (var i = 0; i < elementList.length; i++) {
+	    found = found.concat(DomUtils.getElements(options, elementList[i], recurse, limit));
+	    if (limit >= 0 && found.length >= limit) {
+		break;
+	    }
+	}
+	
+	return(found);
+    }
+    
+    , getElementById: function DomUtils$getElementById (id, currentElement, recurse) {
+	var result = DomUtils.getElements({ id: id }, currentElement, recurse, 1);
+	return(result.length ? result[0] : null);
+    }
+    
+    , getElementsByTagName: function DomUtils$getElementsByTagName (name, currentElement, recurse, limit) {
+	return(DomUtils.getElements({ tag_name: name }, currentElement, recurse, limit));
+    }
+    
+    , getElementsByTagType: function DomUtils$getElementsByTagType (type, currentElement, recurse, limit) {
+	return(DomUtils.getElements({ tag_type: type }, currentElement, recurse, limit));
+    }
+}
+
+function inherits (ctor, superCtor) {
+    var tempCtor = function(){};
+    tempCtor.prototype = superCtor.prototype;
+    ctor.super_ = superCtor;
+    ctor.prototype = new tempCtor();
+    ctor.prototype.constructor = ctor;
+}
+
+exports.Parser = Parser;
+
+exports.DefaultHandler = DefaultHandler;
+
+exports.RssHandler = RssHandler;
+
+exports.ElementType = ElementType;
+
+exports.DomUtils = DomUtils;
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/lib/node-htmlparser.min.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/lib/node-htmlparser.min.js
new file mode 100644
index 0000000..5ab1e72
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/lib/node-htmlparser.min.js
@@ -0,0 +1,22 @@
+/***********************************************
+Copyright 2010, Chris Winberry <chris at winberry.net>. All rights reserved.
+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.
+***********************************************/
+/* v1.6.3 */
+(function(){function e(a){this.validateHandler(a);this._handler=a;this.reset()}function n(a){n.super_.call(this,a,{ignoreWhitespace:true,verbose:false,enforceEmptyTags:false})}function g(a,c){this.reset();this._options=c?c:{};if(this._options.ignoreWhitespace==undefined)this._options.ignoreWhitespace=false;if(this._options.verbose==undefined)this._options.verbose=true;if(this._options.enforceEmptyTags==undefined)this._options.enforceEmptyTags=true;if(typeof a=="function")this._callback=a [...]
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/package.json b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/package.json
new file mode 100644
index 0000000..ced4c0a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/package.json
@@ -0,0 +1,23 @@
+{
+	  "name": "htmlparser"
+	, "description": "Forgiving HTML/XML/RSS Parser in JS for *both* Node and Browsers"
+	, "version": "1.6.2"
+	, "author": "Chris Winberry <chris at winberry.net>"
+	, "contributors": []
+	, "repository": {
+		  "type": "git"
+		, "url": "git://github.com/tautologistics/node-htmlparser.git"
+	}
+	, "bugs": {
+		  "mail": "chris at winberry.net"
+		, "web": "http://github.com/tautologistics/node-htmlparser/issues"
+	}
+	, "os": [ "linux", "darwin", "freebsd" ]
+	, "directories": { "lib": "./lib/" }
+	, "main": "./lib/node-htmlparser"
+	, "engines": { "node": ">=0.1.33" }
+	, "licenses": [{
+		  "type": "MIT"
+		, "url": "http://github.com/tautologistics/node-htmlparser/raw/master/LICENSE"
+	}]
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/profile.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/profile.js
new file mode 100644
index 0000000..c5a474e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/profile.js
@@ -0,0 +1,63 @@
+//node --prof --prof_auto profile.js
+//deps/v8/tools/mac-tick-processor v8.log
+var sys = require("sys");
+var fs = require("fs");
+var http = require("http");
+var htmlparser = require("./node-htmlparser");
+var libxml = require('./libxmljs');
+
+var testNHP = true; //Should node-htmlparser be exercised?
+var testLXJS = true; //Should libxmljs be exercised?
+var testIterations = 100; //Number of test loops to run
+
+var testHost = "nodejs.org"; //Host to fetch test HTML from
+var testPort = 80; //Port on host to fetch test HTML from
+var testPath = "/api.html"; //Path on host to fetch HTML from
+
+function getMillisecs () {
+	return((new Date()).getTime());
+}
+
+function timeExecutions (loops, func) {
+	var start = getMillisecs();
+
+	while (loops--)
+		func();
+
+	return(getMillisecs() - start);
+}
+
+var html = "";
+http.createClient(testPort, testHost)
+	.request("GET", testPath, { host: testHost })
+	.addListener("response", function (response) {
+		if (response.statusCode == "200") {
+			response.setEncoding("utf8");
+			response.addListener("data", function (chunk) {
+				html += chunk;
+			}).addListener("end", function() {
+				var timeNodeHtmlParser = !testNHP ? 0 : timeExecutions(testIterations, function () {
+					var handler = new htmlparser.DefaultHandler(function(err, dom) {
+						if (err)
+							sys.debug("Error: " + err);
+					});
+					var parser = new htmlparser.Parser(handler);
+					parser.parseComplete(html);
+				})
+				
+				var timeLibXmlJs = !testLXJS ? 0 : timeExecutions(testIterations, function () {
+					var dom = libxml.parseHtmlString(html);
+				})
+
+				if (testNHP)
+					sys.debug("NodeHtmlParser: "  + timeNodeHtmlParser);
+				if (testLXJS)
+					sys.debug("LibXmlJs: "  + timeLibXmlJs);
+				if (testNHP && testLXJS)
+					sys.debug("Difference: " + ((timeNodeHtmlParser - timeLibXmlJs) / timeLibXmlJs) * 100);
+			});
+		}
+		else
+			sys.debug("Error: got response status " + response.statusCode);
+	})
+	.end();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/runtests.html b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/runtests.html
new file mode 100644
index 0000000..3543adc
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/runtests.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+	<head>
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<title>Node.js HTML Parser</title>
+		<style type="text/css">
+			.good {
+				color: #363;
+			}
+			.bad {
+				color: #633;
+				font-style: italic;
+			}
+		</style>
+		<script language="JavaScript">
+			if ((typeof JSON) != "object") {
+				var head = document.getElementsByTagName("head")[0];
+				var script = document.createElement('script');
+				script.type = "text/javascript";
+				script.src = "json2.js";
+				head.insertBefore(script, head.firstChild)
+			}
+		</script>
+		<script language="JavaScript" src="lib/node-htmlparser.js"></script>
+		<script language="JavaScript" src="tests/01-basic.js"></script>
+		<script language="JavaScript" src="tests/02-single_tag_1.js"></script>
+		<script language="JavaScript" src="tests/03-single_tag_2.js"></script>
+		<script language="JavaScript" src="tests/04-unescaped_in_script.js"></script>
+		<script language="JavaScript" src="tests/05-tags_in_comment.js"></script>
+		<script language="JavaScript" src="tests/06-comment_in_script.js"></script>
+		<script language="JavaScript" src="tests/07-unescaped_in_style.js"></script>
+		<script language="JavaScript" src="tests/08-extra_spaces_in_tag.js"></script>
+		<script language="JavaScript" src="tests/09-unquoted_attrib.js"></script>
+		<script language="JavaScript" src="tests/10-singular_attribute.js"></script>
+		<script language="JavaScript" src="tests/11-text_outside_tags.js"></script>
+		<script language="JavaScript" src="tests/12-text_only.js"></script>
+		<script language="JavaScript" src="tests/13-comment_in_text.js"></script>
+		<script language="JavaScript" src="tests/14-comment_in_text_in_script.js"></script>
+		<script language="JavaScript" src="tests/15-non-verbose.js"></script>
+		<script language="JavaScript" src="tests/16-ignore_whitespace.js"></script>
+		<script language="JavaScript" src="tests/17-xml_namespace.js"></script>
+		<script language="JavaScript" src="tests/18-enforce_empty_tags.js"></script>
+		<script language="JavaScript" src="tests/19-ignore_empty_tags.js"></script>
+		<script language="JavaScript" src="tests/20-rss.js"></script>
+		<script language="JavaScript" src="tests/21-atom.js"></script>
+		<!-- //TODO: dynamic loading of test files -->
+	</head>
+	<body style="font-size: small; font-family:Arial, Helvetica, sans-serif;">
+
+		<script language="JavaScript">
+			var chunkSize = 5;
+			var testCount = 0;
+			var failedCount = 0;
+			while (Tautologistics.NodeHtmlParser.Tests.length) {
+				testCount++;
+				var test = Tautologistics.NodeHtmlParser.Tests.shift();
+				try {
+					var handlerCallback = function handlerCallback (error) {
+						if (error)
+							document.write("<hr>Handler error: " + error + "<hr>");
+					}
+					var handler = (test.type == "rss") ?
+						new Tautologistics.NodeHtmlParser.RssHandler(handlerCallback, test.options)
+						:
+						new Tautologistics.NodeHtmlParser.DefaultHandler(handlerCallback, test.options)
+						;
+					var parser = new Tautologistics.NodeHtmlParser.Parser(handler);
+					document.write("<b>" + test.name + "</b>: ");
+					parser.parseComplete(test.html);
+					var resultComplete = handler.dom;
+					var chunkPos = 0;
+					parser.reset();
+					while (chunkPos < test.html.length) {
+						parser.parseChunk(test.html.substring(chunkPos, chunkPos + chunkSize));
+						chunkPos += chunkSize;
+					}
+					parser.done();
+					var resultChunk = handler.dom;
+					var testResult =
+						JSON.stringify(resultComplete).toString() === JSON.stringify(test.expected).toString()
+						&&
+						JSON.stringify(resultChunk).toString() === JSON.stringify(test.expected).toString()
+						;
+					document.write(testResult ? "<font class='good'>passed</font>" : "<font class='bad'>FAILED</font>");
+					if (!testResult) {
+						failedCount++;
+						document.write("<pre>");
+						document.write("<b>Complete</b>\n");
+						document.write(JSON.stringify(resultComplete, null, 2));
+						document.write("<b>Chunked</b>\n");
+						document.write(JSON.stringify(resultChunk, null, 2));
+						document.write("<h2>Expected</h2>\n");
+						document.write(JSON.stringify(test.expected, null, 2));
+						document.write("</pre>");
+					}
+				} catch (ex) {
+					document.write("<h1>Exception occured during test: " + ex + "</h1>")
+				}
+				document.write("<br>");
+			}
+			document.write("<hr>");
+			document.write("Total tests: " + testCount + "<br>");
+			document.write("Failed tests: " + failedCount + "<br>");
+		</script>
+	
+	</body>
+</html>
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/runtests.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/runtests.js
new file mode 100644
index 0000000..c59393c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/runtests.js
@@ -0,0 +1,75 @@
+/***********************************************
+Copyright 2010, Chris Winberry <chris at winberry.net>. All rights reserved.
+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.
+***********************************************/
+
+var sys = require("sys");
+var fs = require("fs");
+var htmlparser = require("./lib/node-htmlparser");
+
+var testFolder = "./tests";
+var chunkSize = 5;
+
+var testFiles = fs.readdirSync(testFolder);
+var testCount = 0;
+var failedCount = 0;
+for (var i in testFiles) {
+	testCount++;
+	var fileParts = testFiles[i].split(".");
+	fileParts.pop();
+	var moduleName = fileParts.join(".");
+	var test = require(testFolder + "/" + moduleName);
+	var handlerCallback = function handlerCallback (error) {
+		if (error)
+			sys.puts("Handler error: " + error);
+	}
+	var handler = (test.type == "rss") ?
+		new htmlparser.RssHandler(handlerCallback, test.options)
+		:
+		new htmlparser.DefaultHandler(handlerCallback, test.options)
+		;
+	var parser = new htmlparser.Parser(handler);
+	parser.parseComplete(test.html);
+	var resultComplete = handler.dom;
+	var chunkPos = 0;
+	parser.reset();
+	while (chunkPos < test.html.length) {
+		parser.parseChunk(test.html.substring(chunkPos, chunkPos + chunkSize));
+		chunkPos += chunkSize;
+	}
+	parser.done();
+	var resultChunk = handler.dom;
+	var testResult =
+		sys.inspect(resultComplete, false, null) === sys.inspect(test.expected, false, null)
+		&&
+		sys.inspect(resultChunk, false, null) === sys.inspect(test.expected, false, null)
+		;
+	sys.puts("[" + test.name + "\]: " + (testResult ? "passed" : "FAILED"));
+	if (!testResult) {
+		failedCount++;
+		sys.puts("== Complete ==");
+		sys.puts(sys.inspect(resultComplete, false, null));
+		sys.puts("== Chunked ==");
+		sys.puts(sys.inspect(resultChunk, false, null));
+		sys.puts("== Expected ==");
+		sys.puts(sys.inspect(test.expected, false, null));
+	}
+}
+sys.puts("Total tests: " + testCount);
+sys.puts("Failed tests: " + failedCount);
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/runtests.min.html b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/runtests.min.html
new file mode 100644
index 0000000..2ec9e8f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/runtests.min.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+	<head>
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<title>Node.js HTML Parser</title>
+		<style type="text/css">
+			.good {
+				color: #363;
+			}
+			.bad {
+				color: #633;
+				font-style: italic;
+			}
+		</style>
+		<script language="JavaScript">
+			if ((typeof JSON) != "object") {
+				var head = document.getElementsByTagName("head")[0];
+				var script = document.createElement('script');
+				script.type = "text/javascript";
+				script.src = "json2.js";
+				head.insertBefore(script, head.firstChild)
+			}
+		</script>
+		<script language="JavaScript" src="lib/node-htmlparser.min.js"></script>
+		<script language="JavaScript" src="tests/01-basic.js"></script>
+		<script language="JavaScript" src="tests/02-single_tag_1.js"></script>
+		<script language="JavaScript" src="tests/03-single_tag_2.js"></script>
+		<script language="JavaScript" src="tests/04-unescaped_in_script.js"></script>
+		<script language="JavaScript" src="tests/05-tags_in_comment.js"></script>
+		<script language="JavaScript" src="tests/06-comment_in_script.js"></script>
+		<script language="JavaScript" src="tests/07-unescaped_in_style.js"></script>
+		<script language="JavaScript" src="tests/08-extra_spaces_in_tag.js"></script>
+		<script language="JavaScript" src="tests/09-unquoted_attrib.js"></script>
+		<script language="JavaScript" src="tests/10-singular_attribute.js"></script>
+		<script language="JavaScript" src="tests/11-text_outside_tags.js"></script>
+		<script language="JavaScript" src="tests/12-text_only.js"></script>
+		<script language="JavaScript" src="tests/13-comment_in_text.js"></script>
+		<script language="JavaScript" src="tests/14-comment_in_text_in_script.js"></script>
+		<script language="JavaScript" src="tests/15-non-verbose.js"></script>
+		<script language="JavaScript" src="tests/16-ignore_whitespace.js"></script>
+		<script language="JavaScript" src="tests/17-xml_namespace.js"></script>
+		<script language="JavaScript" src="tests/18-enforce_empty_tags.js"></script>
+		<script language="JavaScript" src="tests/19-ignore_empty_tags.js"></script>
+		<script language="JavaScript" src="tests/20-rss.js"></script>
+		<script language="JavaScript" src="tests/21-atom.js"></script>
+		<!-- //TODO: dynamic loading of test files -->
+	</head>
+	<body style="font-size: small; font-family:Arial, Helvetica, sans-serif;">
+
+		<script language="JavaScript">
+			var chunkSize = 5;
+			var testCount = 0;
+			var failedCount = 0;
+			while (Tautologistics.NodeHtmlParser.Tests.length) {
+				testCount++;
+				var test = Tautologistics.NodeHtmlParser.Tests.shift();
+				try {
+					var handlerCallback = function handlerCallback (error) {
+						if (error)
+							document.write("<hr>Handler error: " + error + "<hr>");
+					}
+					var handler = (test.type == "rss") ?
+						new Tautologistics.NodeHtmlParser.RssHandler(handlerCallback, test.options)
+						:
+						new Tautologistics.NodeHtmlParser.DefaultHandler(handlerCallback, test.options)
+						;
+					var parser = new Tautologistics.NodeHtmlParser.Parser(handler);
+					document.write("<b>" + test.name + "</b>: ");
+					parser.parseComplete(test.html);
+					var resultComplete = handler.dom;
+					var chunkPos = 0;
+					parser.reset();
+					while (chunkPos < test.html.length) {
+						parser.parseChunk(test.html.substring(chunkPos, chunkPos + chunkSize));
+						chunkPos += chunkSize;
+					}
+					parser.done();
+					var resultChunk = handler.dom;
+					var testResult =
+						JSON.stringify(resultComplete).toString() === JSON.stringify(test.expected).toString()
+						&&
+						JSON.stringify(resultChunk).toString() === JSON.stringify(test.expected).toString()
+						;
+					document.write(testResult ? "<font class='good'>passed</font>" : "<font class='bad'>FAILED</font>");
+					if (!testResult) {
+						failedCount++;
+						document.write("<pre>");
+						document.write("<b>Complete</b>\n");
+						document.write(JSON.stringify(resultComplete, null, 2));
+						document.write("<b>Chunked</b>\n");
+						document.write(JSON.stringify(resultChunk, null, 2));
+						document.write("<h2>Expected</h2>\n");
+						document.write(JSON.stringify(test.expected, null, 2));
+						document.write("</pre>");
+					}
+				} catch (ex) {
+					document.write("<h1>Exception occured during test: " + ex + "</h1>")
+				}
+				document.write("<br>");
+			}
+			document.write("<hr>");
+			document.write("Total tests: " + testCount + "<br>");
+			document.write("Failed tests: " + failedCount + "<br>");
+		</script>
+	
+	</body>
+</html>
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/runtests.min.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/runtests.min.js
new file mode 100644
index 0000000..d32c3aa
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/runtests.min.js
@@ -0,0 +1,75 @@
+/***********************************************
+Copyright 2010, Chris Winberry <chris at winberry.net>. All rights reserved.
+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.
+***********************************************/
+
+var sys = require("sys");
+var fs = require("fs");
+var htmlparser = require("./lib/node-htmlparser.min");
+
+var testFolder = "./tests";
+var chunkSize = 5;
+
+var testFiles = fs.readdirSync(testFolder);
+var testCount = 0;
+var failedCount = 0;
+for (var i in testFiles) {
+	testCount++;
+	var fileParts = testFiles[i].split(".");
+	fileParts.pop();
+	var moduleName = fileParts.join(".");
+	var test = require(testFolder + "/" + moduleName);
+	var handlerCallback = function handlerCallback (error) {
+		if (error)
+			sys.puts("Handler error: " + error);
+	}
+	var handler = (test.type == "rss") ?
+		new htmlparser.RssHandler(handlerCallback, test.options)
+		:
+		new htmlparser.DefaultHandler(handlerCallback, test.options)
+		;
+	var parser = new htmlparser.Parser(handler);
+	parser.parseComplete(test.html);
+	var resultComplete = handler.dom;
+	var chunkPos = 0;
+	parser.reset();
+	while (chunkPos < test.html.length) {
+		parser.parseChunk(test.html.substring(chunkPos, chunkPos + chunkSize));
+		chunkPos += chunkSize;
+	}
+	parser.done();
+	var resultChunk = handler.dom;
+	var testResult =
+		sys.inspect(resultComplete, false, null) === sys.inspect(test.expected, false, null)
+		&&
+		sys.inspect(resultChunk, false, null) === sys.inspect(test.expected, false, null)
+		;
+	sys.puts("[" + test.name + "\]: " + (testResult ? "passed" : "FAILED"));
+	if (!testResult) {
+		failedCount++;
+		sys.puts("== Complete ==");
+		sys.puts(sys.inspect(resultComplete, false, null));
+		sys.puts("== Chunked ==");
+		sys.puts(sys.inspect(resultChunk, false, null));
+		sys.puts("== Expected ==");
+		sys.puts(sys.inspect(test.expected, false, null));
+	}
+}
+sys.puts("Total tests: " + testCount);
+sys.puts("Failed tests: " + failedCount);
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/snippet.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/snippet.js
new file mode 100644
index 0000000..2f54b36
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/snippet.js
@@ -0,0 +1,15 @@
+//node --prof --prof_auto profile.js
+//deps/v8/tools/mac-tick-processor v8.log
+var sys = require("sys");
+var htmlparser = require("./node-htmlparser");
+
+var html = "<link>text</link>";
+
+var handler = new htmlparser.DefaultHandler(function(err, dom) {
+	if (err)
+		sys.debug("Error: " + err);
+	else
+		sys.debug(sys.inspect(dom, false, null));
+}, { enforceEmptyTags: true });
+var parser = new htmlparser.Parser(handler);
+parser.parseComplete(html);
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/01-basic.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/01-basic.js
new file mode 100644
index 0000000..57de7dc
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/01-basic.js
@@ -0,0 +1,57 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Basic test";
+exports.html = "<html><title>The Title</title><body>Hello world</body></html>";
+exports.expected =
+	[ { raw: 'html'
+		  , data: 'html'
+		  , type: 'tag'
+		  , name: 'html'
+		  , children: 
+		     [ { raw: 'title'
+		       , data: 'title'
+		       , type: 'tag'
+		       , name: 'title'
+		       , children: [ { raw: 'The Title', data: 'The Title', type: 'text' } ]
+		       }
+		     , { raw: 'body'
+		       , data: 'body'
+		       , type: 'tag'
+		       , name: 'body'
+		       , children: 
+		          [ { raw: 'Hello world'
+		            , data: 'Hello world'
+		            , type: 'text'
+		            }
+		          ]
+		       }
+		     ]
+		  }
+		];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/02-single_tag_1.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/02-single_tag_1.js
new file mode 100644
index 0000000..8af04d9
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/02-single_tag_1.js
@@ -0,0 +1,35 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Single Tag 1";
+exports.html = "<br>text</br>";
+exports.expected =
+	[ { raw: 'br', data: 'br', type: 'tag', name: 'br' }
+	, { raw: 'text', data: 'text', type: 'text' }
+	];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/03-single_tag_2.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/03-single_tag_2.js
new file mode 100644
index 0000000..beae642
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/03-single_tag_2.js
@@ -0,0 +1,36 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Single Tag 2";
+exports.html = "<br>text<br>";
+exports.expected =
+	[ { raw: 'br', data: 'br', type: 'tag', name: 'br' }
+	, { raw: 'text', data: 'text', type: 'text' }
+	, { raw: 'br', data: 'br', type: 'tag', name: 'br' }
+	];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/04-unescaped_in_script.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/04-unescaped_in_script.js
new file mode 100644
index 0000000..1a23385
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/04-unescaped_in_script.js
@@ -0,0 +1,52 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Unescaped chars in script";
+exports.html = "<head><script language=\"Javascript\">var foo = \"<bar>\"; alert(2 > foo); var baz = 10 << 2; var zip = 10 >> 1; var yap = \"<<>>>><<\";</script></head>";
+exports.expected =
+[ { raw: 'head'
+  , data: 'head'
+  , type: 'tag'
+  , name: 'head'
+  , children: 
+     [ { raw: 'script language="Javascript"'
+       , data: 'script language="Javascript"'
+       , type: 'script'
+       , name: 'script'
+       , attribs: { language: 'Javascript' }
+       , children: 
+          [ { raw: 'var foo = "<bar>"; alert(2 > foo); var baz = 10 << 2; var zip = 10 >> 1; var yap = \"<<>>>><<\";'
+            , data: 'var foo = "<bar>"; alert(2 > foo); var baz = 10 << 2; var zip = 10 >> 1; var yap = \"<<>>>><<\";'
+            , type: 'text'
+            }
+          ]
+       }
+     ]
+  }
+];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/05-tags_in_comment.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/05-tags_in_comment.js
new file mode 100644
index 0000000..79fdd8c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/05-tags_in_comment.js
@@ -0,0 +1,44 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Special char in comment";
+exports.html = "<head><!-- commented out tags <title>Test</title>--></head>";
+exports.expected =
+[ { raw: 'head'
+  , data: 'head'
+  , type: 'tag'
+  , name: 'head'
+  , children: 
+     [ { raw: ' commented out tags <title>Test</title>'
+       , data: ' commented out tags <title>Test</title>'
+       , type: 'comment'
+       }
+     ]
+  }
+];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/06-comment_in_script.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/06-comment_in_script.js
new file mode 100644
index 0000000..7737f38
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/06-comment_in_script.js
@@ -0,0 +1,44 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Script source in comment";
+exports.html = "<script><!--var foo = 1;--></script>";
+exports.expected =
+[ { raw: 'script'
+  , data: 'script'
+  , type: 'script'
+  , name: 'script'
+  , children: 
+     [ { raw: 'var foo = 1;'
+       , data: 'var foo = 1;'
+       , type: 'comment'
+       }
+     ]
+  }
+];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/07-unescaped_in_style.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/07-unescaped_in_style.js
new file mode 100644
index 0000000..fe4efad
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/07-unescaped_in_style.js
@@ -0,0 +1,45 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Unescaped chars in style";
+exports.html = "<style type=\"text/css\">\n body > p\n	{ font-weight: bold; }</style>";
+exports.expected =
+[ { raw: 'style type="text/css"'
+  , data: 'style type="text/css"'
+  , type: 'style'
+  , name: 'style'
+  , attribs: { type: 'text/css' }
+  , children:
+     [ { raw: '\n body > p\n	{ font-weight: bold; }'
+       , data: '\n body > p\n	{ font-weight: bold; }'
+       , type: 'text'
+       }
+     ]
+  }
+];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/08-extra_spaces_in_tag.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/08-extra_spaces_in_tag.js
new file mode 100644
index 0000000..84192af
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/08-extra_spaces_in_tag.js
@@ -0,0 +1,45 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Extra spaces in tag";
+exports.html = "<\n font	\n size='14' \n>the text<\n /	\nfont	 \n>";
+exports.expected =
+[ { raw: '\n font	\n size=\'14\' \n'
+  , data: 'font	\n size=\'14\''
+  , type: 'tag'
+  , name: 'font'
+  , attribs: { size: '14' }
+  , children:
+     [ { raw: 'the text'
+       , data: 'the text'
+       , type: 'text'
+       }
+     ]
+  }
+];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/09-unquoted_attrib.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/09-unquoted_attrib.js
new file mode 100644
index 0000000..3ad54e6
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/09-unquoted_attrib.js
@@ -0,0 +1,45 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Unquoted attributes";
+exports.html = "<font size= 14>the text</font>";
+exports.expected =
+[ { raw: 'font size= 14'
+  , data: 'font size= 14'
+  , type: 'tag'
+  , name: 'font'
+  , attribs: { size: '14' }
+  , children:
+     [ { raw: 'the text'
+       , data: 'the text'
+       , type: 'text'
+       }
+     ]
+  }
+];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/10-singular_attribute.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/10-singular_attribute.js
new file mode 100644
index 0000000..37897dc
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/10-singular_attribute.js
@@ -0,0 +1,39 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Singular attribute";
+exports.html = "<option value='foo' selected>";
+exports.expected =
+[ { raw: 'option value=\'foo\' selected'
+  , data: 'option value=\'foo\' selected'
+  , type: 'tag'
+  , name: 'option'
+  , attribs: { value: 'foo', selected: 'selected' }
+  }
+];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/11-text_outside_tags.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/11-text_outside_tags.js
new file mode 100644
index 0000000..16e55e9
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/11-text_outside_tags.js
@@ -0,0 +1,46 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Text outside tags";
+exports.html = "Line one\n<br>\nline two";
+exports.expected =
+[ { raw: 'Line one\n'
+  , data: 'Line one\n'
+  , type: 'text'
+  }
+  , { raw: 'br'
+  , data: 'br'
+  , type: 'tag'
+  , name: 'br'
+  }
+  , { raw: '\nline two'
+  , data: '\nline two'
+  , type: 'text'
+  }
+];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/12-text_only.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/12-text_only.js
new file mode 100644
index 0000000..f6b5fa3
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/12-text_only.js
@@ -0,0 +1,37 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Only text";
+exports.html = "this is the text";
+exports.expected =
+[ { raw: 'this is the text'
+  , data: 'this is the text'
+  , type: 'text'
+  }
+];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/13-comment_in_text.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/13-comment_in_text.js
new file mode 100644
index 0000000..3ff983c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/13-comment_in_text.js
@@ -0,0 +1,45 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Comment within text";
+exports.html = "this is <!-- the comment --> the text";
+exports.expected =
+[ { raw: 'this is '
+  , data: 'this is '
+  , type: 'text'
+  }
+, { raw: ' the comment '
+  , data: ' the comment '
+  , type: 'comment'
+  }
+, { raw: ' the text'
+  , data: ' the text'
+  , type: 'text'
+  }
+];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/14-comment_in_text_in_script.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/14-comment_in_text_in_script.js
new file mode 100644
index 0000000..1e360cf
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/14-comment_in_text_in_script.js
@@ -0,0 +1,53 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Comment within text within script";
+exports.html = "<script>this is <!-- the comment --> the text</script>";
+exports.expected =
+[ { raw: 'script'
+  , data: 'script'
+  , type: 'script'
+  , name: 'script'
+  , children:
+     [ { raw: 'this is '
+       , data: 'this is '
+       , type: 'text'
+       }
+       , { raw: ' the comment '
+       , data: ' the comment '
+       , type: 'comment'
+       }
+       , { raw: ' the text'
+       , data: ' the text'
+       , type: 'text'
+       }
+
+     ]
+  }
+];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/15-non-verbose.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/15-non-verbose.js
new file mode 100644
index 0000000..0110637
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/15-non-verbose.js
@@ -0,0 +1,43 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Option 'verbose' set to 'false'";
+exports.html = "<\n font	\n size='14' \n>the text<\n /	\nfont	 \n>";
+exports.options = { verbose: false };
+exports.expected =
+[ { type: 'tag'
+  , name: 'font'
+  , attribs: { size: '14' }
+  , children:
+     [ { data: 'the text'
+       , type: 'text'
+       }
+     ]
+  }
+];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/16-ignore_whitespace.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/16-ignore_whitespace.js
new file mode 100644
index 0000000..f8e071f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/16-ignore_whitespace.js
@@ -0,0 +1,68 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Options 'ignoreWhitespace' set to 'true'";
+exports.html = "Line one\n<br> \t\n<br>\nline two<font>\n <br> x </font>";
+exports.options = { ignoreWhitespace: true };
+exports.expected =
+[ { raw: 'Line one\n'
+  , data: 'Line one\n'
+  , type: 'text'
+  }
+  , { raw: 'br'
+  , data: 'br'
+  , type: 'tag'
+  , name: 'br'
+  }
+  , { raw: 'br'
+  , data: 'br'
+  , type: 'tag'
+  , name: 'br'
+  }
+  , { raw: '\nline two'
+  , data: '\nline two'
+  , type: 'text'
+  }
+  , { raw: 'font'
+  , data: 'font'
+  , type: 'tag'
+  , name: 'font'
+  , children: 
+	[ { raw: 'br'
+  , data: 'br'
+  , type: 'tag'
+  , name: 'br'
+  }
+  , { raw: ' x '
+  , data: ' x '
+  , type: 'text'
+  }
+	  ]
+	}
+];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/17-xml_namespace.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/17-xml_namespace.js
new file mode 100644
index 0000000..53aa452
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/17-xml_namespace.js
@@ -0,0 +1,34 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "XML Namespace";
+exports.html = "<ns:tag>text</ns:tag>";
+exports.expected =
+	[ { raw: 'ns:tag', data: 'ns:tag', type: 'tag', name: 'ns:tag', children: [ { raw: 'text', data: 'text', type: 'text' } ] }
+	];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/18-enforce_empty_tags.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/18-enforce_empty_tags.js
new file mode 100644
index 0000000..d963ac6
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/18-enforce_empty_tags.js
@@ -0,0 +1,36 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Enforce empty tags";
+exports.html = "<link>text</link>";
+exports.expected =
+	[
+		  { raw: 'link', data: 'link', type: 'tag', name: 'link' }
+		, { raw: 'text', data: 'text', type: 'text' }
+	];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/19-ignore_empty_tags.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/19-ignore_empty_tags.js
new file mode 100644
index 0000000..6bb9ba4
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/19-ignore_empty_tags.js
@@ -0,0 +1,38 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Ignore empty tags";
+exports.html = "<link>text</link>";
+exports.options = { enforceEmptyTags: false };
+exports.expected =
+	[
+		  { raw: 'link', data: 'link', type: 'tag', name: 'link', children: [
+		  	{ raw: 'text', data: 'text', type: 'text' }
+		  ] }
+	];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/20-rss.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/20-rss.js
new file mode 100644
index 0000000..f2e8ae5
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/20-rss.js
@@ -0,0 +1,117 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "RSS (2.0)";
+//http://cyber.law.harvard.edu/rss/examples/rss2sample.xml
+exports.html = '<?xml version="1.0"?>\
+<rss version="2.0">\
+   <channel>\
+      <title>Liftoff News</title>\
+      <link>http://liftoff.msfc.nasa.gov/</link>\
+      <description>Liftoff to Space Exploration.</description>\
+      <language>en-us</language>\
+      <pubDate>Tue, 10 Jun 2003 04:00:00 GMT</pubDate>\
+\
+      <lastBuildDate>Tue, 10 Jun 2003 09:41:01 GMT</lastBuildDate>\
+      <docs>http://blogs.law.harvard.edu/tech/rss</docs>\
+      <generator>Weblog Editor 2.0</generator>\
+      <managingEditor>editor at example.com</managingEditor>\
+      <webMaster>webmaster at example.com</webMaster>\
+      <item>\
+\
+         <title>Star City</title>\
+         <link>http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp</link>\
+         <description>How do Americans get ready to work with Russians aboard the International Space Station? They take a crash course in culture, language and protocol at Russia\'s <a href="http://howe.iki.rssi.ru/GCTC/gctc_e.htm">Star City</a>.</description>\
+         <pubDate>Tue, 03 Jun 2003 09:39:21 GMT</pubDate>\
+         <guid>http://liftoff.msfc.nasa.gov/2003/06/03.html#item573</guid>\
+\
+      </item>\
+      <item>\
+         <description>Sky watchers in Europe, Asia, and parts of Alaska and Canada will experience a <a href="http://science.nasa.gov/headlines/y2003/30may_solareclipse.htm">partial eclipse of the Sun</a> on Saturday, May 31st.</description>\
+         <pubDate>Fri, 30 May 2003 11:06:42 GMT</pubDate>\
+         <guid>http://liftoff.msfc.nasa.gov/2003/05/30.html#item572</guid>\
+\
+      </item>\
+      <item>\
+         <title>The Engine That Does More</title>\
+         <link>http://liftoff.msfc.nasa.gov/news/2003/news-VASIMR.asp</link>\
+         <description>Before man travels to Mars, NASA hopes to design new engines that will let us fly through the Solar System more quickly.  The proposed VASIMR engine would do that.</description>\
+         <pubDate>Tue, 27 May 2003 08:37:32 GMT</pubDate>\
+         <guid>http://liftoff.msfc.nasa.gov/2003/05/27.html#item571</guid>\
+\
+      </item>\
+      <item>\
+         <title>Astronauts\' Dirty Laundry</title>\
+         <link>http://liftoff.msfc.nasa.gov/news/2003/news-laundry.asp</link>\
+         <description>Compared to earlier spacecraft, the International Space Station has many luxuries, but laundry facilities are not one of them.  Instead, astronauts have other options.</description>\
+         <pubDate>Tue, 20 May 2003 08:56:02 GMT</pubDate>\
+         <guid>http://liftoff.msfc.nasa.gov/2003/05/20.html#item570</guid>\
+\
+      </item>\
+   </channel>\
+</rss>';
+exports.options = { };
+exports.type = "rss";
+exports.expected = {
+	  type: "rss"
+	, id: ""
+ 	, title: "Liftoff News"
+	, link: "http://liftoff.msfc.nasa.gov/"
+	, description: "Liftoff to Space Exploration."
+	, updated: new Date("Tue, 10 Jun 2003 09:41:01 GMT")
+	, author: "editor at example.com"
+	, items: [
+		  {
+			  id: "http://liftoff.msfc.nasa.gov/2003/06/03.html#item573"
+			, title: "Star City"
+			, link: "http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp"
+			, description: "How do Americans get ready to work with Russians aboard the International Space Station? They take a crash course in culture, language and protocol at Russia's <a href=\"http://howe.iki.rssi.ru/GCTC/gctc_e.htm\">Star City</a>."
+			, pubDate: new Date("Tue, 03 Jun 2003 09:39:21 GMT")
+			}
+		, {
+			  id: "http://liftoff.msfc.nasa.gov/2003/05/30.html#item572"
+			, description: "Sky watchers in Europe, Asia, and parts of Alaska and Canada will experience a <a href=\"http://science.nasa.gov/headlines/y2003/30may_solareclipse.htm\">partial eclipse of the Sun</a> on Saturday, May 31st."
+			, pubDate: new Date("Fri, 30 May 2003 11:06:42 GMT")
+			}
+		, {
+			  id: "http://liftoff.msfc.nasa.gov/2003/05/27.html#item571"
+			, title: "The Engine That Does More"
+			, link: "http://liftoff.msfc.nasa.gov/news/2003/news-VASIMR.asp"
+			, description: "Before man travels to Mars, NASA hopes to design new engines that will let us fly through the Solar System more quickly.  The proposed VASIMR engine would do that."
+			, pubDate: new Date("Tue, 27 May 2003 08:37:32 GMT")
+			}
+		, {
+			 id: "http://liftoff.msfc.nasa.gov/2003/05/20.html#item570"
+			, title: "Astronauts' Dirty Laundry"
+			, link: "http://liftoff.msfc.nasa.gov/news/2003/news-laundry.asp"
+			, description: "Compared to earlier spacecraft, the International Space Station has many luxuries, but laundry facilities are not one of them.  Instead, astronauts have other options."
+			, pubDate: new Date("Tue, 20 May 2003 08:56:02 GMT")
+			}
+		]
+	};
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/21-atom.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/21-atom.js
new file mode 100644
index 0000000..c766db2
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/tests/21-atom.js
@@ -0,0 +1,77 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Atom (1.0)";
+//http://en.wikipedia.org/wiki/Atom_%28standard%29
+exports.html = '<?xml version="1.0" encoding="utf-8"?>\
+\
+<feed xmlns="http://www.w3.org/2005/Atom">\
+\
+	<title>Example Feed</title>\
+	<subtitle>A subtitle.</subtitle>\
+	<link href="http://example.org/feed/" rel="self" />\
+	<link href="http://example.org/" />\
+	<id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id>\
+	<updated>2003-12-13T18:30:02Z</updated>\
+	<author>\
+		<name>John Doe</name>\
+		<email>johndoe at example.com</email>\
+	</author>\
+\
+	<entry>\
+		<title>Atom-Powered Robots Run Amok</title>\
+		<link href="http://example.org/2003/12/13/atom03" />\
+		<link rel="alternate" type="text/html" href="http://example.org/2003/12/13/atom03.html"/>\
+		<link rel="edit" href="http://example.org/2003/12/13/atom03/edit"/>\
+		<id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>\
+		<updated>2003-12-13T18:30:02Z</updated>\
+		<summary>Some text.</summary>\
+	</entry>\
+\
+</feed>';
+exports.options = { };
+exports.type = "rss";
+exports.expected = {
+	  type: "atom"
+	, id: "urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6"
+ 	, title: "Example Feed"
+	, link: "http://example.org/feed/"
+	, description: "A subtitle."
+	, updated: new Date("2003-12-13T18:30:02Z")
+	, author: "johndoe at example.com"
+	, items: [
+		  {
+			  id: "urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a"
+			, title: "Atom-Powered Robots Run Amok"
+			, link: "http://example.org/2003/12/13/atom03"
+			, description: "Some text."
+			, pubDate: new Date("2003-12-13T18:30:02Z")
+			}
+		]
+	};
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/utils_example.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/utils_example.js
new file mode 100644
index 0000000..9f6deca
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/pulls/node-htmlparser/utils_example.js
@@ -0,0 +1,35 @@
+//node --prof --prof_auto profile.js
+//deps/v8/tools/mac-tick-processor v8.log
+var sys = require("sys");
+var htmlparser = require("./lib/node-htmlparser");
+
+var html = "<a>text a</a><b id='x'>text b</b><c class='y'>text c</c><d id='z' class='w'><e>text e</e></d><g class='g h i'>hhh</g><yy>hellow</yy><yy id='secondyy'>world</yy>";
+
+var handler = new htmlparser.DefaultHandler(function(err, dom) {
+	if (err) {
+		sys.debug("Error: " + err);
+	}
+	else {
+		sys.debug(sys.inspect(dom, false, null));
+		var id = htmlparser.DomUtils.getElementById("x", dom);
+		sys.debug("id: " + sys.inspect(id, false, null));
+		var class = htmlparser.DomUtils.getElements({ class: "y" }, dom);
+		sys.debug("class: " + sys.inspect(class, false, null));
+		var multiclass = htmlparser.DomUtils.getElements({ class: function (value) { return(value && value.indexOf("h") > -1); } }, dom);
+		sys.debug("multiclass: " + sys.inspect(multiclass, false, null));
+		var name = htmlparser.DomUtils.getElementsByTagName("a", dom);
+		sys.debug("name: " + sys.inspect(name, false, null));
+		var text = htmlparser.DomUtils.getElementsByTagType("text", dom);
+		sys.debug("text: " + sys.inspect(text, false, null));
+		var nested = htmlparser.DomUtils.getElements({ tag_name: "d", id: "z", class: "w" }, dom);
+		nested = htmlparser.DomUtils.getElementsByTagName("e", nested);
+		nested = htmlparser.DomUtils.getElementsByTagType("text", nested);
+		sys.debug("nested: " + sys.inspect(nested, false, null));
+		var double = htmlparser.DomUtils.getElementsByTagName("yy", dom);
+		sys.debug("double: " + sys.inspect(double, false, null));
+		var single = htmlparser.DomUtils.getElements( { tag_name: "yy", id: "secondyy" }, dom);
+		sys.debug("single: " + sys.inspect(single, false, null));
+	}
+}, { verbose: false });
+var parser = new htmlparser.Parser(handler);
+parser.parseComplete(html);
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/rssbug.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/rssbug.js
new file mode 100644
index 0000000..734b0d2
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/rssbug.js
@@ -0,0 +1,16 @@
+//node --prof --prof_auto profile.js
+//deps/v8/tools/mac-tick-processor v8.log
+var sys = require("sys");
+var fs = require("fs");
+var htmlparser = require("./node-htmlparser");
+
+var rss = fs.readFileSync("rssbug.rss");
+
+var handler = new htmlparser.DefaultHandler(function(err, dom) {
+	if (err)
+		sys.debug("Error: " + err);
+	else
+		sys.debug(sys.inspect(dom, false, null));
+}, { verbose: false });
+var parser = new htmlparser.Parser(handler);
+parser.parseComplete(rss);
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/rssbug.rss b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/rssbug.rss
new file mode 100644
index 0000000..c63cd6f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/rssbug.rss
@@ -0,0 +1 @@
+<link>xxx</link><linx>yyy</linx>
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/runtests.html b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/runtests.html
new file mode 100644
index 0000000..e89702d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/runtests.html
@@ -0,0 +1,108 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+	<head>
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<title>Node.js HTML Parser</title>
+		<style type="text/css">
+			.good {
+				color: #363;
+			}
+			.bad {
+				color: #633;
+				font-style: italic;
+			}
+		</style>
+		<script language="JavaScript">
+			if ((typeof JSON) != "object") {
+				var head = document.getElementsByTagName("head")[0];
+				var script = document.createElement('script');
+				script.type = "text/javascript";
+				script.src = "json2.js";
+				head.insertBefore(script, head.firstChild)
+			}
+		</script>
+		<script language="JavaScript" src="lib/htmlparser.js"></script>
+		<script language="JavaScript" src="tests/01-basic.js"></script>
+		<script language="JavaScript" src="tests/02-single_tag_1.js"></script>
+		<script language="JavaScript" src="tests/03-single_tag_2.js"></script>
+		<script language="JavaScript" src="tests/04-unescaped_in_script.js"></script>
+		<script language="JavaScript" src="tests/05-tags_in_comment.js"></script>
+		<script language="JavaScript" src="tests/06-comment_in_script.js"></script>
+		<script language="JavaScript" src="tests/07-unescaped_in_style.js"></script>
+		<script language="JavaScript" src="tests/08-extra_spaces_in_tag.js"></script>
+		<script language="JavaScript" src="tests/09-unquoted_attrib.js"></script>
+		<script language="JavaScript" src="tests/10-singular_attribute.js"></script>
+		<script language="JavaScript" src="tests/11-text_outside_tags.js"></script>
+		<script language="JavaScript" src="tests/12-text_only.js"></script>
+		<script language="JavaScript" src="tests/13-comment_in_text.js"></script>
+		<script language="JavaScript" src="tests/14-comment_in_text_in_script.js"></script>
+		<script language="JavaScript" src="tests/15-non-verbose.js"></script>
+		<script language="JavaScript" src="tests/16-ignore_whitespace.js"></script>
+		<script language="JavaScript" src="tests/17-xml_namespace.js"></script>
+		<script language="JavaScript" src="tests/18-enforce_empty_tags.js"></script>
+		<script language="JavaScript" src="tests/19-ignore_empty_tags.js"></script>
+		<script language="JavaScript" src="tests/20-rss.js"></script>
+		<script language="JavaScript" src="tests/21-atom.js"></script>
+		<script language="JavaScript" src="tests/22-position_data.js"></script>
+		<!-- //TODO: dynamic loading of test files -->
+	</head>
+	<body style="font-size: small; font-family:Arial, Helvetica, sans-serif;">
+
+		<script language="JavaScript">
+			var chunkSize = 5;
+			var testCount = 0;
+			var failedCount = 0;
+			while (Tautologistics.NodeHtmlParser.Tests.length) {
+				testCount++;
+				var test = Tautologistics.NodeHtmlParser.Tests.shift();
+				try {
+					var handlerCallback = function handlerCallback (error) {
+						if (error)
+							document.write("<hr>Handler error: " + error + "<hr>");
+					}
+					var handler = (test.type == "rss") ?
+						new Tautologistics.NodeHtmlParser.RssHandler(handlerCallback, test.options.handler)
+						:
+						new Tautologistics.NodeHtmlParser.DefaultHandler(handlerCallback, test.options.handler)
+						;
+					var parser = new Tautologistics.NodeHtmlParser.Parser(handler, test.options.parser);
+					document.write("<b>" + test.name + "</b>: ");
+					parser.parseComplete(test.html);
+					var resultComplete = handler.dom;
+					var chunkPos = 0;
+					parser.reset();
+					while (chunkPos < test.html.length) {
+						parser.parseChunk(test.html.substring(chunkPos, chunkPos + chunkSize));
+						chunkPos += chunkSize;
+					}
+					parser.done();
+					var resultChunk = handler.dom;
+					var testResult =
+						JSON.stringify(resultComplete).toString() === JSON.stringify(test.expected).toString()
+						&&
+						JSON.stringify(resultChunk).toString() === JSON.stringify(test.expected).toString()
+						;
+					document.write(testResult ? "<font class='good'>passed</font>" : "<font class='bad'>FAILED</font>");
+					if (!testResult) {
+						failedCount++;
+						document.write("<pre>");
+						document.write("<b>Complete</b>\n");
+						document.write(JSON.stringify(resultComplete, null, 2));
+						document.write("<b>Chunked</b>\n");
+						document.write(JSON.stringify(resultChunk, null, 2));
+						document.write("<h2>Expected</h2>\n");
+						document.write(JSON.stringify(test.expected, null, 2));
+						document.write("</pre>");
+					}
+				} catch (ex) {
+					document.write("<h1>Exception occured during test: " + ex + "</h1>")
+				}
+				document.write("<br>");
+			}
+			document.write("<hr>");
+			document.write("Total tests: " + testCount + "<br>");
+			document.write("Failed tests: " + failedCount + "<br>");
+		</script>
+	
+	</body>
+</html>
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/runtests.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/runtests.js
new file mode 100644
index 0000000..e906fe4
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/runtests.js
@@ -0,0 +1,75 @@
+/***********************************************
+Copyright 2010, Chris Winberry <chris at winberry.net>. All rights reserved.
+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.
+***********************************************/
+
+var sys = require("sys");
+var fs = require("fs");
+var htmlparser = require("./lib/htmlparser");
+
+var testFolder = "./tests";
+var chunkSize = 5;
+
+var testFiles = fs.readdirSync(testFolder);
+var testCount = 0;
+var failedCount = 0;
+for (var i in testFiles) {
+	testCount++;
+	var fileParts = testFiles[i].split(".");
+	fileParts.pop();
+	var moduleName = fileParts.join(".");
+	var test = require(testFolder + "/" + moduleName);
+	var handlerCallback = function handlerCallback (error) {
+		if (error)
+			sys.puts("Handler error: " + error);
+	}
+	var handler = (test.type == "rss") ?
+		new htmlparser.RssHandler(handlerCallback, test.options.handler)
+		:
+		new htmlparser.DefaultHandler(handlerCallback, test.options.handler)
+		;
+	var parser = new htmlparser.Parser(handler, test.options.parser);
+	parser.parseComplete(test.html);
+	var resultComplete = handler.dom;
+	var chunkPos = 0;
+	parser.reset();
+	while (chunkPos < test.html.length) {
+		parser.parseChunk(test.html.substring(chunkPos, chunkPos + chunkSize));
+		chunkPos += chunkSize;
+	}
+	parser.done();
+	var resultChunk = handler.dom;
+	var testResult =
+		sys.inspect(resultComplete, false, null) === sys.inspect(test.expected, false, null)
+		&&
+		sys.inspect(resultChunk, false, null) === sys.inspect(test.expected, false, null)
+		;
+	sys.puts("[" + test.name + "\]: " + (testResult ? "passed" : "FAILED"));
+	if (!testResult) {
+		failedCount++;
+		sys.puts("== Complete ==");
+		sys.puts(sys.inspect(resultComplete, false, null));
+		sys.puts("== Chunked ==");
+		sys.puts(sys.inspect(resultChunk, false, null));
+		sys.puts("== Expected ==");
+		sys.puts(sys.inspect(test.expected, false, null));
+	}
+}
+sys.puts("Total tests: " + testCount);
+sys.puts("Failed tests: " + failedCount);
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/runtests.min.html b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/runtests.min.html
new file mode 100644
index 0000000..73ea4c7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/runtests.min.html
@@ -0,0 +1,108 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+	<head>
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<title>Node.js HTML Parser</title>
+		<style type="text/css">
+			.good {
+				color: #363;
+			}
+			.bad {
+				color: #633;
+				font-style: italic;
+			}
+		</style>
+		<script language="JavaScript">
+			if ((typeof JSON) != "object") {
+				var head = document.getElementsByTagName("head")[0];
+				var script = document.createElement('script');
+				script.type = "text/javascript";
+				script.src = "json2.js";
+				head.insertBefore(script, head.firstChild)
+			}
+		</script>
+		<script language="JavaScript" src="lib/htmlparser.min.js"></script>
+		<script language="JavaScript" src="tests/01-basic.js"></script>
+		<script language="JavaScript" src="tests/02-single_tag_1.js"></script>
+		<script language="JavaScript" src="tests/03-single_tag_2.js"></script>
+		<script language="JavaScript" src="tests/04-unescaped_in_script.js"></script>
+		<script language="JavaScript" src="tests/05-tags_in_comment.js"></script>
+		<script language="JavaScript" src="tests/06-comment_in_script.js"></script>
+		<script language="JavaScript" src="tests/07-unescaped_in_style.js"></script>
+		<script language="JavaScript" src="tests/08-extra_spaces_in_tag.js"></script>
+		<script language="JavaScript" src="tests/09-unquoted_attrib.js"></script>
+		<script language="JavaScript" src="tests/10-singular_attribute.js"></script>
+		<script language="JavaScript" src="tests/11-text_outside_tags.js"></script>
+		<script language="JavaScript" src="tests/12-text_only.js"></script>
+		<script language="JavaScript" src="tests/13-comment_in_text.js"></script>
+		<script language="JavaScript" src="tests/14-comment_in_text_in_script.js"></script>
+		<script language="JavaScript" src="tests/15-non-verbose.js"></script>
+		<script language="JavaScript" src="tests/16-ignore_whitespace.js"></script>
+		<script language="JavaScript" src="tests/17-xml_namespace.js"></script>
+		<script language="JavaScript" src="tests/18-enforce_empty_tags.js"></script>
+		<script language="JavaScript" src="tests/19-ignore_empty_tags.js"></script>
+		<script language="JavaScript" src="tests/20-rss.js"></script>
+		<script language="JavaScript" src="tests/21-atom.js"></script>
+		<script language="JavaScript" src="tests/22-position_data.js"></script>
+		<!-- //TODO: dynamic loading of test files -->
+	</head>
+	<body style="font-size: small; font-family:Arial, Helvetica, sans-serif;">
+
+		<script language="JavaScript">
+			var chunkSize = 5;
+			var testCount = 0;
+			var failedCount = 0;
+			while (Tautologistics.NodeHtmlParser.Tests.length) {
+				testCount++;
+				var test = Tautologistics.NodeHtmlParser.Tests.shift();
+				try {
+					var handlerCallback = function handlerCallback (error) {
+						if (error)
+							document.write("<hr>Handler error: " + error + "<hr>");
+					}
+					var handler = (test.type == "rss") ?
+						new Tautologistics.NodeHtmlParser.RssHandler(handlerCallback, test.options.handler)
+						:
+						new Tautologistics.NodeHtmlParser.DefaultHandler(handlerCallback, test.options.handler)
+						;
+					var parser = new Tautologistics.NodeHtmlParser.Parser(handler, test.options.parser);
+					document.write("<b>" + test.name + "</b>: ");
+					parser.parseComplete(test.html);
+					var resultComplete = handler.dom;
+					var chunkPos = 0;
+					parser.reset();
+					while (chunkPos < test.html.length) {
+						parser.parseChunk(test.html.substring(chunkPos, chunkPos + chunkSize));
+						chunkPos += chunkSize;
+					}
+					parser.done();
+					var resultChunk = handler.dom;
+					var testResult =
+						JSON.stringify(resultComplete).toString() === JSON.stringify(test.expected).toString()
+						&&
+						JSON.stringify(resultChunk).toString() === JSON.stringify(test.expected).toString()
+						;
+					document.write(testResult ? "<font class='good'>passed</font>" : "<font class='bad'>FAILED</font>");
+					if (!testResult) {
+						failedCount++;
+						document.write("<pre>");
+						document.write("<b>Complete</b>\n");
+						document.write(JSON.stringify(resultComplete, null, 2));
+						document.write("<b>Chunked</b>\n");
+						document.write(JSON.stringify(resultChunk, null, 2));
+						document.write("<h2>Expected</h2>\n");
+						document.write(JSON.stringify(test.expected, null, 2));
+						document.write("</pre>");
+					}
+				} catch (ex) {
+					document.write("<h1>Exception occured during test: " + ex + "</h1>")
+				}
+				document.write("<br>");
+			}
+			document.write("<hr>");
+			document.write("Total tests: " + testCount + "<br>");
+			document.write("Failed tests: " + failedCount + "<br>");
+		</script>
+	
+	</body>
+</html>
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/runtests.min.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/runtests.min.js
new file mode 100644
index 0000000..df33736
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/runtests.min.js
@@ -0,0 +1,75 @@
+/***********************************************
+Copyright 2010, Chris Winberry <chris at winberry.net>. All rights reserved.
+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.
+***********************************************/
+
+var sys = require("sys");
+var fs = require("fs");
+var htmlparser = require("./lib/htmlparser.min");
+
+var testFolder = "./tests";
+var chunkSize = 5;
+
+var testFiles = fs.readdirSync(testFolder);
+var testCount = 0;
+var failedCount = 0;
+for (var i in testFiles) {
+	testCount++;
+	var fileParts = testFiles[i].split(".");
+	fileParts.pop();
+	var moduleName = fileParts.join(".");
+	var test = require(testFolder + "/" + moduleName);
+	var handlerCallback = function handlerCallback (error) {
+		if (error)
+			sys.puts("Handler error: " + error);
+	}
+	var handler = (test.type == "rss") ?
+		new htmlparser.RssHandler(handlerCallback, test.options.handler)
+		:
+		new htmlparser.DefaultHandler(handlerCallback, test.options.handler)
+		;
+	var parser = new htmlparser.Parser(handler, test.options.parser);
+	parser.parseComplete(test.html);
+	var resultComplete = handler.dom;
+	var chunkPos = 0;
+	parser.reset();
+	while (chunkPos < test.html.length) {
+		parser.parseChunk(test.html.substring(chunkPos, chunkPos + chunkSize));
+		chunkPos += chunkSize;
+	}
+	parser.done();
+	var resultChunk = handler.dom;
+	var testResult =
+		sys.inspect(resultComplete, false, null) === sys.inspect(test.expected, false, null)
+		&&
+		sys.inspect(resultChunk, false, null) === sys.inspect(test.expected, false, null)
+		;
+	sys.puts("[" + test.name + "\]: " + (testResult ? "passed" : "FAILED"));
+	if (!testResult) {
+		failedCount++;
+		sys.puts("== Complete ==");
+		sys.puts(sys.inspect(resultComplete, false, null));
+		sys.puts("== Chunked ==");
+		sys.puts(sys.inspect(resultChunk, false, null));
+		sys.puts("== Expected ==");
+		sys.puts(sys.inspect(test.expected, false, null));
+	}
+}
+sys.puts("Total tests: " + testCount);
+sys.puts("Failed tests: " + failedCount);
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/runtests_new.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/runtests_new.js
new file mode 100644
index 0000000..99ec846
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/runtests_new.js
@@ -0,0 +1,75 @@
+/***********************************************
+Copyright 2010, Chris Winberry <chris at winberry.net>. All rights reserved.
+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.
+***********************************************/
+
+var util = require("util");
+var fs = require("fs");
+var htmlparser = require("./new/htmlparser");
+
+var testFolder = "./tests";
+var chunkSize = 5;
+
+var testFiles = fs.readdirSync(testFolder);
+var testCount = 0;
+var failedCount = 0;
+for (var i in testFiles) {
+	testCount++;
+	var fileParts = testFiles[i].split(".");
+	fileParts.pop();
+	var moduleName = fileParts.join(".");
+	var test = require(testFolder + "/" + moduleName);
+	var handlerCallback = function handlerCallback (error) {
+		if (error)
+			util.puts("Handler error: " + error);
+	}
+	var handler = (test.type == "rss") ?
+		new htmlparser.RssHandler(handlerCallback, test.options.handler)
+		:
+		new htmlparser.DefaultHandler(handlerCallback, test.options.handler)
+		;
+	var parser = new htmlparser.Parser(handler, test.options.parser);
+	parser.parseComplete(test.html);
+	var resultComplete = handler.dom;
+	var chunkPos = 0;
+	parser.reset();
+	while (chunkPos < test.html.length) {
+		parser.parseChunk(test.html.substring(chunkPos, chunkPos + chunkSize));
+		chunkPos += chunkSize;
+	}
+	parser.done();
+	var resultChunk = handler.dom;
+	var testResult =
+		util.inspect(resultComplete, false, null) === util.inspect(test.expected, false, null)
+		&&
+		util.inspect(resultChunk, false, null) === util.inspect(test.expected, false, null)
+		;
+	util.puts("[" + test.name + "\]: " + (testResult ? "passed" : "FAILED"));
+	if (!testResult) {
+		failedCount++;
+		util.puts("== Complete ==");
+		util.puts(util.inspect(resultComplete, false, null));
+		util.puts("== Chunked ==");
+		util.puts(util.inspect(resultChunk, false, null));
+		util.puts("== Expected ==");
+		util.puts(util.inspect(test.expected, false, null));
+	}
+}
+util.puts("Total tests: " + testCount);
+util.puts("Failed tests: " + failedCount);
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/snippet.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/snippet.js
new file mode 100644
index 0000000..9448ea3
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/snippet.js
@@ -0,0 +1,15 @@
+//node --prof --prof_auto profile.js
+//deps/v8/tools/mac-tick-processor v8.log
+var sys = require("sys");
+var htmlparser = require("./htmlparser");
+
+var html = "<link>text</link>";
+
+var handler = new htmlparser.DefaultHandler(function(err, dom) {
+	if (err)
+		sys.debug("Error: " + err);
+	else
+		sys.debug(sys.inspect(dom, false, null));
+}, { enforceEmptyTags: true });
+var parser = new htmlparser.Parser(handler);
+parser.parseComplete(html);
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/test01.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/test01.js
new file mode 100644
index 0000000..ca86cd2
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/test01.js
@@ -0,0 +1,105 @@
+var data = "\
+starting text\n\
+<htmL>\n\
+	<body>\n\
+		<div style=\"width:100%\"></div>\n\
+		<div name='\"foo\"'>xxx</div>\n\
+		<div bar=baz>xxx</div>\n\
+		<div wrong='<foo>'>xxx</div>\n\
+	</BODY>\n\
+</html>\n\
+ending text\
+";
+
+console.log(data);
+
+var Mode = {
+	Text: 'text',
+	Tags: 'tag',
+	Attr: 'attr',
+	CData: 'cdata',
+	Comment: 'comment',
+};
+
+var state = {
+	mode: Mode.Text,
+	pos: 0,
+	data: data,
+	pending: null,
+	output: [],
+};
+
+function parse (state) {
+	switch (state.mode) {
+		case Mode.Text:
+			return parseText(state);
+		case Mode.Tags:
+			return parseTags(state);
+		case Mode.Attr:
+			return parseAttr(state);
+		case Mode.CData:
+			return parseCData(state);
+		case Mode.Comment:
+			return parseComment(state);
+	}
+}
+
+function parseText (state) {
+	console.log('parseText', state);
+	var foundPos = state.data.indexOf('<', state.pos);
+	if (foundPos === -1) {
+		if (state.pending !== null) {
+			state.output.push(state.pending + state.data.substring(state.pos, state.data.length));
+			state.pending = null;
+		} else {
+			state.output.push(state.data.substring(state.pos, state.data.length));
+		}
+		state.pos = state.data.length;
+	} else {
+		var text = '';
+		if (state.pending !== null) {
+			text = state.pending + state.data.substring(state.pos, foundPos - 1);
+			state.pending = null;
+		} else {
+			text = state.data.substring(state.pos, foundPos - 1);
+		}
+		state.output.push({ type: Mode.Text, data: text });
+		state.pos = foundPos + 1;
+		state.mode = Mode.Tags;
+	}
+}
+
+var re_parseTags = /[\s>]/g;
+function parseTags (state) {
+	console.log('parseTags', state);
+	re_parseTags.lastIndex = state.pos;
+	var match = re_parseTags.exec(state.data);
+	if (match) {
+		if (match[0] === '>') {
+			console.log('Just tag name', state.data.substring(state.pos, match.index));
+			//process tag name
+		} else {
+			//process tag name
+			//scan for attributes
+		}
+	} else {
+		//end of tag?
+	}
+	process.exit();
+}
+
+function parseAttr (state) {
+	console.log('parseAttr', state);
+}
+
+function parseCData (state) {
+	console.log('parseCData', state);
+}
+
+function parseComment (state) {
+	console.log('parseComment', state);
+}
+
+while (state.pos < state.data.length) {
+	parse(state);
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/testdata/api.html b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/testdata/api.html
new file mode 100644
index 0000000..e7a71c4
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/testdata/api.html
@@ -0,0 +1,3311 @@
+<!DOCTYPE html>
+<head> 
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+	<meta name='generator' value='Ronn/v0.4.1'> 
+	<title>node(1) -- evented I/O for V8 JavaScript</title> 
+	<style type='text/css'> 
+		*{
+			margin: 0;padding: 0;
+		}
+		html,body
+		{
+			height: 100%;
+		}
+		body
+		{
+			font-family:helvetica, arial, sans serif;
+			background:#22252a;
+			color:#eee;
+			font-size:16px;
+      line-height:1.3;
+			position:relative;
+			min-width: 690px;
+		}
+		a
+		{
+			color:#CD5;
+		}
+		a:focus
+		{
+			outline: none;
+			-moz-outline: none;
+		}
+		pre
+		{
+			overflow: hidden;
+		}
+		li
+		{
+			list-style: inside;
+		}
+		#man,#man code,#man pre,#man tt,#man kbd,#man samp
+		{
+			line-height:1.6;
+			color:#eee;
+			background:#22252a;
+		}
+
+		#man
+		{
+			margin: 0;
+			position: absolute;
+			top:0;
+			bottom:0;
+			left: 225px;
+			right: 0;
+			overflow: auto;
+		}
+		#man-content
+		{
+			padding: 0 20px;
+			max-width: 650px;
+		}
+		#man h1,#man h2,#man h3
+		{
+			color:#DCDDDE;
+			clear:left;		
+		}
+
+		#man h1
+		{
+			background:url("http://nodejs.org/logo.png") no-repeat scroll center 0 transparent;
+			height:111px;
+			margin:15px 0 20px;
+			text-align:center;
+			text-indent:-2000px;
+		}
+
+		#man h2
+		{
+			font-size:18px;
+			background:#000;
+			color:#CD5;
+			margin:10px 0;
+			padding:5px 10px;
+		}
+
+		#man h3
+		{
+			font-size:16px;
+			margin:0 0 0 0ex;
+		}
+
+		#man p,#man ul,#man ol,#man dl,#man pre
+		{
+			margin:0 0 18px;
+		}
+
+		#man pre
+		{
+			color:#CCCDCE;
+			background:#121314;
+			border-left:2ex solid #222;
+			margin:0 0 20px;
+			padding:5px 7px;
+		}
+
+		#man pre + h2,#man pre + h3
+		{
+			margin-top:22px;
+		}
+
+		#man h2 + pre,#man h3 + pre
+		{
+			margin-top:5px;
+		}
+
+		#man > p,#man > ul,#man > ol,#man > dl,#man > pre
+		{
+			margin-left:5%;
+		}
+
+		#man dt
+		{
+			clear:left;
+			margin:0;
+		}
+
+		#man dt.flush
+		{
+			float:left;
+			width:8ex;
+		}
+
+		#man dd
+		{
+			margin:0 0 0 9ex;
+		}
+
+		#man code,#man strong,#man b
+		{
+			font-weight:bold;
+			color:#ECEDEE;
+		}
+
+		#man pre code
+		{
+			font-weight:normal;
+			color:#DCDDDE;
+			background:inherit;
+		}
+
+		#man em,var,u
+		{
+			font-style:normal;
+			color:#CCCDCE;
+			border-bottom:1px solid #999;
+		}
+
+		#man ol.man,#man ol.man li
+		{
+			float:left;
+			width:33%;
+			list-style-type:none;
+			text-transform:uppercase;
+			font-size:18px;
+			color:#666;
+			letter-spacing:1px;
+			margin:2px 0 10px;
+			padding:0;
+		}
+
+		#man ol.man
+		{
+			width:100%;
+		}
+
+		#man ol.man li.tl
+		{
+			text-align:left;
+		}
+
+		#man ol.man li.tc
+		{
+			text-align:center;
+			letter-spacing:4px;
+		}
+
+		#man ol.man li.tr
+		{
+			text-align:right;
+		}
+
+		#man ol.man a
+		{
+			color:#666;
+		}
+
+		#man ol.man a:hover
+		{
+			color:#CCCDCE;
+		}
+
+		#toc
+		{
+			position: absolute;
+			top:0;
+			bottom:0;
+			left: 0;
+			padding-left: 30px;
+			width: 195px;
+			overflow: auto;
+			overflow-x: hidden;
+			font-size: 15px;
+		}
+		#toc li
+		{
+			text-wrap: word-wrap;
+		}
+		#toc a
+		{
+			display: inline-block;
+			width: 100%;
+			color: #fff;
+			text-decoration:none;
+		}
+		#toc > a:hover
+		{
+			color: rgba(255,255,255,0.7);
+		}
+		#toc > ul > li
+		{
+			border-bottom:1px solid #0f1214;
+			padding:5px 0 5px 5px;
+			list-style: none;
+			line-height: 1.3;
+		}
+		#toc ul ul
+		{
+			display: none;
+		}
+		#toc ul ul > li
+		{
+			border-top:1px solid rgba(0, 0, 0, 0.1);
+			color:#FFFFFF;
+			font-size:85%;
+			line-height:1.3;
+			list-style:disc outside none;
+			margin-left:25px;
+			max-width:165px;
+			padding:3px 0 5px 5px;
+		}
+		#toc li.active > a
+		{
+			color:#CD5;
+		}
+
+		.sh_sourceCode
+		{
+			font-family: monospace;
+			overflow:hidden;
+		}
+
+		#toc .toggler
+		{
+			-moz-user-select:none;
+			background:none repeat scroll 0 0 #000000;
+			color:#FFFFFF;
+			display:inline-block;
+			font-weight:bold;
+			height:31px;
+			line-height:32px;
+			margin:-5px 8px -18px -33px;
+			outline:medium none;
+			padding:0;
+			text-align:center;
+			width:25px;
+		}
+		.current-section
+		{
+			position: fixed;
+			top: 0;
+			margin: 0 !important;
+		}
+		#toctitle
+		{
+			background:none repeat scroll 0 0 #000000;
+			color:#CCDD55;
+			font-size:18px;
+			margin: 0 0 10px -30px;
+			padding: 10px;
+		}
+	</style>
+<link rel="stylesheet" href="./sh_vim-dark.css" type="text/css" />
+</head>
+<body>
+
+<div id="toc">
+	<div id="toctitle">Node v0.1.99</div>
+	<noscript>JavaScript must be enabled in your browser to display the table of contents.</noscript>
+</div>
+<div id='man'>
+<div id="man-content">
+<h1 class='man-title'>node(1)</h1>
+
+<ol class='head man'>
+  <li class='tl'>node(1)</li>
+
+  <li class='tc'></li>
+  <li class='tr'>node(1)</li>
+</ol>
+<h2 id='NAME'>NAME</h2>
+<p><code>node</code> -- evented I/O for V8 JavaScript</p>
+
+<h2 id="Synopsis">Synopsis</h2>
+
+<p>An example of a web server written with Node which responds with 'Hello
+World':</p>
+
+<pre><code>var sys = require('sys'),
+  http = require('http');
+
+http.createServer(function (request, response) {
+  response.writeHead(200, {'Content-Type': 'text/plain'});
+  response.end('Hello World\n');
+}).listen(8124);
+
+sys.puts('Server running at http://127.0.0.1:8124/');
+</code></pre>
+
+<p>To run the server, put the code into a file called <code>example.js</code> and execute
+it with the node program</p>
+
+<pre><code>> node example.js
+Server running at http://127.0.0.1:8124/
+</code></pre>
+
+<p>All of the examples in the documentation can be run similarly.</p>
+
+<h2 id="Standard Modules">Standard Modules</h2>
+
+<p>Node comes with a number of modules that are compiled in to the process,
+most of which are documented below.  The most common way to use these modules
+is with <code>require('name')</code> and then assigning the return value to a local
+variable with the same name as the module.</p>
+
+<p>Example:</p>
+
+<pre><code>var sys = require('sys');
+</code></pre>
+
+<p>It is possible to extend node with other modules.  See <code>'Modules'</code></p>
+
+<h2 id="Buffers">Buffers</h2>
+
+<p>Pure Javascript is Unicode friendly but not nice to binary data.  When
+dealing with TCP streams or the file system, it's necessary to handle octet
+streams. Node has several strategies for manipulating, creating, and
+consuming octet streams.</p>
+
+<p>Raw data is stored in instances of the <code>Buffer</code> class. A <code>Buffer</code> is similar
+to an array of integers but corresponds to a raw memory allocation outside
+the V8 heap. A <code>Buffer</code> cannot be resized.
+Access the class with <code>require('buffer').Buffer</code>.</p>
+
+<p>Converting between Buffers and JavaScript string objects requires an explicit encoding
+method.  Node supports 3 string encodings: UTF-8 (<code>'utf8'</code>), ASCII (<code>'ascii'</code>), and
+Binary (<code>'binary'</code>).</p>
+
+<ul>
+<li><p><code>'ascii'</code> - for 7 bit ASCII data only.  This encoding method is very fast, and will
+strip the high bit if set.</p></li>
+<li><p><code>'binary'</code> - for 8 bit binary data such as images.</p></li>
+<li><p><code>'utf8'</code> - Unicode characters.  Many web pages and other document formats use UTF-8.</p></li>
+</ul>
+
+
+<h3>new Buffer(size)</h3>
+
+<p>Allocates a new buffer of <code>size</code> octets.</p>
+
+<h3>new Buffer(array)</h3>
+
+<p>Allocates a new buffer using an <code>array</code> of octets.</p>
+
+<h3>new Buffer(str, encoding = 'utf8')</h3>
+
+<p>Allocates a new buffer containing the given <code>str</code>.</p>
+
+<h3>buffer.write(string, encoding, offset)</h3>
+
+<p>Writes <code>string</code> to the buffer at <code>offset</code> using the given encoding. Returns
+number of octets written.  If <code>buffer</code> did not contain enough space to fit
+the entire string it will write a partial amount of the string. In the case
+of <code>'utf8'</code> encoding, the method will not write partial characters.</p>
+
+<p>Example: write a utf8 string into a buffer, then print it</p>
+
+<pre><code>var sys = require('sys'),
+  Buffer = require('buffer').Buffer,
+  buf = new Buffer(256),
+  len;
+
+len = buf.write('\u00bd + \u00bc = \u00be', 'utf8', 0);
+sys.puts(len + " bytes: " + buf.toString('utf8', 0, len));
+
+// 12 bytes: ½ + ¼ = ¾
+</code></pre>
+
+<h3>buffer.toString(encoding, start, end)</h3>
+
+<p>Decodes and returns a string from buffer data encoded with <code>encoding</code>
+beginning at <code>start</code> and ending at <code>end</code>.</p>
+
+<p>See <code>buffer.write()</code> example, above.</p>
+
+<h3>buffer[index]</h3>
+
+<p>Get and set the octet at <code>index</code>. The values refer to individual bytes,
+so the legal range is between <code>0x00</code> and <code>0xFF</code> hex or <code>0</code> and <code>255</code>.</p>
+
+<p>Example: copy an ASCII string into a buffer, one byte at a time:</p>
+
+<pre><code>var sys = require('sys'),
+  Buffer = require('buffer').Buffer,
+  str = "node.js",
+  buf = new Buffer(str.length),
+  i;
+
+for (i = 0; i < str.length ; i += 1) {
+  buf[i] = str.charCodeAt(i);
+}
+
+sys.puts(buf);
+
+// node.js
+</code></pre>
+
+<h3>Buffer.byteLength(string, encoding)</h3>
+
+<p>Gives the actual byte length of a string.  This is not the same as
+<code>String.prototype.length</code> since that returns the number of <em>characters</em> in a
+string.</p>
+
+<p>Example:</p>
+
+<pre><code>var sys = require('sys'),
+  Buffer = require('buffer').Buffer,
+  str = '\u00bd + \u00bc = \u00be';
+
+sys.puts(str + ": " + str.length + " characters, " + 
+  Buffer.byteLength(str, 'utf8') + " bytes");
+
+// ½ + ¼ = ¾: 9 characters, 12 bytes
+</code></pre>
+
+<h3>buffer.length</h3>
+
+<p>The size of the buffer in bytes.  Note that this is not necessarily the size
+of the contents. <code>length</code> refers to the amount of memory allocated for the
+buffer object.  It does not change when the contents of the buffer are changed.</p>
+
+<pre><code>var sys = require('sys'),
+  Buffer = require('buffer').Buffer,
+  buf = new Buffer(1234);
+
+sys.puts(buf.length);
+buf.write("some string", "ascii", 0);
+sys.puts(buf.length);
+
+// 1234
+// 1234
+</code></pre>
+
+<h3>buffer.copy(targetBuffer, targetStart, sourceStart, sourceEnd)</h3>
+
+<p>Does a memcpy() between buffers.</p>
+
+<p>Example: build two Buffers, then copy <code>buf1</code> from byte 16 through byte 20
+into <code>buf2</code>, starting at the 8th byte in <code>buf2</code>.</p>
+
+<pre><code>var sys = require('sys'),
+  Buffer = require('buffer').Buffer,
+  buf1 = new Buffer(26),
+  buf2 = new Buffer(26),
+  i;
+
+for (i = 0 ; i < 26 ; i += 1) {
+  buf1[i] = i + 97; // 97 is ASCII a
+  buf2[i] = 33; // ASCII !
+}
+
+buf1.copy(buf2, 8, 16, 20);
+sys.puts(buf2.toString('ascii', 0, 25));
+
+// !!!!!!!!qrst!!!!!!!!!!!!!
+</code></pre>
+
+<h3>buffer.slice(start, end)</h3>
+
+<p>Returns a new buffer which references the
+same memory as the old, but offset and cropped by the <code>start</code> and <code>end</code>
+indexes.</p>
+
+<p><strong>Modifying the new buffer slice will modify memory in the original buffer!</strong></p>
+
+<p>Example: build a Buffer with the ASCII alphabet, take a slice, then modify one byte
+from the original Buffer.</p>
+
+<pre><code>var sys = require('sys'),
+  Buffer = require('buffer').Buffer,
+  buf1 = new Buffer(26), buf2,
+  i;
+
+for (i = 0 ; i < 26 ; i += 1) {
+  buf1[i] = i + 97; // 97 is ASCII a
+}
+
+buf2 = buf1.slice(0, 3);
+sys.puts(buf2.toString('ascii', 0, buf2.length));
+buf1[0] = 33;
+sys.puts(buf2.toString('ascii', 0, buf2.length));
+
+// abc
+// !bc
+</code></pre>
+
+<h2 id="EventEmitter">EventEmitter</h2>
+
+<p>Many objects in Node emit events: a TCP server emits an event each time
+there is a stream, a child process emits an event when it exits. All
+objects which emit events are instances of <code>events.EventEmitter</code>.</p>
+
+<p>Events are represented by a camel-cased string. Here are some examples:
+<code>'stream'</code>, <code>'data'</code>, <code>'messageBegin'</code>.</p>
+
+<p>Functions can be then be attached to objects, to be executed when an event
+is emitted. These functions are called <em>listeners</em>.</p>
+
+<p><code>require('events').EventEmitter</code> to access the <code>EventEmitter</code> class.</p>
+
+<p>All EventEmitters emit the event <code>'newListener'</code> when new listeners are
+added.</p>
+
+<p>When an EventEmitter experiences an error, the typical action is to emit an
+<code>'error'</code> event.  Error events are special--if there is no handler for them
+they will print a stack trace and exit the program.</p>
+
+<h3>Event: 'newListener'</h3>
+
+<p><code>function (event, listener) { }</code></p>
+
+<p>This event is made any time someone adds a new listener.</p>
+
+<h3>Event: 'error'</h3>
+
+<p><code>function (exception) { }</code></p>
+
+<p>If an error was encountered, then this event is emitted. This event is
+special - when there are no listeners to receive the error Node will
+terminate execution and display the exception's stack trace.</p>
+
+<h3>emitter.addListener(event, listener)</h3>
+
+<p>Adds a listener to the end of the listeners array for the specified event.</p>
+
+<pre><code>server.addListener('stream', function (stream) {
+  sys.puts('someone connected!');
+});
+</code></pre>
+
+<h3>emitter.removeListener(event, listener)</h3>
+
+<p>Remove a listener from the listener array for the specified event.
+<strong>Caution</strong>: changes array indices in the listener array behind the listener.</p>
+
+<h3>emitter.removeAllListeners(event)</h3>
+
+<p>Removes all listeners from the listener array for the specified event.</p>
+
+<h3>emitter.listeners(event)</h3>
+
+<p>Returns an array of listeners for the specified event. This array can be
+manipulated, e.g. to remove listeners.</p>
+
+<h3>emitter.emit(event, arg1, arg2, ...)</h3>
+
+<p>Execute each of the listeners in order with the supplied arguments.</p>
+
+<h2 id="Streams">Streams</h2>
+
+<p>A stream is an abstract interface implemented by various objects in Node.
+For example a request to an HTTP server is a stream, as is stdout. Streams
+are readable, writable, or both. All streams are instances of <code>EventEmitter</code>.</p>
+
+<h2 id="Readable Stream">Readable Stream</h2>
+
+<p>A <strong>readable stream</strong> has the following methods, members, and events.</p>
+
+<h3>Event: 'data'</h3>
+
+<p><code>function (data) { }</code></p>
+
+<p>The <code>'data'</code> event emits either a <code>Buffer</code> (by default) or a string if
+<code>setEncoding()</code> was used.</p>
+
+<h3>Event: 'end'</h3>
+
+<p><code>function () { }</code></p>
+
+<p>Emitted when the stream has received an EOF (FIN in TCP terminology).
+Indicates that no more <code>'data'</code> events will happen. If the stream is also
+writable, it may be possible to continue writing.</p>
+
+<h3>Event: 'error'</h3>
+
+<p><code>function (exception) { }</code></p>
+
+<p>Emitted if there was an error receiving data.</p>
+
+<h3>Event: 'close'</h3>
+
+<p><code>function () { }</code></p>
+
+<p>Emitted when the underlying file descriptor has be closed. Not all streams
+will emit this.  (For example, an incoming HTTP request will not emit
+<code>'close'</code>.)</p>
+
+<h3>stream.setEncoding(encoding)</h3>
+
+<p>Makes the data event emit a string instead of a <code>Buffer</code>. <code>encoding</code> can be
+<code>'utf8'</code>, <code>'ascii'</code>, or <code>'binary'</code>.</p>
+
+<h3>stream.pause()</h3>
+
+<p>Pauses the incoming <code>'data'</code> events.</p>
+
+<h3>stream.resume()</h3>
+
+<p>Resumes the incoming <code>'data'</code> events after a <code>pause()</code>.</p>
+
+<h3>stream.destroy()</h3>
+
+<p>Closes the underlying file descriptor. Stream will not emit any more events.</p>
+
+<h2 id="Writable Stream">Writable Stream</h2>
+
+<p>A <strong>writable stream</strong> has the following methods, members, and events.</p>
+
+<h3>Event: 'drain'</h3>
+
+<p><code>function () { }</code></p>
+
+<p>Emitted after a <code>write()</code> method was called that returned <code>false</code> to
+indicate that it is safe to write again.</p>
+
+<h3>Event: 'error'</h3>
+
+<p><code>function (exception) { }</code></p>
+
+<p>Emitted on error with the exception <code>exception</code>.</p>
+
+<h3>Event: 'close'</h3>
+
+<p><code>function () { }</code></p>
+
+<p>Emitted when the underlying file descriptor has been closed.</p>
+
+<h3>stream.write(string, encoding)</h3>
+
+<p>Writes <code>string</code> with the given <code>encoding</code> to the stream.  Returns <code>true</code> if
+the string has been flushed to the kernel buffer.  Returns <code>false</code> to
+indicate that the kernel buffer is full, and the data will be sent out in
+the future. The <code>'drain'</code> event will indicate when the kernel buffer is
+empty again. The <code>encoding</code> defaults to <code>'utf8'</code>.</p>
+
+<h3>stream.write(buffer)</h3>
+
+<p>Same as the above except with a raw buffer.</p>
+
+<h3>stream.end()</h3>
+
+<p>Terminates the stream with EOF or FIN.</p>
+
+<h3>stream.end(string, encoding)</h3>
+
+<p>Sends <code>string</code> with the given <code>encoding</code> and terminates the stream with EOF
+or FIN. This is useful to reduce the number of packets sent.</p>
+
+<h3>stream.end(buffer)</h3>
+
+<p>Same as above but with a <code>buffer</code>.</p>
+
+<h3>stream.destroy()</h3>
+
+<p>Closes the underlying file descriptor. Stream will not emit any more events.</p>
+
+<h2 id="Global Objects">Global Objects</h2>
+
+<p>These object are available in the global scope and can be accessed from anywhere.</p>
+
+<h3>global</h3>
+
+<p>The global namespace object.</p>
+
+<h3>process</h3>
+
+<p>The process object. Most stuff lives in here. See the <code>'process object'</code>
+section.</p>
+
+<h3>require()</h3>
+
+<p>To require modules. See the <code>'Modules'</code> section.</p>
+
+<h3>require.paths</h3>
+
+<p>An array of search paths for <code>require()</code>.  This array can be modified to add custom paths.</p>
+
+<p>Example: add a new path to the beginning of the search list</p>
+
+<pre><code>var sys = require('sys');
+
+require.paths.unshift('/usr/local/node');
+sys.puts(require.paths);
+// /usr/local/node,/Users/mjr/.node_libraries
+</code></pre>
+
+<h3>__filename</h3>
+
+<p>The filename of the script being executed.  This is the absolute path, and not necessarily
+the same filename passed in as a command line argument.</p>
+
+<h3>__dirname</h3>
+
+<p>The dirname of the script being executed.</p>
+
+<p>Example: running <code>node example.js</code> from <code>/Users/mjr</code></p>
+
+<pre><code>var sys = require('sys');
+sys.puts(__filename);
+sys.puts(__dirname);
+// /Users/mjr/example.js
+// /Users/mjr
+</code></pre>
+
+<h3>module</h3>
+
+<p>A reference to the current module (of type <code>process.Module</code>). In particular
+<code>module.exports</code> is the same as the <code>exports</code> object. See <code>src/process.js</code>
+for more information.</p>
+
+<h2 id="process">process</h2>
+
+<p>The <code>process</code> object is a global object and can be accessed from anywhere.
+It is an instance of <code>EventEmitter</code>.</p>
+
+<h3>Event: 'exit'</h3>
+
+<p><code>function () {}</code></p>
+
+<p>Emitted when the process is about to exit.  This is a good hook to perform
+constant time checks of the module's state (like for unit tests).  The main
+event loop will no longer be run after the 'exit' callback finishes, so
+timers may not be scheduled.</p>
+
+<p>Example of listening for <code>exit</code>:</p>
+
+<pre><code>var sys = require('sys');
+
+process.addListener('exit', function () {
+  process.nextTick(function () {
+   sys.puts('This will not run');
+  });
+  sys.puts('About to exit.');
+});
+</code></pre>
+
+<h3>Event: 'uncaughtException'</h3>
+
+<p><code>function (err) { }</code></p>
+
+<p>Emitted when an exception bubbles all the way back to the event loop. If a
+listener is added for this exception, the default action (which is to print
+a stack trace and exit) will not occur.</p>
+
+<p>Example of listening for <code>uncaughtException</code>:</p>
+
+<pre><code>var sys = require('sys');
+
+process.addListener('uncaughtException', function (err) {
+  sys.puts('Caught exception: ' + err);
+});
+
+setTimeout(function () {
+  sys.puts('This will still run.');
+}, 500);
+
+// Intentionally cause an exception, but don't catch it.
+nonexistentFunc();
+sys.puts('This will not run.');
+</code></pre>
+
+<p>Note that <code>uncaughtException</code> is a very crude mechanism for exception
+handling.  Using try / catch in your program will give you more control over
+your program's flow.  Especially for server programs that are designed to
+stay running forever, <code>uncaughtException</code> can be a useful safety mechanism.</p>
+
+<h3>Signal Events</h3>
+
+<p><code>function () {}</code></p>
+
+<p>Emitted when the processes receives a signal. See sigaction(2) for a list of
+standard POSIX signal names such as SIGINT, SIGUSR1, etc.</p>
+
+<p>Example of listening for <code>SIGINT</code>:</p>
+
+<pre><code>var sys = require('sys'),
+    stdin = process.openStdin();
+
+process.addListener('SIGINT', function () {
+  sys.puts('Got SIGINT.  Press Control-D to exit.');
+});
+</code></pre>
+
+<p>An easy way to send the <code>SIGINT</code> signal is with <code>Control-C</code> in most terminal
+programs.</p>
+
+<h3>process.stdout</h3>
+
+<p>A writable stream to <code>stdout</code>.</p>
+
+<p>Example: the definition of <code>sys.puts</code></p>
+
+<pre><code>exports.puts = function (d) {
+  process.stdout.write(d + '\n');
+};
+</code></pre>
+
+<h3>process.openStdin()</h3>
+
+<p>Opens the standard input stream, returns a readable stream.</p>
+
+<p>Example of opening standard input and listening for both events:</p>
+
+<pre><code>var stdin = process.openStdin();
+
+stdin.setEncoding('utf8');
+
+stdin.addListener('data', function (chunk) {
+  process.stdout.write('data: ' + chunk);
+});
+
+stdin.addListener('end', function () {
+  process.stdout.write('end');
+});
+</code></pre>
+
+<h3>process.argv</h3>
+
+<p>An array containing the command line arguments.  The first element will be
+'node', the second element will be the name of the JavaScript file.  The
+next elements will be any additional command line arguments.</p>
+
+<pre><code>// print process.argv
+var sys = require('sys');
+
+process.argv.forEach(function (val, index, array) {
+  sys.puts(index + ': ' + val);
+});
+</code></pre>
+
+<p>This will generate:</p>
+
+<pre><code>$ node process-2.js one two=three four
+0: node
+1: /Users/mjr/work/node/process-2.js
+2: one
+3: two=three
+4: four
+</code></pre>
+
+<h3>process.chdir(directory)</h3>
+
+<p>Changes the current working directory of the process or throws an exception if that fails.</p>
+
+<pre><code>var sys = require('sys');
+
+sys.puts('Starting directory: ' + process.cwd());
+try {
+  process.chdir('/tmp');
+  sys.puts('New directory: ' + process.cwd());
+}
+catch (err) {
+  sys.puts('chdir: ' + err);
+}
+</code></pre>
+
+<h3>process.compile(code, filename)</h3>
+
+<p>Similar to <code>eval</code> except that you can specify a <code>filename</code> for better
+error reporting and the <code>code</code> cannot see the local scope.  The value of <code>filename</code>
+will be used as a filename if a stack trace is generated by the compiled code.</p>
+
+<p>Example of using <code>process.compile</code> and <code>eval</code> to run the same code:</p>
+
+<pre><code>var sys = require('sys'),
+    localVar = 123,
+    compiled, evaled;
+
+compiled = process.compile('localVar = 1;', 'myfile.js');
+sys.puts('localVar: ' + localVar + ', compiled: ' + compiled);
+evaled = eval('localVar = 1;');
+sys.puts('localVar: ' + localVar + ', evaled: ' + evaled);
+
+// localVar: 123, compiled: 1
+// localVar: 1, evaled: 1
+</code></pre>
+
+<p><code>process.compile</code> does not have access to the local scope, so <code>localVar</code> is unchanged.
+<code>eval</code> does have access to the local scope, so <code>localVar</code> is changed.</p>
+
+<p>In case of syntax error in <code>code</code>, <code>process.compile</code> exits node.</p>
+
+<p>See also: <code>Script</code></p>
+
+<h3>process.cwd()</h3>
+
+<p>Returns the current working directory of the process.</p>
+
+<pre><code>require('sys').puts('Current directory: ' + process.cwd());
+</code></pre>
+
+<h3>process.env</h3>
+
+<p>An object containing the user environment. See environ(7).</p>
+
+<h3>process.exit(code)</h3>
+
+<p>Ends the process with the specified <code>code</code>.  If omitted, exit uses the
+'success' code <code>0</code>.</p>
+
+<p>To exit with a 'failure' code:</p>
+
+<pre><code>process.exit(1);
+</code></pre>
+
+<p>The shell that executed node should see the exit code as 1.</p>
+
+<h3>process.getgid(), process.setgid(id)</h3>
+
+<p>Gets/sets the group identity of the process. (See setgid(2).)  This is the numerical group id, not the group name.</p>
+
+<pre><code>var sys = require('sys');
+
+sys.puts('Current gid: ' + process.getgid());
+try {
+  process.setgid(501);
+  sys.puts('New gid: ' + process.getgid());
+}
+catch (err) {
+  sys.puts('Failed to set gid: ' + err);
+}
+</code></pre>
+
+<h3>process.getuid(), process.setuid(id)</h3>
+
+<p>Gets/sets the user identity of the process. (See setuid(2).)  This is the numerical userid, not the username.</p>
+
+<pre><code>var sys = require('sys');
+
+sys.puts('Current uid: ' + process.getuid());
+try {
+  process.setuid(501);
+  sys.puts('New uid: ' + process.getuid());
+}
+catch (err) {
+  sys.puts('Failed to set uid: ' + err);
+}
+</code></pre>
+
+<h3>process.version</h3>
+
+<p>A compiled-in property that exposes <code>NODE_VERSION</code>.</p>
+
+<pre><code>require('sys').puts('Version: ' + process.version);
+</code></pre>
+
+<h3>process.installPrefix</h3>
+
+<p>A compiled-in property that exposes <code>NODE_PREFIX</code>.</p>
+
+<pre><code>require('sys').puts('Prefix: ' + process.installPrefix);
+</code></pre>
+
+<h3>process.kill(pid, signal)</h3>
+
+<p>Send a signal to a process. <code>pid</code> is the process id and <code>signal</code> is the
+string describing the signal to send.  Signal names are strings like
+'SIGINT' or 'SIGUSR1'.  If omitted, the signal will be 'SIGINT'.
+See kill(2) for more information.</p>
+
+<p>Note that just because the name of this function is <code>process.kill</code>, it is
+really just a signal sender, like the <code>kill</code> system call.  The signal sent
+may do something other than kill the target process.</p>
+
+<p>Example of sending a signal to yourself:</p>
+
+<pre><code>var sys = require('sys');
+
+process.addListener('SIGHUP', function () {
+  sys.puts('Got SIGHUP signal.');
+});
+
+setTimeout(function () {
+  sys.puts('Exiting.');
+  process.exit(0);
+}, 100);
+
+process.kill(process.pid, 'SIGHUP');
+</code></pre>
+
+<h3>process.pid</h3>
+
+<p>The PID of the process.</p>
+
+<pre><code>require('sys').puts('This process is pid ' + process.pid);
+</code></pre>
+
+<h3>process.platform</h3>
+
+<p>What platform you're running on. <code>'linux2'</code>, <code>'darwin'</code>, etc.</p>
+
+<pre><code>require('sys').puts('This platform is ' + process.platform);
+</code></pre>
+
+<h3>process.memoryUsage()</h3>
+
+<p>Returns an object describing the memory usage of the Node process.</p>
+
+<pre><code>var sys = require('sys');
+
+sys.puts(sys.inspect(process.memoryUsage()));
+</code></pre>
+
+<p>This will generate:</p>
+
+<pre><code>{ rss: 4935680
+, vsize: 41893888
+, heapTotal: 1826816
+, heapUsed: 650472
+}
+</code></pre>
+
+<p><code>heapTotal</code> and <code>heapUsed</code> refer to V8's memory usage.</p>
+
+<h3>process.nextTick(callback)</h3>
+
+<p>On the next loop around the event loop call this callback.
+This is <em>not</em> a simple alias to <code>setTimeout(fn, 0)</code>, it's much more
+efficient.</p>
+
+<pre><code>var sys = require('sys');
+
+process.nextTick(function () {
+  sys.puts('nextTick callback');
+});
+</code></pre>
+
+<h3>process.umask(mask)</h3>
+
+<p>Sets or read the process's file mode creation mask. Child processes inherit
+the mask from the parent process. Returns the old mask if <code>mask</code> argument is
+given, otherwise returns the current mask.</p>
+
+<pre><code>var sys = require('sys'),
+    oldmask, newmask = 0644;
+
+oldmask = process.umask(newmask);
+sys.puts('Changed umask from: ' + oldmask.toString(8) +
+         ' to ' + newmask.toString(8));
+</code></pre>
+
+<h2 id="sys">sys</h2>
+
+<p>These functions are in the module <code>'sys'</code>. Use <code>require('sys')</code> to access
+them.</p>
+
+<h3>sys.puts(string)</h3>
+
+<p>Outputs <code>string</code> and a trailing newline to <code>stdout</code>.</p>
+
+<pre><code>require('sys').puts('String with a newline');
+</code></pre>
+
+<h3>sys.print(string)</h3>
+
+<p>Like <code>puts()</code> but without the trailing newline.</p>
+
+<pre><code>require('sys').print('String with no newline');
+</code></pre>
+
+<h3>sys.debug(string)</h3>
+
+<p>A synchronous output function. Will block the process and
+output <code>string</code> immediately to <code>stderr</code>.</p>
+
+<pre><code>require('sys').debug('message on stderr');
+</code></pre>
+
+<h3>sys.log(string)</h3>
+
+<p>Output with timestamp on <code>stdout</code>.</p>
+
+<pre><code>require('sys').log('Timestmaped message.');
+</code></pre>
+
+<h3>sys.inspect(object, showHidden, depth)</h3>
+
+<p>Return a string representation of <code>object</code>, which is useful for debugging.</p>
+
+<p>If <code>showHidden</code> is <code>true</code>, then the object's non-enumerable properties will be
+shown too.</p>
+
+<p>If <code>depth</code> is provided, it tells <code>inspect</code> how many times to recurse while
+formatting the object. This is useful for inspecting large complicated objects.</p>
+
+<p>The default is to only recurse twice.  To make it recurse indefinitely, pass
+in <code>null</code> for <code>depth</code>.</p>
+
+<p>Example of inspecting all properties of the <code>sys</code> object:</p>
+
+<pre><code>var sys = require('sys');
+
+sys.puts(sys.inspect(sys, true, null));
+</code></pre>
+
+<h2 id="Timers">Timers</h2>
+
+<h3>setTimeout(callback, delay, [arg, ...])</h3>
+
+<p>To schedule execution of <code>callback</code> after <code>delay</code> milliseconds. Returns a
+<code>timeoutId</code> for possible use with <code>clearTimeout()</code>.</p>
+
+<h3>clearTimeout(timeoutId)</h3>
+
+<p>Prevents a timeout from triggering.</p>
+
+<h3>setInterval(callback, delay, [arg, ...])</h3>
+
+<p>To schedule the repeated execution of <code>callback</code> every <code>delay</code> milliseconds.
+Returns a <code>intervalId</code> for possible use with <code>clearInterval()</code>.</p>
+
+<p>Optionally, you can also pass arguments to the callback.</p>
+
+<h3>clearInterval(intervalId)</h3>
+
+<p>Stops a interval from triggering.</p>
+
+<h2 id="Child Processes">Child Processes</h2>
+
+<p>Node provides a tri-directional <code>popen(3)</code> facility through the <code>ChildProcess</code>
+class.</p>
+
+<p>It is possible to stream data through the child's <code>stdin</code>, <code>stdout</code>, and
+<code>stderr</code> in a fully non-blocking way.</p>
+
+<p>To create a child process use <code>require('child_process').spawn()</code>.</p>
+
+<p>Child processes always have three streams associated with them. <code>child.stdin</code>,
+<code>child.stdout</code>, and <code>child.stderr</code>.</p>
+
+<p><code>ChildProcess</code> is an EventEmitter.</p>
+
+<h3>Event:  'exit'</h3>
+
+<p><code>function (code, signal) {}</code></p>
+
+<p>This event is emitted after the child process ends. If the process terminated
+normally, <code>code</code> is the final exit code of the process, otherwise <code>null</code>. If
+the process terminated due to receipt of a signal, <code>signal</code> is the string name
+of the signal, otherwise <code>null</code>.</p>
+
+<p>After this event is emitted, the <code>'output'</code> and <code>'error'</code> callbacks will no
+longer be made.</p>
+
+<p>See <code>waitpid(2)</code>.</p>
+
+<h3>child_process.spawn(command, args, env)</h3>
+
+<p>Launches a new process with the given <code>command</code>, command line arguments, and
+environment variables.  If omitted, <code>args</code> defaults to an empty Array, and <code>env</code>
+defaults to <code>process.env</code>.</p>
+
+<p>Example of running <code>ls -lh /usr</code>, capturing <code>stdout</code>, <code>stderr</code>, and the exit code:</p>
+
+<pre><code>var sys   = require('sys'),
+    spawn = require('child_process').spawn,
+    ls    = spawn('ls', ['-lh', '/usr']);
+
+ls.stdout.addListener('data', function (data) {
+  sys.print('stdout: ' + data);
+});
+
+ls.stderr.addListener('data', function (data) {
+  sys.print('stderr: ' + data);
+});
+
+ls.addListener('exit', function (code) {
+  sys.puts('child process exited with code ' + code);
+});
+</code></pre>
+
+<p>Example of checking for failed exec:</p>
+
+<pre><code>var sys   = require('sys'),
+    spawn = require('child_process').spawn,
+    child = spawn('bad_command');
+
+child.stderr.addListener('data', function (data) {
+  if (/^execvp\(\)/.test(data.asciiSlice(0,data.length))) {
+    sys.puts('Failed to start child process.');
+  }
+});
+</code></pre>
+
+<p>See also: <code>child_process.exec()</code></p>
+
+<h3>child.kill(signal)</h3>
+
+<p>Send a signal to the child process. If no argument is given, the process will
+be sent <code>'SIGTERM'</code>. See <code>signal(7)</code> for a list of available signals.</p>
+
+<pre><code>var sys   = require('sys'),
+    spawn = require('child_process').spawn,
+    grep  = spawn('grep', ['ssh']);
+
+grep.addListener('exit', function (code, signal) {
+  sys.puts('child process terminated due to receipt of signal '+signal);
+});
+
+// send SIGHUP to process
+grep.kill('SIGHUP');
+</code></pre>
+
+<p>Note that while the function is called <code>kill</code>, the signal delivered to the child
+process may not actually kill it.  <code>kill</code> really just sends a signal to a process.</p>
+
+<p>See <code>kill(2)</code></p>
+
+<h3>child.pid</h3>
+
+<p>The PID of the child process.</p>
+
+<p>Example:</p>
+
+<pre><code>var sys   = require('sys'),
+    spawn = require('child_process').spawn,
+    grep  = spawn('grep', ['ssh']);
+
+sys.puts('Spawned child pid: ' + grep.pid);
+grep.stdin.end();
+</code></pre>
+
+<h3>child.stdin.write(data, encoding)</h3>
+
+<p>Write data to the child process's <code>stdin</code>. The second argument is optional and
+specifies the encoding: possible values are <code>'utf8'</code>, <code>'ascii'</code>, and
+<code>'binary'</code>.</p>
+
+<p>Example: A very elaborate way to run 'ps ax | grep ssh'</p>
+
+<pre><code>var sys   = require('sys'),
+    spawn = require('child_process').spawn,
+    ps    = spawn('ps', ['ax']),
+    grep  = spawn('grep', ['ssh']);
+
+ps.stdout.addListener('data', function (data) {
+  grep.stdin.write(data);
+});
+
+ps.stderr.addListener('data', function (data) {
+  sys.print('ps stderr: ' + data);
+});
+
+ps.addListener('exit', function (code) {
+  if (code !== 0) {
+    sys.puts('ps process exited with code ' + code);
+  }
+  grep.stdin.end();
+});
+
+grep.stdout.addListener('data', function (data) {
+  sys.print(data);
+});
+
+grep.stderr.addListener('data', function (data) {
+  sys.print('grep stderr: ' + data);
+});
+
+grep.addListener('exit', function (code) {
+  if (code !== 0) {
+    sys.puts('grep process exited with code ' + code);
+  }
+});
+</code></pre>
+
+<h3>child.stdin.end()</h3>
+
+<p>Closes the child process's <code>stdin</code> stream.  This often causes the child process to terminate.</p>
+
+<p>Example:</p>
+
+<pre><code>var sys   = require('sys'),
+    spawn = require('child_process').spawn,
+    grep  = spawn('grep', ['ssh']);
+
+grep.addListener('exit', function (code) {
+  sys.puts('child process exited with code ' + code);
+});
+
+grep.stdin.end();
+</code></pre>
+
+<h3>child_process.exec(command, [options, ] callback)</h3>
+
+<p>High-level way to execute a command as a child process, buffer the
+output, and return it all in a callback.</p>
+
+<pre><code>var sys   = require('sys'),
+    exec  = require('child_process').exec,
+    child;
+
+child = exec('cat *.js bad_file | wc -l', 
+  function (error, stdout, stderr) {
+    sys.print('stdout: ' + stdout);
+    sys.print('stderr: ' + stderr);
+    if (error !== null) {
+      sys.puts('exec error: ' + error);
+    }
+  });
+</code></pre>
+
+<p>The callback gets the arguments <code>(error, stdout, stderr)</code>. On success, <code>error</code>
+will be <code>null</code>.  On error, <code>error</code> will be an instance of <code>Error</code> and <code>err.code</code>
+will be the exit code of the child process, and <code>err.signal</code> will be set to the
+signal that terminated the process.</p>
+
+<p>There is a second optional argument to specify several options. The default options are</p>
+
+<pre><code>{ encoding: 'utf8'
+, timeout: 0
+, maxBuffer: 200*1024
+, killSignal: 'SIGKILL'
+}
+</code></pre>
+
+<p>If <code>timeout</code> is greater than 0, then it will kill the child process
+if it runs longer than <code>timeout</code> milliseconds. The child process is killed with
+<code>killSignal</code> (default: <code>'SIGKILL'</code>). <code>maxBuffer</code> specifies the largest
+amount of data allowed on stdout or stderr - if this value is exceeded then
+the child process is killed.</p>
+
+<h2 id="Script">Script</h2>
+
+<p><code>Script</code> class compiles and runs JavaScript code. You can access this class with:</p>
+
+<pre><code>var Script = process.binding('evals').Script;
+</code></pre>
+
+<p>New JavaScript code can be compiled and run immediately or compiled, saved, and run later.</p>
+
+<h3>Script.runInThisContext(code, filename)</h3>
+
+<p>Similar to <code>process.compile</code>.  <code>Script.runInThisContext</code> compiles <code>code</code> as if it were loaded from <code>filename</code>,
+runs it and returns the result. Running code does not have access to local scope. <code>filename</code> is optional.</p>
+
+<p>Example of using <code>Script.runInThisContext</code> and <code>eval</code> to run the same code:</p>
+
+<pre><code>var sys = require('sys'),
+    localVar = 123,
+    usingscript, evaled,
+    Script = process.binding('evals').Script;
+
+usingscript = Script.runInThisContext('localVar = 1;',
+  'myfile.js');
+sys.puts('localVar: ' + localVar + ', usingscript: ' +
+  usingscript);
+evaled = eval('localVar = 1;');
+sys.puts('localVar: ' + localVar + ', evaled: ' +
+  evaled);
+
+// localVar: 123, usingscript: 1
+// localVar: 1, evaled: 1
+</code></pre>
+
+<p><code>Script.runInThisContext</code> does not have access to the local scope, so <code>localVar</code> is unchanged.
+<code>eval</code> does have access to the local scope, so <code>localVar</code> is changed.</p>
+
+<p>In case of syntax error in <code>code</code>, <code>Script.runInThisContext</code> emits the syntax error to stderr
+and throws.an exception.</p>
+
+<h3>Script.runInNewContext(code, sandbox, filename)</h3>
+
+<p><code>Script.runInNewContext</code> compiles <code>code</code> to run in <code>sandbox</code> as if it were loaded from <code>filename</code>,
+then runs it and returns the result. Running code does not have access to local scope and
+the object <code>sandbox</code> will be used as the global object for <code>code</code>.
+<code>sandbox</code> and <code>filename</code> are optional.</p>
+
+<p>Example: compile and execute code that increments a global variable and sets a new one.
+These globals are contained in the sandbox.</p>
+
+<pre><code>var sys = require('sys'),
+    Script = process.binding('evals').Script,
+    sandbox = {
+      animal: 'cat',
+      count: 2
+    };
+
+Script.runInNewContext(
+  'count += 1; name = "kitty"', sandbox, 'myfile.js');
+sys.puts(sys.inspect(sandbox));
+
+// { animal: 'cat', count: 3, name: 'kitty' }
+</code></pre>
+
+<p>Note that running untrusted code is a tricky business requiring great care.  To prevent accidental
+global variable leakage, <code>Script.runInNewContext</code> is quite useful, but safely running untrusted code
+requires a separate process.</p>
+
+<p>In case of syntax error in <code>code</code>, <code>Script.runInThisContext</code> emits the syntax error to stderr
+and throws an exception.</p>
+
+<h3>new Script(code, filename)</h3>
+
+<p><code>new Script</code> compiles <code>code</code> as if it were loaded from <code>filename</code>,
+but does not run it. Instead, it returns a <code>Script</code> object representing this compiled code.
+This script can be run later many times using methods below.
+The returned script is not bound to any global object.
+It is bound before each run, just for that run. <code>filename</code> is optional.</p>
+
+<p>In case of syntax error in <code>code</code>, <code>new Script</code> emits the syntax error to stderr
+and throws an exception.</p>
+
+<h3>script.runInThisContext()</h3>
+
+<p>Similar to <code>Script.runInThisContext</code> (note capital 'S'), but now being a method of a precompiled Script object.
+<code>script.runInThisContext</code> runs the code of <code>script</code> and returns the result.
+Running code does not have access to local scope, but does have access to the <code>global</code> object
+(v8: in actual context).</p>
+
+<p>Example of using <code>script.runInThisContext</code> to compile code once and run it multiple times:</p>
+
+<pre><code>var sys = require('sys'),
+    Script = process.binding('evals').Script,
+    scriptObj, i;
+
+globalVar = 0;
+
+scriptObj = new Script('globalVar += 1', 'myfile.js');
+
+for (i = 0; i < 1000 ; i += 1) {
+  scriptObj.runInThisContext();
+}
+
+sys.puts(globalVar);
+
+// 1000
+</code></pre>
+
+<h3>script.runInNewContext(sandbox)</h3>
+
+<p>Similar to <code>Script.runInNewContext</code> (note capital 'S'), but now being a method of a precompiled Script object.
+<code>script.runInNewContext</code> runs the code of <code>script</code> with <code>sandbox</code> as the global object and returns the result.
+Running code does not have access to local scope. <code>sandbox</code> is optional.</p>
+
+<p>Example: compile code that increments a global variable and sets one, then execute this code multiple times.
+These globals are contained in the sandbox.</p>
+
+<pre><code>var sys = require('sys'),
+    Script = process.binding('evals').Script,
+    scriptObj, i,
+    sandbox = {
+      animal: 'cat',
+      count: 2
+    };
+
+scriptObj = new Script(
+    'count += 1; name = "kitty"', 'myfile.js');
+
+for (i = 0; i < 10 ; i += 1) {
+  scriptObj.runInNewContext(sandbox);
+}
+
+sys.puts(sys.inspect(sandbox));
+
+// { animal: 'cat', count: 12, name: 'kitty' }
+</code></pre>
+
+<p>Note that running untrusted code is a tricky business requiring great care.  To prevent accidental
+global variable leakage, <code>script.runInNewContext</code> is quite useful, but safely running untrusted code
+requires a separate process.</p>
+
+<h2 id="File System">File System</h2>
+
+<p>File I/O is provided by simple wrappers around standard POSIX functions.  To
+use this module do <code>require('fs')</code>. All the methods have asynchronous and
+synchronous forms.</p>
+
+<p>The asynchronous form always take a completion callback as its last argument.
+The arguments passed to the completion callback depend on the method, but the
+first argument is always reserved for an exception. If the operation was
+completed successfully, then the first argument will be <code>null</code> or <code>undefined</code>.</p>
+
+<p>Here is an example of the asynchronous version:</p>
+
+<pre><code>var fs = require('fs'),
+    sys = require('sys');
+
+fs.unlink('/tmp/hello', function (err) {
+  if (err) throw err;
+  sys.puts('successfully deleted /tmp/hello');
+});
+</code></pre>
+
+<p>Here is the synchronous version:</p>
+
+<pre><code>var fs = require('fs'),
+    sys = require('sys');
+
+fs.unlinkSync('/tmp/hello')
+sys.puts('successfully deleted /tmp/hello');
+</code></pre>
+
+<p>With the asynchronous methods there is no guaranteed ordering. So the
+following is prone to error:</p>
+
+<pre><code>fs.rename('/tmp/hello', '/tmp/world', function (err) {
+  if (err) throw err;
+  sys.puts('renamed complete');
+});
+fs.stat('/tmp/world', function (err, stats) {
+  if (err) throw err;
+  sys.puts('stats: ' + JSON.stringify(stats));
+});
+</code></pre>
+
+<p>It could be that <code>fs.stat</code> is executed before <code>fs.rename</code>.
+The correct way to do this is to chain the callbacks.</p>
+
+<pre><code>fs.rename('/tmp/hello', '/tmp/world', function (err) {
+  if (err) throw err;
+  fs.stat('/tmp/world', function (err, stats) {
+    if (err) throw err;
+    sys.puts('stats: ' + JSON.stringify(stats));
+  });
+});
+</code></pre>
+
+<p>In busy processes, the programmer is <em>strongly encouraged</em> to use the
+asynchronous versions of these calls. The synchronous versions will block
+the entire process until they complete--halting all connections.</p>
+
+<h3>fs.rename(path1, path2, callback)</h3>
+
+<p>Asynchronous rename(2). No arguments other than a possible exception are given to the completion callback.</p>
+
+<h3>fs.renameSync(path1, path2)</h3>
+
+<p>Synchronous rename(2).</p>
+
+<h3>fs.truncate(fd, len, callback)</h3>
+
+<p>Asynchronous ftruncate(2). No arguments other than a possible exception are given to the completion callback.</p>
+
+<h3>fs.truncateSync(fd, len)</h3>
+
+<p>Synchronous ftruncate(2).</p>
+
+<h3>fs.chmod(path, mode, callback)</h3>
+
+<p>Asynchronous chmod(2). No arguments other than a possible exception are given to the completion callback.</p>
+
+<h3>fs.chmodSync(path, mode)</h3>
+
+<p>Synchronous chmod(2).</p>
+
+<h3>fs.stat(path, callback), fs.lstat(path, callback), fs.fstat(fd, callback)</h3>
+
+<p>Asynchronous stat(2), lstat(2) or fstat(2). The callback gets two arguments <code>(err, stats)</code> where <code>stats</code> is a <code>fs.Stats</code> object. It looks like this:</p>
+
+<pre><code>{ dev: 2049
+, ino: 305352
+, mode: 16877
+, nlink: 12
+, uid: 1000
+, gid: 1000
+, rdev: 0
+, size: 4096
+, blksize: 4096
+, blocks: 8
+, atime: '2009-06-29T11:11:55Z'
+, mtime: '2009-06-29T11:11:40Z'
+, ctime: '2009-06-29T11:11:40Z' 
+}
+</code></pre>
+
+<p>See the <code>fs.Stats</code> section below for more information.</p>
+
+<h3>fs.statSync(path), fs.lstatSync(path), fs.fstatSync(fd)</h3>
+
+<p>Synchronous stat(2), lstat(2) or fstat(2). Returns an instance of <code>fs.Stats</code>.</p>
+
+<h3>fs.link(srcpath, dstpath, callback)</h3>
+
+<p>Asynchronous link(2). No arguments other than a possible exception are given to the completion callback.</p>
+
+<h3>fs.linkSync(dstpath, srcpath)</h3>
+
+<p>Synchronous link(2).</p>
+
+<h3>fs.symlink(linkdata, path, callback)</h3>
+
+<p>Asynchronous symlink(2). No arguments other than a possible exception are given to the completion callback.</p>
+
+<h3>fs.symlinkSync(linkdata, path)</h3>
+
+<p>Synchronous symlink(2).</p>
+
+<h3>fs.readlink(path, callback)</h3>
+
+<p>Asynchronous readlink(2). The callback gets two arguments <code>(err, resolvedPath)</code>.</p>
+
+<h3>fs.readlinkSync(path)</h3>
+
+<p>Synchronous readlink(2). Returns the resolved path.</p>
+
+<h3>fs.realpath(path, callback)</h3>
+
+<p>Asynchronous realpath(2).  The callback gets two arguments <code>(err, resolvedPath)</code>.</p>
+
+<h3>fs.realpathSync(path)</h3>
+
+<p>Synchronous realpath(2). Returns the resolved path.</p>
+
+<h3>fs.unlink(path, callback)</h3>
+
+<p>Asynchronous unlink(2). No arguments other than a possible exception are given to the completion callback.</p>
+
+<h3>fs.unlinkSync(path)</h3>
+
+<p>Synchronous unlink(2).</p>
+
+<h3>fs.rmdir(path, callback)</h3>
+
+<p>Asynchronous rmdir(2). No arguments other than a possible exception are given to the completion callback.</p>
+
+<h3>fs.rmdirSync(path)</h3>
+
+<p>Synchronous rmdir(2).</p>
+
+<h3>fs.mkdir(path, mode, callback)</h3>
+
+<p>Asynchronous mkdir(2). No arguments other than a possible exception are given to the completion callback.</p>
+
+<h3>fs.mkdirSync(path, mode)</h3>
+
+<p>Synchronous mkdir(2).</p>
+
+<h3>fs.readdir(path, callback)</h3>
+
+<p>Asynchronous readdir(3).  Reads the contents of a directory.
+The callback gets two arguments <code>(err, files)</code> where <code>files</code> is an array of
+the names of the files in the directory excluding <code>'.'</code> and <code>'..'</code>.</p>
+
+<h3>fs.readdirSync(path)</h3>
+
+<p>Synchronous readdir(3). Returns an array of filenames excluding <code>'.'</code> and
+<code>'..'</code>.</p>
+
+<h3>fs.close(fd, callback)</h3>
+
+<p>Asynchronous close(2).  No arguments other than a possible exception are given to the completion callback.</p>
+
+<h3>fs.closeSync(fd)</h3>
+
+<p>Synchronous close(2).</p>
+
+<h3>fs.open(path, flags, mode, callback)</h3>
+
+<p>Asynchronous file open. See open(2). Flags can be 'r', 'r+', 'w', 'w+', 'a',
+or 'a+'. The callback gets two arguments <code>(err, fd)</code>.</p>
+
+<h3>fs.openSync(path, flags, mode)</h3>
+
+<p>Synchronous open(2).</p>
+
+<h3>fs.write(fd, buffer, offset, length, position, callback)</h3>
+
+<p>Write <code>buffer</code> to the file specified by <code>fd</code>.</p>
+
+<p><code>offset</code> and <code>length</code> determine the part of the buffer to be written.</p>
+
+<p><code>position</code> refers to the offset from the beginning of the file where this data
+should be written. If <code>position</code> is <code>null</code>, the data will be written at the
+current position.
+See pwrite(2).</p>
+
+<p>The callback will be given two arguments <code>(err, written)</code> where <code>written</code>
+specifies how many <em>bytes</em> were written.</p>
+
+<h3>fs.writeSync(fd, data, position, encoding)</h3>
+
+<p>Synchronous version of <code>fs.write()</code>. Returns the number of bytes written.</p>
+
+<h3>fs.read(fd, buffer, offset, length, position, callback)</h3>
+
+<p>Read data from the file specified by <code>fd</code>.</p>
+
+<p><code>buffer</code> is the buffer that the data will be written to.</p>
+
+<p><code>offset</code> is offset within the buffer where writing will start.</p>
+
+<p><code>length</code> is an integer specifying the number of bytes to read.</p>
+
+<p><code>position</code> is an integer specifying where to begin reading from in the file.
+If <code>position</code> is <code>null</code>, data will be read from the current file position.</p>
+
+<p>The callback is given the two arguments, <code>(err, bytesRead)</code>.</p>
+
+<h3>fs.readSync(fd, buffer, offset, length, position)</h3>
+
+<p>Synchronous version of <code>fs.read</code>. Returns the number of <code>bytesRead</code>.</p>
+
+<h3>fs.readFile(filename, [encoding,] callback)</h3>
+
+<p>Asynchronously reads the entire contents of a file. Example:</p>
+
+<pre><code>fs.readFile('/etc/passwd', function (err, data) {
+  if (err) throw err;
+  sys.puts(data);
+});
+</code></pre>
+
+<p>The callback is passed two arguments <code>(err, data)</code>, where <code>data</code> is the
+contents of the file.</p>
+
+<p>If no encoding is specified, then the raw buffer is returned.</p>
+
+<h3>fs.readFileSync(filename [, encoding])</h3>
+
+<p>Synchronous version of <code>fs.readFile</code>. Returns the contents of the <code>filename</code>.</p>
+
+<p>If <code>encoding</code> is specified then this function returns a string. Otherwise it
+returns a buffer.</p>
+
+<h3>fs.writeFile(filename, data, encoding='utf8', callback)</h3>
+
+<p>Asynchronously writes data to a file. Example:</p>
+
+<pre><code>fs.writeFile('message.txt', 'Hello Node', function (err) {
+  if (err) throw err;
+  sys.puts('It\'s saved!');
+});
+</code></pre>
+
+<h3>fs.writeFileSync(filename, data, encoding='utf8')</h3>
+
+<p>The synchronous version of <code>fs.writeFile</code>.</p>
+
+<h3>fs.watchFile(filename, [options,] listener)</h3>
+
+<p>Watch for changes on <code>filename</code>. The callback <code>listener</code> will be called each
+time the file changes.</p>
+
+<p>The second argument is optional. The <code>options</code> if provided should be an object
+containing two members a boolean, <code>persistent</code>, and <code>interval</code>, a polling
+value in milliseconds. The default is <code>{persistent: true, interval: 0}</code>.</p>
+
+<p>The <code>listener</code> gets two arguments the current stat object and the previous
+stat object:</p>
+
+<pre><code>fs.watchFile(f, function (curr, prev) {
+  sys.puts('the current mtime is: ' + curr.mtime);
+  sys.puts('the previous mtime was: ' + prev.mtime);
+});
+</code></pre>
+
+<p>These stat objects are instances of <code>fs.Stat</code>.</p>
+
+<h3>fs.unwatchFile(filename)</h3>
+
+<p>Stop watching for changes on <code>filename</code>.</p>
+
+<h2 id="fs.Stats">fs.Stats</h2>
+
+<p>Objects returned from <code>fs.stat()</code> and <code>fs.lstat()</code> are of this type.</p>
+
+<ul>
+<li><code>stats.isFile()</code></li>
+<li><code>stats.isDirectory()</code></li>
+<li><code>stats.isBlockDevice()</code></li>
+<li><code>stats.isCharacterDevice()</code></li>
+<li><code>stats.isSymbolicLink()</code> (only valid with  <code>fs.lstat()</code>)</li>
+<li><code>stats.isFIFO()</code></li>
+<li><code>stats.isSocket()</code></li>
+</ul>
+
+
+<h2 id="fs.ReadStream">fs.ReadStream</h2>
+
+<p><code>ReadStream</code> is a readable stream.</p>
+
+<h3>fs.createReadStream(path, [options])</h3>
+
+<p>Returns a new ReadStream object.</p>
+
+<p><code>options</code> is an object with the following defaults:</p>
+
+<pre><code>{ 'flags': 'r'
+, 'encoding': 'binary'
+, 'mode': 0666
+, 'bufferSize': 4 * 1024
+}
+</code></pre>
+
+<h3>readStream.readable</h3>
+
+<p>A boolean that is <code>true</code> by default, but turns <code>false</code> after an <code>'error'</code>
+occured, the stream came to an <code>'end'</code>, or <code>destroy()</code> was called.</p>
+
+<h3>readStream.pause()</h3>
+
+<p>Stops the stream from reading further data. No <code>'data'</code> event will be fired
+until the stream is resumed.</p>
+
+<h3>readStream.resume()</h3>
+
+<p>Resumes the stream. Together with <code>pause()</code> this useful to throttle reading.</p>
+
+<h3>readStream.destroy()</h3>
+
+<p>Allows to close the stream before the <code>'end'</code> is reached. No more events other
+than <code>'close'</code> will be fired after this method has been called.</p>
+
+<h2 id="fs.WriteStream">fs.WriteStream</h2>
+
+<p><code>WriteStream</code> is a writable stream.</p>
+
+<h3>fs.createWriteStream(path, [options])</h3>
+
+<p>Returns a new WriteStream object.
+<code>options</code> is an object with the following defaults:</p>
+
+<pre><code>{ 'flags': 'w'
+, 'encoding': 'binary'
+, 'mode': 0666
+}
+</code></pre>
+
+<h3>writeStream.writeable</h3>
+
+<p>A boolean that is <code>true</code> by default, but turns <code>false</code> after an <code>'error'</code>
+occurred or <code>end()</code> / <code>destroy()</code> was called.</p>
+
+<h3>writeStream.write(data, encoding='utf8')</h3>
+
+<p>Returns <code>true</code> if the data was flushed to the kernel, and <code>false</code> if it was
+queued up for being written later. A <code>'drain'</code> will fire after all queued data
+has been written.</p>
+
+<p>The second optional parameter specifies the encoding of for the string.</p>
+
+<h3>writeStream.end()</h3>
+
+<p>Closes the stream right after all queued <code>write()</code> calls have finished.</p>
+
+<h3>writeStream.destroy()</h3>
+
+<p>Allows to close the stream regardless of its current state.</p>
+
+<h2 id="HTTP">HTTP</h2>
+
+<p>To use the HTTP server and client one must <code>require('http')</code>.</p>
+
+<p>The HTTP interfaces in Node are designed to support many features
+of the protocol which have been traditionally difficult to use.
+In particular, large, possibly chunk-encoded, messages. The interface is
+careful to never buffer entire requests or responses--the
+user is able to stream data.</p>
+
+<p>HTTP message headers are represented by an object like this:</p>
+
+<pre><code>{ 'content-length': '123'
+, 'content-type': 'text/plain'
+, 'stream': 'keep-alive'
+, 'accept': '*/*'
+}
+</code></pre>
+
+<p>Keys are lowercased. Values are not modified.</p>
+
+<p>In order to support the full spectrum of possible HTTP applications, Node's
+HTTP API is very low-level. It deals with stream handling and message
+parsing only. It parses a message into headers and body but it does not
+parse the actual headers or the body.</p>
+
+<p>HTTPS is supported if OpenSSL is available on the underlying platform.</p>
+
+<h2 id="http.Server">http.Server</h2>
+
+<p>This is an EventEmitter with the following events:</p>
+
+<h3>Event: 'request'</h3>
+
+<p><code>function (request, response) { }</code></p>
+
+<p> <code>request</code> is an instance of <code>http.ServerRequest</code> and <code>response</code> is
+ an instance of <code>http.ServerResponse</code></p>
+
+<h3>Event: 'connection'</h3>
+
+<p><code>function (stream) { }</code></p>
+
+<p> When a new TCP stream is established. <code>stream</code> is an object of type
+ <code>net.Stream</code>. Usually users will not want to access this event. The
+ <code>stream</code> can also be accessed at <code>request.connection</code>.</p>
+
+<h3>Event: 'close'</h3>
+
+<p><code>function (errno) { }</code></p>
+
+<p> Emitted when the server closes.</p>
+
+<h3>http.createServer(requestListener, [options])</h3>
+
+<p>Returns a new web server object.</p>
+
+<p>The <code>options</code> argument is optional. The
+<code>options</code> argument accepts the same values as the
+options argument for <code>net.Server</code>.</p>
+
+<p>The <code>requestListener</code> is a function which is automatically
+added to the <code>'request'</code> event.</p>
+
+<h3>Event: 'request'</h3>
+
+<p><code>function (request, response) {}</code></p>
+
+<p>Emitted each time there is request. Note that there may be multiple requests
+per connection (in the case of keep-alive connections).</p>
+
+<h3>Event: 'upgrade'</h3>
+
+<p><code>function (request, socket, head)</code></p>
+
+<p>Emitted each time a client requests a http upgrade. If this event isn't
+listened for, then clients requesting an upgrade will have their connections
+closed.</p>
+
+<ul>
+<li><code>request</code> is the arguments for the http request, as it is in the request event.</li>
+<li><code>socket</code> is the network socket between the server and client.</li>
+<li><code>head</code> is an instance of Buffer, the first packet of the upgraded stream, this may be empty.</li>
+</ul>
+
+
+<p>After this event is emitted, the request's socket will not have a <code>data</code>
+event listener, meaning you will need to bind to it in order to handle data
+sent to the server on that socket.</p>
+
+<h3>Event: 'clientError'</h3>
+
+<p><code>function (exception) {}</code></p>
+
+<p>If a client connection emits an 'error' event - it will forwarded here.</p>
+
+<h3>server.listen(port, hostname=null, callback=null)</h3>
+
+<p>Begin accepting connections on the specified port and hostname.  If the
+hostname is omitted, the server will accept connections directed to any
+IPv4 address (<code>INADDR_ANY</code>).</p>
+
+<p>To listen to a unix socket, supply a filename instead of port and hostname.</p>
+
+<p>This function is asynchronous. The last parameter <code>callback</code> will be called
+when the server has been bound to the port.</p>
+
+<h3>server.listen(path, callback=null)</h3>
+
+<p>Start a UNIX socket server listening for connections on the given <code>path</code>.</p>
+
+<p>This function is asynchronous. The last parameter <code>callback</code> will be called
+when the server has been bound.</p>
+
+<h3>server.setSecure(credentials)</h3>
+
+<p>Enables HTTPS support for the server, with the crypto module credentials specifying the private key and certificate of the server, and optionally the CA certificates for use in client authentication.</p>
+
+<p>If the credentials hold one or more CA certificates, then the server will request for the client to submit a client certificate as part of the HTTPS connection handshake. The validity and content of this can be accessed via verifyPeer() and getPeerCertificate() from the server's request.connection.</p>
+
+<h3>server.close()</h3>
+
+<p>Stops the server from accepting new connections.</p>
+
+<h2 id="http.ServerRequest">http.ServerRequest</h2>
+
+<p>This object is created internally by a HTTP server--not by
+the user--and passed as the first argument to a <code>'request'</code> listener.</p>
+
+<p>This is an EventEmitter with the following events:</p>
+
+<h3>Event: 'data'</h3>
+
+<p><code>function (chunk) { }</code></p>
+
+<p>Emitted when a piece of the message body is received.</p>
+
+<p>Example: A chunk of the body is given as the single
+argument. The transfer-encoding has been decoded.  The
+body chunk is a string.  The body encoding is set with
+<code>request.setBodyEncoding()</code>.</p>
+
+<h3>Event: 'end'</h3>
+
+<p><code>function () { }</code></p>
+
+<p>Emitted exactly once for each message. No arguments.  After
+emitted no other events will be emitted on the request.</p>
+
+<h3>request.method</h3>
+
+<p>The request method as a string. Read only. Example:
+<code>'GET'</code>, <code>'DELETE'</code>.</p>
+
+<h3>request.url</h3>
+
+<p>Request URL string. This contains only the URL that is
+present in the actual HTTP request. If the request is:</p>
+
+<pre><code>GET /status?name=ryan HTTP/1.1\r\n
+Accept: text/plain\r\n
+\r\n
+</code></pre>
+
+<p>Then <code>request.url</code> will be:</p>
+
+<pre><code>'/status?name=ryan'
+</code></pre>
+
+<p>If you would like to parse the URL into its parts, you can use
+<code>require('url').parse(request.url)</code>.  Example:</p>
+
+<pre><code>node> require('url').parse('/status?name=ryan')
+{ href: '/status?name=ryan'
+, search: '?name=ryan'
+, query: 'name=ryan'
+, pathname: '/status'
+}
+</code></pre>
+
+<p>If you would like to extract the params from the query string,
+you can use the <code>require('querystring').parse</code> function, or pass
+<code>true</code> as the second argument to <code>require('url').parse</code>.  Example:</p>
+
+<pre><code>node> require('url').parse('/status?name=ryan', true)
+{ href: '/status?name=ryan'
+, search: '?name=ryan'
+, query: { name: 'ryan' }
+, pathname: '/status'
+}
+</code></pre>
+
+<h3>request.headers</h3>
+
+<p>Read only.</p>
+
+<h3>request.httpVersion</h3>
+
+<p>The HTTP protocol version as a string. Read only. Examples:
+<code>'1.1'</code>, <code>'1.0'</code>.
+Also <code>request.httpVersionMajor</code> is the first integer and
+<code>request.httpVersionMinor</code> is the second.</p>
+
+<h3>request.setEncoding(encoding='binary')</h3>
+
+<p>Set the encoding for the request body. Either <code>'utf8'</code> or <code>'binary'</code>. Defaults
+to <code>'binary'</code>.</p>
+
+<h3>request.pause()</h3>
+
+<p>Pauses request from emitting events.  Useful to throttle back an upload.</p>
+
+<h3>request.resume()</h3>
+
+<p>Resumes a paused request.</p>
+
+<h3>request.connection</h3>
+
+<p>The <code>net.Stream</code> object assocated with the connection.</p>
+
+<p>With HTTPS support, use request.connection.verifyPeer() and
+request.connection.getPeerCertificate() to obtain the client's
+authentication details.</p>
+
+<h2 id="http.ServerResponse">http.ServerResponse</h2>
+
+<p>This object is created internally by a HTTP server--not by the user. It is
+passed as the second parameter to the <code>'request'</code> event. It is a writable stream.</p>
+
+<h3>response.writeHead(statusCode[, reasonPhrase] , headers)</h3>
+
+<p>Sends a response header to the request. The status code is a 3-digit HTTP
+status code, like <code>404</code>. The last argument, <code>headers</code>, are the response headers.
+Optionally one can give a human-readable <code>reasonPhrase</code> as the second
+argument.</p>
+
+<p>Example:</p>
+
+<pre><code>var body = 'hello world';
+response.writeHead(200, {
+  'Content-Length': body.length,
+  'Content-Type': 'text/plain'
+});
+</code></pre>
+
+<p>This method must only be called once on a message and it must
+be called before <code>response.end()</code> is called.</p>
+
+<h3>response.write(chunk, encoding)</h3>
+
+<p>This method must be called after <code>writeHead</code> was
+called. It sends a chunk of the response body. This method may
+be called multiple times to provide successive parts of the body.</p>
+
+<p>If <code>chunk</code> is a string, the second parameter
+specifies how to encode it into a byte stream. By default the
+<code>encoding</code> is <code>'ascii'</code>.</p>
+
+<p><strong>Note</strong>: This is the raw HTTP body and has nothing to do with
+higher-level multi-part body encodings that may be used.</p>
+
+<p>The first time <code>response.write()</code> is called, it will send the buffered
+header information and the first body to the client. The second time
+<code>response.write()</code> is called, Node assumes you're going to be streaming
+data, and sends that separately. That is, the response is buffered up to the
+first chunk of body.</p>
+
+<h3>response.end()</h3>
+
+<p>This method signals to the server that all of the response headers and body
+has been sent; that server should consider this message complete.
+The method, <code>response.end()</code>, MUST be called on each
+response.</p>
+
+<h2 id="http.Client">http.Client</h2>
+
+<p>An HTTP client is constructed with a server address as its
+argument, the returned handle is then used to issue one or more
+requests.  Depending on the server connected to, the client might
+pipeline the requests or reestablish the stream after each
+stream. <em>Currently the implementation does not pipeline requests.</em></p>
+
+<p>Example of connecting to <code>google.com</code>:</p>
+
+<pre><code>var sys = require('sys'),
+   http = require('http');
+var google = http.createClient(80, 'www.google.com');
+var request = google.request('GET', '/',
+  {'host': 'www.google.com'});
+request.end();
+request.addListener('response', function (response) {
+  sys.puts('STATUS: ' + response.statusCode);
+  sys.puts('HEADERS: ' + JSON.stringify(response.headers));
+  response.setEncoding('utf8');
+  response.addListener('data', function (chunk) {
+    sys.puts('BODY: ' + chunk);
+  });
+});
+</code></pre>
+
+<h3>http.createClient(port, host, secure, credentials)</h3>
+
+<p>Constructs a new HTTP client. <code>port</code> and
+<code>host</code> refer to the server to be connected to. A
+stream is not established until a request is issued.</p>
+
+<p><code>secure</code> is an optional boolean flag to enable https support and <code>credentials</code> is an optional credentials object from the crypto module, which may hold the client's private key, certificate, and a list of trusted CA certificates.</p>
+
+<p>If the connection is secure, but no explicit CA certificates are passed in the credentials, then node.js will default to the publicly trusted list of CA certificates, as given in http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt</p>
+
+<h3>client.request([method], path, [request_headers])</h3>
+
+<p>Issues a request; if necessary establishes stream. Returns a <code>http.ClientRequest</code> instance.</p>
+
+<p><code>method</code> is optional and defaults to 'GET' if omitted.</p>
+
+<p><code>request_headers</code> is optional.
+Additional request headers might be added internally
+by Node. Returns a <code>ClientRequest</code> object.</p>
+
+<p>Do remember to include the <code>Content-Length</code> header if you
+plan on sending a body. If you plan on streaming the body, perhaps
+set <code>Transfer-Encoding: chunked</code>.</p>
+
+<p><em>NOTE</em>: the request is not complete. This method only sends the header of
+the request. One needs to call <code>request.end()</code> to finalize the request and
+retrieve the response.  (This sounds convoluted but it provides a chance for
+the user to stream a body to the server with <code>request.write()</code>.)</p>
+
+<h3>client.verifyPeer()</h3>
+
+<p>Returns true or false depending on the validity of the server's certificate in the context of the defined or default list of trusted CA certificates.</p>
+
+<h3>client.getPeerCertificate()</h3>
+
+<p>Returns a JSON structure detailing the server's certificate, containing a dictionary with keys for the certificate 'subject', 'issuer', 'valid_from' and 'valid_to'</p>
+
+<h2 id="http.ClientRequest">http.ClientRequest</h2>
+
+<p>This object is created internally and returned from the <code>request()</code> method
+of a <code>http.Client</code>. It represents an <em>in-progress</em> request whose header has
+already been sent.</p>
+
+<p>To get the response, add a listener for <code>'response'</code> to the request object.
+<code>'response'</code> will be emitted from the request object when the response
+headers have been received.  The <code>'response'</code> event is executed with one
+argument which is an instance of <code>http.ClientResponse</code>.</p>
+
+<p>During the <code>'response'</code> event, one can add listeners to the
+response object; particularly to listen for the <code>'data'</code> event. Note that
+the <code>'response'</code> event is called before any part of the response body is received,
+so there is no need to worry about racing to catch the first part of the
+body. As long as a listener for <code>'data'</code> is added during the <code>'response'</code>
+event, the entire body will be caught.</p>
+
+<pre><code>// Good
+request.addListener('response', function (response) {
+  response.addListener('data', function (chunk) {
+    sys.puts('BODY: ' + chunk);
+  });
+});
+
+// Bad - misses all or part of the body
+request.addListener('response', function (response) {
+  setTimeout(function () {
+    response.addListener('data', function (chunk) {
+      sys.puts('BODY: ' + chunk);
+    });
+  }, 10);
+});
+</code></pre>
+
+<p>This is a writable stream.</p>
+
+<p>This is an <code>EventEmitter</code> with the following events:</p>
+
+<h3>Event 'response'</h3>
+
+<p><code>function (response) { }</code></p>
+
+<p>Emitted when a response is received to this request. This event is emitted only once. The
+<code>response</code> argument will be an instance of <code>http.ClientResponse</code>.</p>
+
+<h3>request.write(chunk, encoding='ascii')</h3>
+
+<p>Sends a chunk of the body.  By calling this method
+many times, the user can stream a request body to a
+server--in that case it is suggested to use the
+<code>['Transfer-Encoding', 'chunked']</code> header line when
+creating the request.</p>
+
+<p>The <code>chunk</code> argument should be an array of integers
+or a string.</p>
+
+<p>The <code>encoding</code> argument is optional and only
+applies when <code>chunk</code> is a string. The encoding
+argument should be either <code>'utf8'</code> or
+<code>'ascii'</code>. By default the body uses ASCII encoding,
+as it is faster.</p>
+
+<h3>request.end()</h3>
+
+<p>Finishes sending the request. If any parts of the body are
+unsent, it will flush them to the stream. If the request is
+chunked, this will send the terminating <code>'0\r\n\r\n'</code>.</p>
+
+<h2 id="http.ClientResponse">http.ClientResponse</h2>
+
+<p>This object is created when making a request with <code>http.Client</code>. It is
+passed to the <code>'response'</code> event of the request object.</p>
+
+<p>The response implements the <strong>readable stream</strong> interface.</p>
+
+<h3>Event: 'data'</h3>
+
+<p><code>function (chunk) {}</code></p>
+
+<p>Emitted when a piece of the message body is received.</p>
+
+<pre><code>Example: A chunk of the body is given as the single
+argument. The transfer-encoding has been decoded.  The
+body chunk a String.  The body encoding is set with
+`response.setBodyEncoding()`.
+</code></pre>
+
+<h3>Event: 'end'</h3>
+
+<p><code>function () {}</code></p>
+
+<p>Emitted exactly once for each message. No arguments. After
+emitted no other events will be emitted on the response.</p>
+
+<h3>response.statusCode</h3>
+
+<p>The 3-digit HTTP response status code. E.G. <code>404</code>.</p>
+
+<h3>response.httpVersion</h3>
+
+<p>The HTTP version of the connected-to server. Probably either
+<code>'1.1'</code> or <code>'1.0'</code>.
+Also <code>response.httpVersionMajor</code> is the first integer and
+<code>response.httpVersionMinor</code> is the second.</p>
+
+<h3>response.headers</h3>
+
+<p>The response headers.</p>
+
+<h3>response.setEncoding(encoding)</h3>
+
+<p>Set the encoding for the response body. Either <code>'utf8'</code> or <code>'binary'</code>.
+Defaults to <code>'binary'</code>.</p>
+
+<h3>response.pause()</h3>
+
+<p>Pauses response from emitting events.  Useful to throttle back a download.</p>
+
+<h3>response.resume()</h3>
+
+<p>Resumes a paused response.</p>
+
+<h3>response.client</h3>
+
+<p>A reference to the <code>http.Client</code> that this response belongs to.</p>
+
+<h2 id="net.Server">net.Server</h2>
+
+<p>This class is used to create a TCP or UNIX server.</p>
+
+<p>Here is an example of a echo server which listens for connections
+on port 8124:</p>
+
+<pre><code>var net = require('net');
+var server = net.createServer(function (stream) {
+  stream.setEncoding('utf8');
+  stream.addListener('connect', function () {
+    stream.write('hello\r\n');
+  });
+  stream.addListener('data', function (data) {
+    stream.write(data);
+  });
+  stream.addListener('end', function () {
+    stream.write('goodbye\r\n');
+    stream.end();
+  });
+});
+server.listen(8124, 'localhost');
+</code></pre>
+
+<p>To listen on the socket <code>'/tmp/echo.sock'</code>, the last line would just be
+changed to</p>
+
+<pre><code>server.listen('/tmp/echo.sock');
+</code></pre>
+
+<p>This is an EventEmitter with the following events:</p>
+
+<h3>Event: 'connection'</h3>
+
+<p><code>function (stream) {}</code></p>
+
+<p>Emitted when a new connection is made. <code>stream</code> is an instance of
+<code>net.Stream</code>.</p>
+
+<h3>Event: 'close'</h3>
+
+<p><code>function () {}</code></p>
+
+<p>Emitted when the server closes.</p>
+
+<h3>net.createServer(connectionListener)</h3>
+
+<p>Creates a new TCP server. The <code>connection_listener</code> argument is
+automatically set as a listener for the <code>'connection'</code> event.</p>
+
+<h3>server.listen(port, host=null, callback=null)</h3>
+
+<p>Begin accepting connections on the specified <code>port</code> and <code>host</code>.  If the
+<code>host</code> is omitted, the server will accept connections directed to any
+IPv4 address (<code>INADDR_ANY</code>).</p>
+
+<p>This function is asynchronous. The last parameter <code>callback</code> will be called
+when the server has been bound.</p>
+
+<h3>server.listen(path, callback=null)</h3>
+
+<p>Start a UNIX socket server listening for connections on the given <code>path</code>.</p>
+
+<p>This function is asynchronous. The last parameter <code>callback</code> will be called
+when the server has been bound.</p>
+
+<h3>server.close()</h3>
+
+<p>Stops the server from accepting new connections. This function is
+asynchronous, the server is finally closed when the server emits a <code>'close'</code>
+event.</p>
+
+<h2 id="net.Stream">net.Stream</h2>
+
+<p>This object is an abstraction of of a TCP or UNIX socket.  <code>net.Stream</code>
+instance implement a duplex stream interface.  They can be created by the
+user and used as a client (with <code>connect()</code>) or they can be created by Node
+and passed to the user through the <code>'connection'</code> event of a server.</p>
+
+<p><code>net.Stream</code> instances are an EventEmitters with the following events:</p>
+
+<h3>Event: 'connect'</h3>
+
+<p><code>function () { }</code></p>
+
+<p>Emitted when a stream connection successfully is established.
+See <code>connect()</code>.</p>
+
+<h3>Event: 'secure'</h3>
+
+<p><code>function () { }</code></p>
+
+<p>Emitted when a stream connection successfully establishes a HTTPS handshake with its peer.</p>
+
+<h3>Event: 'data'</h3>
+
+<p><code>function (data) { }</code></p>
+
+<p>Emitted when data is received.  The argument <code>data</code> will be a <code>Buffer</code> or
+<code>String</code>.  Encoding of data is set by <code>stream.setEncoding()</code>.
+(See the section on Readable Streams for more infromation.)</p>
+
+<h3>Event: 'end'</h3>
+
+<p><code>function () { }</code></p>
+
+<p>Emitted when the other end of the stream sends a FIN packet. After this is
+emitted the <code>readyState</code> will be <code>'writeOnly'</code>. One should probably just
+call <code>stream.end()</code> when this event is emitted.</p>
+
+<h3>Event: 'timeout'</h3>
+
+<p><code>function () { }</code></p>
+
+<p>Emitted if the stream times out from inactivity. This is only to notify that
+the stream has been idle. The user must manually close the connection.</p>
+
+<p>See also: <code>stream.setTimeout()</code></p>
+
+<h3>Event: 'drain'</h3>
+
+<p><code>function () { }</code></p>
+
+<p>Emitted when the write buffer becomes empty. Can be used to throttle uploads.</p>
+
+<h3>Event: 'error'</h3>
+
+<p><code>function (exception) { }</code></p>
+
+<p>Emitted when an error occurs.  The <code>'close'</code> event will be called directly
+following this event.</p>
+
+<h3>Event: 'close'</h3>
+
+<p><code>function () { }</code></p>
+
+<p>Emitted once the stream is fully closed. The argument <code>had_error</code> is a boolean which says if
+the stream was closed due to a transmission
+error.</p>
+
+<h3>net.createConnection(port, host='127.0.0.1')</h3>
+
+<p>Construct a new stream object and opens a stream to the specified <code>port</code>
+and <code>host</code>. If the second parameter is omitted, localhost is assumed.</p>
+
+<p>When the stream is established the <code>'connect'</code> event will be emitted.</p>
+
+<h3>stream.connect(port, host='127.0.0.1')</h3>
+
+<p>Opens a stream to the specified <code>port</code> and <code>host</code>. <code>createConnection()</code>
+also opens a stream; normally this method is not needed. Use this only if
+a stream is closed and you want to reuse the object to connect to another
+server.</p>
+
+<p>This function is asynchronous. When the <code>'connect'</code> event is emitted the
+stream is established. If there is a problem connecting, the <code>'connect'</code>
+event will not be emitted, the <code>'error'</code> event will be emitted with
+the exception.</p>
+
+<h3>stream.remoteAddress</h3>
+
+<p>The string representation of the remote IP address. For example,
+<code>'74.125.127.100'</code> or <code>'2001:4860:a005::68'</code>.</p>
+
+<p>This member is only present in server-side connections.</p>
+
+<h3>stream.readyState</h3>
+
+<p>Either <code>'closed'</code>, <code>'open'</code>, <code>'opening'</code>, <code>'readOnly'</code>, or <code>'writeOnly'</code>.</p>
+
+<h3>stream.setEncoding(encoding)</h3>
+
+<p>Sets the encoding (either <code>'ascii'</code>, <code>'utf8'</code>, or <code>'binary'</code>) for data that is
+received.</p>
+
+<h3>stream.setSecure(credentials)</h3>
+
+<p>Enables HTTPS support for the stream, with the crypto module credentials specifying the private key and certificate of the stream, and optionally the CA certificates for use in peer authentication.</p>
+
+<p>If the credentials hold one ore more CA certificates, then the stream will request for the peer to submit a client certificate as part of the HTTPS connection handshake. The validity and content of this can be accessed via verifyPeer() and getPeerCertificate().</p>
+
+<h3>stream.verifyPeer()</h3>
+
+<p>Returns true or false depending on the validity of the peers's certificate in the context of the defined or default list of trusted CA certificates.</p>
+
+<h3>stream.getPeerCertificate()</h3>
+
+<p>Returns a JSON structure detailing the peer's certificate, containing a dictionary with keys for the certificate 'subject', 'issuer', 'valid_from' and 'valid_to'</p>
+
+<h3>stream.write(data, encoding='ascii')</h3>
+
+<p>Sends data on the stream. The second parameter specifies the encoding in
+the case of a string--it defaults to ASCII because encoding to UTF8 is rather
+slow.</p>
+
+<p>Returns <code>true</code> if the entire data was flushed successfully to the kernel
+buffer. Returns <code>false</code> if all or part of the data was queued in user memory.
+<code>'drain'</code> will be emitted when the buffer is again free.</p>
+
+<h3>stream.end()</h3>
+
+<p>Half-closes the stream. I.E., it sends a FIN packet. It is possible the
+server will still send some data. After calling this <code>readyState</code> will be
+<code>'readOnly'</code>.</p>
+
+<h3>stream.destroy()</h3>
+
+<p>Ensures that no more I/O activity happens on this stream. Only necessary in
+case of errors (parse error or so).</p>
+
+<h3>stream.pause()</h3>
+
+<p>Pauses the reading of data. That is, <code>'data'</code> events will not be emitted.
+Useful to throttle back an upload.</p>
+
+<h3>stream.resume()</h3>
+
+<p>Resumes reading after a call to <code>pause()</code>.</p>
+
+<h3>stream.setTimeout(timeout)</h3>
+
+<p>Sets the stream to timeout after <code>timeout</code> milliseconds of inactivity on
+the stream. By default <code>net.Stream</code> do not have a timeout.</p>
+
+<p>When an idle timeout is triggered the stream will receive a <code>'timeout'</code>
+event but the connection will not be severed. The user must manually <code>end()</code>
+or <code>destroy()</code> the stream.</p>
+
+<p>If <code>timeout</code> is 0, then the existing idle timeout is disabled.</p>
+
+<h3>stream.setNoDelay(noDelay=true)</h3>
+
+<p>Disables the Nagle algorithm. By default TCP connections use the Nagle
+algorithm, they buffer data before sending it off. Setting <code>noDelay</code> will
+immediately fire off data each time <code>stream.write()</code> is called.</p>
+
+<h3>stream.setKeepAlive(enable=false, initialDelay)</h3>
+
+<p>Enable/disable keep-alive functionality, and optionally set the initial
+delay before the first keepalive probe is sent on an idle stream.
+Set <code>initialDelay</code> (in milliseconds) to set the delay between the last
+data packet received and the first keepalive probe. Setting 0 for
+initialDelay will leave the value unchanged from the default
+(or previous) setting.</p>
+
+<h2 id="Crypto">Crypto</h2>
+
+<p>Use <code>require('crypto')</code> to access this module.</p>
+
+<p>The crypto module requires OpenSSL to be available on the underlying platform. It offers a way of encapsulating secure credentials to be used as part of a secure HTTPS net or http connection.</p>
+
+<p>It also offers a set of wrappers for OpenSSL's hash, hmac, cipher, decipher, sign and verify methods.</p>
+
+<h3>crypto.createCredentials(details)</h3>
+
+<p>Creates a credentials object, with the optional details being a dictionary with keys:</p>
+
+<p><code>key</code> : a string holding the PEM encoded private key</p>
+
+<p><code>cert</code> : a string holding the PEM encoded certificate</p>
+
+<p><code>ca</code> : either a string or list of strings of PEM encoded CA certificates to trust.</p>
+
+<p>If no 'ca' details are given, then node.js will use the default publicly trusted list of CAs as given in
+http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt</p>
+
+<h3>crypto.createHash(algorithm)</h3>
+
+<p>Creates and returns a hash object, a cryptographic hash with the given algorithm which can be used to generate hash digests.</p>
+
+<p><code>algorithm</code> is dependent on the available algorithms supported by the version of OpenSSL on the platform. Examples are sha1, md5, sha256, sha512, etc. On recent releases, <code>openssl list-message-digest-algorithms</code> will display the available digest algorithms.</p>
+
+<h3>hash.update(data)</h3>
+
+<p>Updates the hash content with the given <code>data</code>. This can be called many times with new data as it is streamed.</p>
+
+<h3>hash.digest(encoding)</h3>
+
+<p>Calculates the digest of all of the passed data to be hashed. The <code>encoding</code> can be 'hex', 'binary' or 'base64'.</p>
+
+<h3>crypto.createHmac(algorithm, key)</h3>
+
+<p>Creates and returns a hmac object, a cryptographic hmac with the given algorithm and key.</p>
+
+<p><code>algorithm</code> is dependent on the available algorithms supported by OpenSSL - see createHash above.
+<code>key</code> is the hmac key to be used.</p>
+
+<h3>hmac.update(data)</h3>
+
+<p>Update the hmac content with the given <code>data</code>. This can be called many times with new data as it is streamed.</p>
+
+<h3>hmac.digest(encoding)</h3>
+
+<p>Calculates the digest of all of the passed data to the hmac. The <code>encoding</code> can be 'hex', 'binary' or 'base64'.</p>
+
+<h3>crypto.createCipher(algorithm, key)</h3>
+
+<p>Creates and returns a cipher object, with the given algorithm and key.</p>
+
+<p><code>algorithm</code> is dependent on OpenSSL, examples are aes192, etc. On recent releases, <code>openssl list-cipher-algorithms</code> will display the available cipher algorithms.</p>
+
+<h3>cipher.update(data, input_encoding, output_encoding)</h3>
+
+<p>Updates the cipher with <code>data</code>, the encoding of which is given in <code>input_encoding</code> and can be 'utf8', 'ascii' or 'binary'. The <code>output_encoding</code> specifies the output format of the enciphered data, and can be 'binary', 'base64'  or 'hex'.</p>
+
+<p>Returns the enciphered contents, and can be called many times with new data as it is streamed.</p>
+
+<h3>cipher.final(output_encoding)</h3>
+
+<p>Returns any remaining enciphered contents, with <code>output_encoding</code> as update above.</p>
+
+<h3>crypto.createDecipher(algorithm, key)</h3>
+
+<p>Creates and returns a decipher object, with the given algorithm and key. This is the mirror of the cipher object above.</p>
+
+<h3>decipher.update(data, input_encoding, output_encoding)</h3>
+
+<p>Updates the decipher with <code>data</code>, which is encoded in 'binary', 'base64' or 'hex'. The <code>output_decoding</code> specifies in what format to return the deciphered plaintext - either 'binary', 'ascii' or 'utf8'.</p>
+
+<h3>decipher.final(output_encoding)</h3>
+
+<p>Returns any remaining plaintext which is deciphered, with `output_encoding' as update above.</p>
+
+<h3>crypto.createSign(algorithm)</h3>
+
+<p>Creates and returns a signing object, with the given algorithm. On recent OpenSSL releases, <code>openssl list-public-key-algorithms</code> will display the available signing algorithms. Examples are 'RSA-SHA256'.</p>
+
+<h3>signer.update(data)</h3>
+
+<p>Updates the signer object with data. This can be called many times with new data as it is streamed.</p>
+
+<h3>signer.sign(private_key, output_format)</h3>
+
+<p>Calculates the signature on all the updated data passed through the signer. <code>private_key</code> is a string containing the PEM encoded private key for signing.</p>
+
+<p>Returns the signature in <code>output_format</code> which can be 'binary', 'hex' or 'base64'</p>
+
+<h3>crypto.createVerify(algorithm)</h3>
+
+<p>Creates and returns a verification object, with the given algorithm. This is the mirror of the signing object above.</p>
+
+<h3>verifier.update(data)</h3>
+
+<p>Updates the verifyer object with data. This can be called many times with new data as it is streamed.</p>
+
+<h3>verifier.verify(public_key, signature, signature_format)</h3>
+
+<p>Verifies the signed data by using the <code>public_key</code> which is a string containing the PEM encoded public key, and <code>signature</code>, which is the previously calculates signature for the data, in the <code>signature_format</code> which can be 'binary', 'hex' or 'base64'.</p>
+
+<p>Returns true or false depending on the validity of the signature for the data and public key.</p>
+
+<h2 id="DNS">DNS</h2>
+
+<p>Use <code>require('dns')</code> to access this module.</p>
+
+<p>Here is an example which resolves <code>'www.google.com'</code> then reverse
+resolves the IP addresses which are returned.</p>
+
+<pre><code>var dns = require('dns'),
+    sys = require('sys');
+
+dns.resolve4('www.google.com', function (err, addresses) {
+  if (err) throw err;
+
+  sys.puts('addresses: ' + JSON.stringify(addresses));
+
+  for (var i = 0; i < addresses.length; i++) {
+    var a = addresses[i];
+    dns.reverse(a, function (err, domains) {
+      if (err) {
+        sys.puts('reverse for ' + a + ' failed: ' + 
+          err.message);
+      } else {
+        sys.puts('reverse for ' + a + ': ' + 
+          JSON.stringify(domains));
+      }
+    });
+  }
+});
+</code></pre>
+
+<h3>dns.resolve(domain, rrtype = 'A', callback)</h3>
+
+<p>Resolves a domain (e.g. <code>'google.com'</code>) into an array of the record types
+specified by rrtype. Valid rrtypes are <code>A</code> (IPV4 addresses), <code>AAAA</code> (IPV6
+addresses), <code>MX</code> (mail exchange records), <code>TXT</code> (text records), <code>SRV</code> (SRV
+records), and <code>PTR</code> (used for reverse IP lookups).</p>
+
+<p>The callback has arguments <code>(err, addresses)</code>.  The type of each item
+in <code>addresses</code> is determined by the record type, and described in the
+documentation for the corresponding lookup methods below.</p>
+
+<p>On error, <code>err</code> would be an instanceof <code>Error</code> object, where <code>err.errno</code> is
+one of the error codes listed below and <code>err.message</code> is a string describing
+the error in English.</p>
+
+<h3>dns.resolve4(domain, callback)</h3>
+
+<p>The same as <code>dns.resolve()</code>, but only for IPv4 queries (<code>A</code> records).
+<code>addresses</code> is an array of IPv4 addresses (e.g.<br />
+<code>['74.125.79.104', '74.125.79.105', '74.125.79.106']</code>).</p>
+
+<h3>dns.resolve6(domain, callback)</h3>
+
+<p>The same as <code>dns.resolve4()</code> except for IPv6 queries (an <code>AAAA</code> query).</p>
+
+<h3>dns.resolveMx(domain, callback)</h3>
+
+<p>The same as <code>dns.resolve()</code>, but only for mail exchange queries (<code>MX</code> records).</p>
+
+<p><code>addresses</code> is an array of MX records, each with a priority and an exchange
+attribute (e.g. <code>[{'priority': 10, 'exchange': 'mx.example.com'},...]</code>).</p>
+
+<h3>dns.resolveTxt(domain, callback)</h3>
+
+<p>The same as <code>dns.resolve()</code>, but only for text queries (<code>TXT</code> records).
+<code>addresses</code> is an array of the text records available for <code>domain</code> (e.g.,
+<code>['v=spf1 ip4:0.0.0.0 ~all']</code>).</p>
+
+<h3>dns.resolveSrv(domain, callback)</h3>
+
+<p>The same as <code>dns.resolve()</code>, but only for service records (<code>SRV</code> records).
+<code>addresses</code> is an array of the SRV records available for <code>domain</code>. Properties
+of SRV records are priority, weight, port, and name (e.g.,
+<code>[{'priority': 10, {'weight': 5, 'port': 21223, 'name': 'service.example.com'}, ...]</code>).</p>
+
+<h3>dns.reverse(ip, callback)</h3>
+
+<p>Reverse resolves an ip address to an array of domain names.</p>
+
+<p>The callback has arguments <code>(err, domains)</code>.</p>
+
+<p>If there an an error, <code>err</code> will be non-null and an instanceof the Error
+object.</p>
+
+<p>Each DNS query can return an error code.</p>
+
+<ul>
+<li><code>dns.TEMPFAIL</code>: timeout, SERVFAIL or similar.</li>
+<li><code>dns.PROTOCOL</code>: got garbled reply.</li>
+<li><code>dns.NXDOMAIN</code>: domain does not exists.</li>
+<li><code>dns.NODATA</code>: domain exists but no data of reqd type.</li>
+<li><code>dns.NOMEM</code>: out of memory while processing.</li>
+<li><code>dns.BADQUERY</code>: the query is malformed.</li>
+</ul>
+
+
+<h2 id="Assert">Assert</h2>
+
+<p>This module is used for writing unit tests for your applications, you can
+access it with <code>require('assert')</code>.</p>
+
+<h3>assert.fail(actual, expected, message, operator)</h3>
+
+<p>Tests if <code>actual</code> is equal to <code>expected</code> using the operator provided.</p>
+
+<h3>assert.ok(value, message)</h3>
+
+<p>Tests if value is a <code>true</code> value, it is equivalent to <code>assert.equal(true, value, message);</code></p>
+
+<h3>assert.equal(actual, expected, message)</h3>
+
+<p>Tests shallow, coercive equality with the equal comparison operator ( <code>==</code> ).</p>
+
+<h3>assert.notEqual(actual, expected, message)</h3>
+
+<p>Tests shallow, coercive non-equality with the not equal comparison operator ( <code>!=</code> ).</p>
+
+<h3>assert.deepEqual(actual, expected, message)</h3>
+
+<p>Tests for deep equality.</p>
+
+<h3>assert.notDeepEqual(actual, expected, message)</h3>
+
+<p>Tests for any deep inequality.</p>
+
+<h3>assert.strictEqual(actual, expected, message)</h3>
+
+<p>Tests strict equality, as determined by the strict equality operator ( <code>===</code> )</p>
+
+<h3>assert.notStrictEqual(actual, expected, message)</h3>
+
+<p>Tests strict non-equality, as determined by the strict not equal operator ( <code>!==</code> )</p>
+
+<h3>assert.throws(block, error, message)</h3>
+
+<p>Expects <code>block</code> to throw an error.</p>
+
+<h3>assert.doesNotThrow(block, error, message)</h3>
+
+<p>Expects <code>block</code> not to throw an error.</p>
+
+<h3>assert.ifError(value)</h3>
+
+<p>Tests if value is not a false value, throws if it is a true value. Useful when testing the first argument, <code>error</code> in callbacks.</p>
+
+<h2 id="Path">Path</h2>
+
+<p>This module contains utilities for dealing with file paths.  Use
+<code>require('path')</code> to use it.  It provides the following methods:</p>
+
+<h3>path.join(/<em> path1, path2, ... </em>/)</h3>
+
+<p>Join all arguments together and resolve the resulting path.  Example:</p>
+
+<pre><code>node> require('path').join(
+...   '/foo', 'bar', 'baz/asdf', 'quux', '..')
+'/foo/bar/baz/asdf'
+</code></pre>
+
+<h3>path.normalizeArray(arr)</h3>
+
+<p>Normalize an array of path parts, taking care of <code>'..'</code> and <code>'.'</code> parts.  Example:</p>
+
+<pre><code>path.normalizeArray(['', 
+  'foo', 'bar', 'baz', 'asdf', 'quux', '..'])
+// returns
+[ '', 'foo', 'bar', 'baz', 'asdf' ]
+</code></pre>
+
+<h3>path.normalize(p)</h3>
+
+<p>Normalize a string path, taking care of <code>'..'</code> and <code>'.'</code> parts.  Example:</p>
+
+<pre><code>path.normalize('/foo/bar/baz/asdf/quux/..')
+// returns
+'/foo/bar/baz/asdf'
+</code></pre>
+
+<h3>path.dirname(p)</h3>
+
+<p>Return the directory name of a path.  Similar to the Unix <code>dirname</code> command.  Example:</p>
+
+<pre><code>path.dirname('/foo/bar/baz/asdf/quux')
+// returns
+'/foo/bar/baz/asdf'
+</code></pre>
+
+<h3>path.basename(p, ext)</h3>
+
+<p>Return the last portion of a path.  Similar to the Unix <code>basename</code> command.  Example:</p>
+
+<pre><code>path.basename('/foo/bar/baz/asdf/quux.html')
+// returns
+'quux.html'
+
+path.basename('/foo/bar/baz/asdf/quux.html', '.html')
+// returns
+'quux'
+</code></pre>
+
+<h3>path.extname(p)</h3>
+
+<p>Return the extension of the path.  Everything after the last '.' in the last portion
+of the path.  If there is no '.' in the last portion of the path or the only '.' is
+the first character, then it returns an empty string.  Examples:</p>
+
+<pre><code>path.extname('index.html')
+// returns 
+'.html'
+
+path.extname('index')
+// returns
+''
+</code></pre>
+
+<h3>path.exists(p, callback)</h3>
+
+<p>Test whether or not the given path exists.  Then, call the <code>callback</code> argument with either true or false.  Example:</p>
+
+<pre><code>path.exists('/etc/passwd', function (exists) {
+  sys.debug(exists ? "it's there" : "no passwd!");
+});
+</code></pre>
+
+<h2 id="URL">URL</h2>
+
+<p>This module has utilities for URL resolution and parsing.
+Call <code>require('url')</code> to use it.</p>
+
+<p>Parsed URL objects have some or all of the following fields, depending on
+whether or not they exist in the URL string. Any parts that are not in the URL
+string will not be in the parsed object. Examples are shown for the URL</p>
+
+<p><code>'http://user:pass@host.com:8080/p/a/t/h?query=string#hash'</code></p>
+
+<ul>
+<li><p><code>href</code></p>
+
+<p>The full URL that was originally parsed. Example:
+<code>'http://user:pass@host.com:8080/p/a/t/h?query=string#hash'</code></p></li>
+<li><p><code>protocol</code></p>
+
+<p>The request protocol.  Example: <code>'http:'</code></p></li>
+<li><p><code>host</code></p>
+
+<p>The full host portion of the URL, including port and authentication information. Example:
+<code>'user:pass at host.com:8080'</code></p></li>
+<li><p><code>auth</code></p>
+
+<p>The authentication information portion of a URL.  Example: <code>'user:pass'</code></p></li>
+<li><p><code>hostname</code></p>
+
+<p>Just the hostname portion of the host.  Example: <code>'host.com'</code></p></li>
+<li><p><code>port</code></p>
+
+<p>The port number portion of the host.  Example: <code>'8080'</code></p></li>
+<li><p><code>pathname</code></p>
+
+<p>The path section of the URL, that comes after the host and before the query, including the initial slash if present.  Example: <code>'/p/a/t/h'</code></p></li>
+<li><p><code>search</code></p>
+
+<p>The 'query string' portion of the URL, including the leading question mark. Example: <code>'?query=string'</code></p></li>
+<li><p><code>query</code></p>
+
+<p>Either the 'params' portion of the query string, or a querystring-parsed object. Example:
+<code>'query=string'</code> or <code>{'query':'string'}</code></p></li>
+<li><p><code>hash</code></p>
+
+<p>The 'fragment' portion of the URL including the pound-sign. Example: <code>'#hash'</code></p></li>
+</ul>
+
+
+<p>The following methods are provided by the URL module:</p>
+
+<h3>url.parse(urlStr, parseQueryString=false)</h3>
+
+<p>Take a URL string, and return an object.  Pass <code>true</code> as the second argument to also parse
+the query string using the <code>querystring</code> module.</p>
+
+<h3>url.format(urlObj)</h3>
+
+<p>Take a parsed URL object, and return a formatted URL string.</p>
+
+<h3>url.resolve(from, to)</h3>
+
+<p>Take a base URL, and a href URL, and resolve them as a browser would for an anchor tag.</p>
+
+<h2 id="Query String">Query String</h2>
+
+<p>This module provides utilities for dealing with query strings.  It provides the following methods:</p>
+
+<h3>querystring.stringify(obj, sep='&', eq='=', munge=true)</h3>
+
+<p>Serialize an object to a query string.  Optionally override the default separator and assignment characters.
+Example:</p>
+
+<pre><code>querystring.stringify({foo: 'bar'})
+// returns
+'foo=bar'
+
+querystring.stringify({foo: 'bar', baz: 'bob'}, ';', ':')
+// returns
+'foo:bar;baz:bob'
+</code></pre>
+
+<p>By default, this function will perform PHP/Rails-style parameter mungeing for arrays and objects used as
+values within <code>obj</code>.
+Example:</p>
+
+<pre><code>querystring.stringify({foo: 'bar', foo: 'baz', foo: 'boz'})
+// returns
+'foo[]=bar&foo[]=baz&foo[]=boz'
+
+querystring.stringify({foo: {bar: 'baz'}})
+// returns
+'foo[bar]=baz'
+</code></pre>
+
+<p>If you wish to disable the array mungeing (e.g. when generating parameters for a Java servlet), you
+can set the <code>munge</code> argument to <code>false</code>.
+Example:</p>
+
+<pre><code>querystring.stringify({foo: 'bar', foo: 'baz', foo: 'boz'}, '&', '=', false)
+// returns
+'foo=bar&foo=baz&foo=boz'
+</code></pre>
+
+<p>Note that when <code>munge</code> is <code>false</code>, parameter names with object values will still be munged.</p>
+
+<h3>querystring.parse(str, sep='&', eq='=')</h3>
+
+<p>Deserialize a query string to an object.  Optionally override the default separator and assignment characters.</p>
+
+<pre><code>querystring.parse('a=b&b=c')
+// returns
+{ 'a': 'b'
+, 'b': 'c'
+}
+</code></pre>
+
+<p>This function can parse both munged and unmunged query strings (see <code>stringify</code> for details).</p>
+
+<h3>querystring.escape</h3>
+
+<p>The escape function used by <code>querystring.stringify</code>, provided so that it could be overridden if necessary.</p>
+
+<h3>querystring.unescape</h3>
+
+<p>The unescape function used by <code>querystring.parse</code>, provided so that it could be overridden if necessary.</p>
+
+<h2 id="REPL">REPL</h2>
+
+<p>A Read-Eval-Print-Loop (REPL) is available both as a standalone program and easily
+includable in other programs.  REPL provides a way to interactively run
+JavaScript and see the results.  It can be used for debugging, testing, or
+just trying things out.</p>
+
+<p>By executing <code>node</code> without any arguments from the command-line you will be
+dropped into the REPL. It has simplistic emacs line-editting.</p>
+
+<pre><code>mjr:~$ node
+Type '.help' for options.
+node> a = [ 1, 2, 3];
+[ 1, 2, 3 ]
+node> a.forEach(function (v) {
+...   sys.puts(v);
+...   });
+1
+2
+3
+</code></pre>
+
+<p>For advanced line-editors, start node with the environmental variable <code>NODE_NO_READLINE=1</code>.
+This will start the REPL in canonical terminal settings which will allow you to use with <code>rlwrap</code>.</p>
+
+<p>For example, you could add this to your bashrc file:</p>
+
+<pre><code>alias node="env NODE_NO_READLINE=1 rlwrap node"
+</code></pre>
+
+<h3>repl.start(prompt, stream)</h3>
+
+<p>Starts a REPL with <code>prompt</code> as the prompt and <code>stream</code> for all I/O.  <code>prompt</code>
+is optional and defaults to <code>node></code>.  <code>stream</code> is optional and defaults to
+<code>process.openStdin()</code>.</p>
+
+<p>Multiple REPLs may be started against the same running instance of node.  Each
+will share the same global object but will have unique I/O.</p>
+
+<p>Here is an example that starts a REPL on stdin, a Unix socket, and a TCP socket:</p>
+
+<pre><code>var sys = require("sys"),
+    net = require("net"),
+    repl = require("repl");
+
+connections = 0;
+
+repl.start("node via stdin> ");
+
+net.createServer(function (socket) {
+  connections += 1;
+  repl.start("node via Unix socket> ", socket);
+}).listen("/tmp/node-repl-sock");
+
+net.createServer(function (socket) {
+  connections += 1;
+  repl.start("node via TCP socket> ", socket);
+}).listen(5001);
+</code></pre>
+
+<p>Running this program from the command line will start a REPL on stdin.  Other
+REPL clients may connect through the Unix socket or TCP socket. <code>telnet</code> is useful
+for connecting to TCP sockets, and <code>socat</code> can be used to connect to both Unix and
+TCP sockets.</p>
+
+<p>By starting a REPL from a Unix socket-based server instead of stdin, you can
+connect to a long-running node process without restarting it.</p>
+
+<h3>REPL Features</h3>
+
+<p>Inside the REPL, Control+D will exit.  Multi-line expressions can be input.</p>
+
+<p>The special variable <code>_</code> (underscore) contains the result of the last expression.</p>
+
+<pre><code>node> [ "a", "b", "c" ]
+[ 'a', 'b', 'c' ]
+node> _.length 
+3
+node> _ += 1
+4
+</code></pre>
+
+<p>The REPL provides access to any variables in the global scope. You can expose a variable
+to the REPL explicitly by assigning it to the <code>scope</code> object associated with each
+<code>REPLServer</code>.  For example:</p>
+
+<pre><code>// repl_test.js
+var repl = require("repl"),
+    msg = "message";
+
+repl.start().scope.m = msg;
+</code></pre>
+
+<p>Things in the <code>scope</code> object appear as local within the REPL:</p>
+
+<pre><code>mjr:~$ node repl_test.js 
+node> m
+'message'
+</code></pre>
+
+<p>There are a few special REPL commands:</p>
+
+<ul>
+<li><p><code>.break</code> - While inputting a multi-line expression, sometimes you get lost or just don't care
+about completing it.  <code>.break</code> will start over.</p></li>
+<li><p><code>.clear</code> - Resets the <code>scope</code> object to an empty object and clears any multi-line expression.</p></li>
+<li><p><code>.exit</code> - Close the I/O stream, which will cause the REPL to exit.</p></li>
+<li><p><code>.help</code> - Show this list of special commands.</p></li>
+</ul>
+
+
+<h2 id="Modules">Modules</h2>
+
+<p>Node uses the CommonJS module system.</p>
+
+<p>Node has a simple module loading system.  In Node, files and modules are in
+one-to-one correspondence.  As an example, <code>foo.js</code> loads the module
+<code>circle.js</code> in the same directory.</p>
+
+<p>The contents of <code>foo.js</code>:</p>
+
+<pre><code>var circle = require('./circle'),
+    sys = require('sys');
+sys.puts( 'The area of a circle of radius 4 is '
+  + circle.area(4));
+</code></pre>
+
+<p>The contents of <code>circle.js</code>:</p>
+
+<pre><code>var PI = 3.14;
+
+exports.area = function (r) {
+  return PI * r * r;
+};
+
+exports.circumference = function (r) {
+  return 2 * PI * r;
+};
+</code></pre>
+
+<p>The module <code>circle.js</code> has exported the functions <code>area()</code> and
+<code>circumference()</code>.  To export an object, add to the special <code>exports</code>
+object.  (Alternatively, one can use <code>this</code> instead of <code>exports</code>.) Variables
+local to the module will be private. In this example the variable <code>PI</code> is
+private to <code>circle.js</code>. The function <code>puts()</code> comes from the module <code>'sys'</code>,
+which is a built-in module. Modules which are not prefixed by <code>'./'</code> are
+built-in module--more about this later.</p>
+
+<p>A module prefixed with <code>'./'</code> is relative to the file calling <code>require()</code>.
+That is, <code>circle.js</code> must be in the same directory as <code>foo.js</code> for
+<code>require('./circle')</code> to find it.</p>
+
+<p>Without the leading <code>'./'</code>, like <code>require('assert')</code> the module is searched
+for in the <code>require.paths</code> array. <code>require.paths</code> on my system looks like
+this:</p>
+
+<p><code>[ '/home/ryan/.node_libraries' ]</code></p>
+
+<p>That is, when <code>require('assert')</code> is called Node looks for:</p>
+
+<ul>
+<li>1: <code>/home/ryan/.node_libraries/assert.js</code></li>
+<li>2: <code>/home/ryan/.node_libraries/assert.node</code></li>
+<li>3: <code>/home/ryan/.node_libraries/assert/index.js</code></li>
+<li>4: <code>/home/ryan/.node_libraries/assert/index.node</code></li>
+</ul>
+
+
+<p>interrupting once a file is found. Files ending in <code>'.node'</code> are binary Addon
+Modules; see 'Addons' below. <code>'index.js'</code> allows one to package a module as
+a directory.</p>
+
+<p><code>require.paths</code> can be modified at runtime by simply unshifting new
+paths onto it, or at startup with the <code>NODE_PATH</code> environmental
+variable (which should be a list of paths, colon separated).</p>
+
+<h2 id="Addons">Addons</h2>
+
+<p>Addons are dynamically linked shared objects. They can provide glue to C and
+C++ libraries. The API (at the moment) is rather complex, involving
+knowledge of several libraries:</p>
+
+<ul>
+<li><p>V8 JavaScript, a C++ library. Used for interfacing with JavaScript:
+creating objects, calling functions, etc.  Documented mostly in the
+<code>v8.h</code> header file (<code>deps/v8/include/v8.h</code> in the Node source tree).</p></li>
+<li><p>libev, C event loop library. Anytime one needs to wait for a file
+descriptor to become readable, wait for a timer, or wait for a signal to
+received one will need to interface with libev.  That is, if you perform
+any I/O, libev will need to be used.  Node uses the <code>EV_DEFAULT</code> event
+loop.  Documentation can be found http:/cvs.schmorp.de/libev/ev.html[here].</p></li>
+<li><p>libeio, C thread pool library. Used to execute blocking POSIX system
+calls asynchronously. Mostly wrappers already exist for such calls, in
+<code>src/file.cc</code> so you will probably not need to use it. If you do need it,
+look at the header file <code>deps/libeio/eio.h</code>.</p></li>
+<li><p>Internal Node libraries. Most importantly is the <code>node::ObjectWrap</code>
+class which you will likely want to derive from.</p></li>
+<li><p>Others. Look in <code>deps/</code> for what else is available.</p></li>
+</ul>
+
+
+<p>Node statically compiles all its dependencies into the executable. When
+compiling your module, you don't need to worry about linking to any of these
+libraries.</p>
+
+<p>To get started let's make a small Addon which does the following except in
+C++:</p>
+
+<pre><code>exports.hello = 'world';
+</code></pre>
+
+<p>To get started we create a file <code>hello.cc</code>:</p>
+
+<pre><code>#include <v8.h>
+
+using namespace v8;
+
+extern 'C' void
+init (Handle<Object> target) 
+{
+  HandleScope scope;
+  target->Set(String::New("hello"), String::New("World"));
+}
+</code></pre>
+
+<p>This source code needs to be built into <code>hello.node</code>, the binary Addon. To
+do this we create a file called <code>wscript</code> which is python code and looks
+like this:</p>
+
+<pre><code>srcdir = '.'
+blddir = 'build'
+VERSION = '0.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 = 'hello'
+  obj.source = 'hello.cc'
+</code></pre>
+
+<p>Running <code>node-waf configure build</code> will create a file
+<code>build/default/hello.node</code> which is our Addon.</p>
+
+<p><code>node-waf</code> is just http://code.google.com/p/waf/[WAF], the python-based build system. <code>node-waf</code> is
+provided for the ease of users.</p>
+
+<p>All Node addons must export a function called <code>init</code> with this signature:</p>
+
+<pre><code>extern 'C' void init (Handle<Object> target)
+</code></pre>
+
+<p>For the moment, that is all the documentation on addons. Please see
+<a href="http://github.com/ry/node_postgres">http://github.com/ry/node_postgres</a> for a real example.</p>
+</div>
+</div>
+<script type="text/javascript" src="./jquery.js"></script>
+<script type="text/javascript" src="./sh_main.js"></script>
+<script type="text/javascript" src="./sh_javascript.min.js"></script>
+<script type="text/javascript" src="./doc.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/testdata/getelement.html b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/testdata/getelement.html
new file mode 100644
index 0000000..423d135
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/testdata/getelement.html
@@ -0,0 +1,3460 @@
+
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+    
+    <title>Stack Overflow</title>
+    <link rel="stylesheet" href="http://sstatic.net/so/all.css?v=22d4e892c082">
+    <link rel="shortcut icon" href="http://sstatic.net/so/favicon.ico">
+    <link rel="apple-touch-icon" href="http://sstatic.net/so/apple-touch-icon.png">
+    <link rel="search" type="application/opensearchdescription+xml" title="Stack Overflow" href="http://sstatic.net/so/opensearch.xml">
+    
+    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
+    
+    <script type="text/javascript" src="http://sstatic.net/js/master.js?v=c37ca6d019e6"></script>
+    <script type="text/javascript">
+    var imagePath='http://sstatic.net/so/img/';
+    
+    </script>
+    
+    <link rel="alternate" type="application/atom+xml" title="Feed of recent questions" href="/feeds">
+
+
+</head>
+<body class="home-page">
+    <noscript><div id="noscript-padding"></div></noscript>
+    <div id="notify-container"></div>
+
+
+    <script type="text/javascript">
+        $(function() { notify.showFirstTime(); });
+    </script>
+
+
+    <div id="custom-header"></div>
+    <div class="container">        
+        <div id="header">
+            <div id="topbar">
+                <div id="hlinks">
+                    <span id="hlinks-user">
+                    
+                    
+                    </span>
+                    <span id="hlinks-nav">
+                    <a href="/users/login?returnurl=%2f">log in</a>
+<span class="lsep">|</span>
+<a href="http://careers.stackoverflow.com/">careers</a>
+<span class="lsep">|</span>
+
+                    </span>
+                    <span id="hlinks-custom">
+                    <a href="/about">about</a> <span class="lsep">|</span> <a href="/faq">faq</a>
+                    </span>
+                </div>
+                <div id="hsearch">
+                    <form id="search" action="/search" method="get">
+                    <div>
+                        <input name="q" class="textbox" tabindex="1" onfocus="if (this.value=='search') this.value = ''" type="text" maxlength="80" size="28" value="search">
+                    </div>
+                    </form>
+                </div>
+            </div>
+            <br class="cbt">
+            <div id="hlogo">
+                <a href="/">Stack Overflow</a>
+            </div>
+            <div id="hmenus">
+                <div class="nav mainnavs">
+                    <ul>
+                        <li><a id="nav-questions" href="/questions">Questions</a></li>
+                        <li><a id="nav-tags" href="/tags">Tags</a></li>
+                        <li><a id="nav-users" href="/users">Users</a></li>
+                        <li><a id="nav-badges" href="/badges">Badges</a></li>
+                        <li><a id="nav-unanswered" href="/unanswered">Unanswered</a></li>
+                    </ul>
+                </div>
+                <div class="nav askquestion">
+                    <ul>
+                        <li id="nav-askquestion" >
+                            <a href="/questions/ask">Ask Question</a>
+                        </li>
+                    </ul>
+                </div>
+            </div>
+        </div>
+    
+        <div id="content">
+            
+    <div id="mainbar">
+            
+<div class="subheader">
+    <h1>Top Questions</h1>
+    <div id="tabs">
+        <a class="youarehere" href="/?tab=active" title="questions that have been asked, answered, or updated recently">active</a>
+<a href="/?tab=featured" title="questions with an active bounty"><span class='bounty-indicator-tab'>114</span>featured</a>
+<a href="/?tab=hot" title="questions with the most activity and interest over the last few days">hot</a>
+<a href="/?tab=week" title="questions with the most activity and interest this week">week</a>
+<a href="/?tab=month" title="questions with the most activity and interest this month">month</a>
+                
+    </div>
+</div>
+<div id="question-mini-list">
+
+<div class="question-summary narrow" id="question-summary-3023551">
+    <div onclick="window.location.href='/questions/3023551/common-function-for-self-errors-add-to-base-in-rails'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">11</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3023551/common-function-for-self-errors-add-to-base-in-rails" class="question-hyperlink" title="In my every model i have 10 or more lines for self.errors.add_to_base. is there any other way i can manage those lines in more easy way? will it possible to manage those errors with some common  … ">Common function for self.errors.add_to_base in rails.</a></h3>
+        
+        <div class="tags t-ruby-on-rails t-ruby">
+            <a href="/questions/tagged/ruby-on-rails" class="post-tag" title="show questions tagged 'ruby-on-rails'" rel="tag">ruby-on-rails</a> <a href="/questions/tagged/ruby" class="post-tag" title="show questions tagged 'ruby'" rel="tag">ruby</a> 
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:21:43Z" class="relativetime">7s ago</span>
+            <a href="/users/363503/krunal-shah" >krunal shah</a> <span class="reputation-score" title="reputation score">3</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024391">
+    <div onclick="window.location.href='/questions/3024391/how-do-i-iterate-through-child-elements-of-a-div-using-jquery'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">10</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024391/how-do-i-iterate-through-child-elements-of-a-div-using-jquery" class="question-hyperlink" title="I have a div and it has several input elements in it... I'd like to iterate through each of those elements. Ideas?
+">How do I iterate through child elements of a div using jQuery?</a></h3>
+        
+        <div class="tags t-jquery">
+            <a href="/questions/tagged/jquery" class="post-tag" title="show questions tagged 'jquery'" rel="tag">jquery</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024391/how-do-i-iterate-through-child-elements-of-a-div-using-jquery/?lastactivity" class="started-link"><span title="2010-06-11 16:21:42Z" class="relativetime">8s ago</span></a>
+            <a href="/users/94197/andy-es-head" >Andy E's head</a> <span class="reputation-score" title="reputation score 15212">15.2k</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024439">
+    <div onclick="window.location.href='/questions/3024439/linq2sqlcalling-stored-procedure-and-reading-return-value'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">0</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024439/linq2sqlcalling-stored-procedure-and-reading-return-value" class="question-hyperlink" title="Using LINQ 2SQL , How can i call a stored procedure which returns either 1 or 0 when being executed.My procedure has 3 input params.I want to know the return value from procedure in my code too.
+">LINQ2SQL:Calling Stored procedure and reading return value</a></h3>
+        
+        <div class="tags t-linq-to-sql t-stored-procedures">
+            <a href="/questions/tagged/linq-to-sql" class="post-tag" title="show questions tagged 'linq-to-sql'" rel="tag">linq-to-sql</a> <a href="/questions/tagged/stored-procedures" class="post-tag" title="show questions tagged 'stored-procedures'" rel="tag">stored-procedures</a> 
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:21:34Z" class="relativetime">16s ago</span>
+            <a href="/users/40521/shyju" >Shyju</a> <span class="reputation-score" title="reputation score">1,031</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024002">
+    <div onclick="window.location.href='/questions/3024002/how-to-create-folder'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">2</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered-accepted" title="one of the answers was accepted as the correct answer">
+            <div class="mini-counts">5</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">88</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024002/how-to-create-folder" class="question-hyperlink" title="please how i can create folder in java ?
+">how to create folder ?</a></h3>
+        
+        <div class="tags t-java">
+            <a href="/questions/tagged/java" class="post-tag" title="show questions tagged 'java'" rel="tag">java</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024002/how-to-create-folder/?lastactivity" class="started-link"><span title="2010-06-11 16:21:30Z" class="relativetime">20s ago</span></a>
+            <a href="/users/14673/luc-m" >Luc M</a> <span class="reputation-score" title="reputation score">1,261</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024397">
+    <div onclick="window.location.href='/questions/3024397/file-copy-from-unc-path-to-same-servers-unc-path-inquiry'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">4</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">11</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024397/file-copy-from-unc-path-to-same-servers-unc-path-inquiry" class="question-hyperlink" title="Will data traffic go through the host application program or will be dealt remotely in scenarios where C#'s File.Copy is used:
+
+File.Copy(@"\\SERVER13\LOL\ROFL.txt", @"\\SERVER13\ROFL.txt")
+
+
+Cheers n  … ">File.Copy from Unc path to (same server’s) Unc path inquiry</a></h3>
+        
+        <div class="tags t-cñ t-cifs">
+            <a href="/questions/tagged/c%23" class="post-tag" title="show questions tagged 'c#'" rel="tag">c#</a> <a href="/questions/tagged/cifs" class="post-tag" title="show questions tagged 'cifs'" rel="tag">cifs</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024397/file-copy-from-unc-path-to-same-servers-unc-path-inquiry/?lastactivity" class="started-link"><span title="2010-06-11 16:21:26Z" class="relativetime">23s ago</span></a>
+            <a href="/users/17028/franci-penov" >Franci Penov</a> <span class="reputation-score" title="reputation score 18680">18.7k</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3023439">
+    <div onclick="window.location.href='/questions/3023439/parsing-indentation-based-syntaxes-in-haskells-parsec'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">1</div>
+            <div>vote</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">2</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">18</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3023439/parsing-indentation-based-syntaxes-in-haskells-parsec" class="question-hyperlink" title="I'm trying to parse an indentation-based language (think Python, Haskell itself, Boo, YAML) in Haskell using Parsec. I've seen the IndentParser library, and it looks like it's the perfect match, but  … ">Parsing Indentation-based syntaxes in Haskell’s Parsec</a></h3>
+        
+        <div class="tags t-parsing t-haskell t-indentation t-parsec">
+            <a href="/questions/tagged/parsing" class="post-tag" title="show questions tagged 'parsing'" rel="tag">parsing</a> <a href="/questions/tagged/haskell" class="post-tag" title="show questions tagged 'haskell'" rel="tag">haskell</a> <a href="/questions/tagged/indentation" class="post-tag" title="show questions tagged 'indentation'" rel="tag">indentation</a> <a href="/questions/tagged/parsec" class="post-tag" title="show questions tagged 'parsec'" rel="tag">parsec</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3023439/parsing-indentation-based-syntaxes-in-haskells-parsec/?lastactivity" class="started-link"><span title="2010-06-11 16:21:26Z" class="relativetime">24s ago</span></a>
+            <a href="/users/334519/travis-brown" >Travis Brown</a> <span class="reputation-score" title="reputation score">1,090</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024418">
+    <div onclick="window.location.href='/questions/3024418/pl-sql-two-statements-with-begin-and-end-run-fine-seperately-but-not-together'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">4</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024418/pl-sql-two-statements-with-begin-and-end-run-fine-seperately-but-not-together" class="question-hyperlink" title="Hi all,
+
+Just wondering if anyone can help with this, I have two PLSQL statements for altering tables (adding extra fields) and they are as follows:
+
+-- Make GC_NAB field for Next Action By Dropdown
+
+ … ">PL-SQL - Two statements with begin and end, run fine seperately but not together?</a></h3>
+        
+        <div class="tags t-oracle t-plsql t-oracle10g t-statements t-end">
+            <a href="/questions/tagged/oracle" class="post-tag" title="show questions tagged 'oracle'" rel="tag">oracle</a> <a href="/questions/tagged/plsql" class="post-tag" title="show questions tagged 'plsql'" rel="tag">plsql</a> <a href="/questions/tagged/oracle10g" class="post-tag" title="show questions tagged 'oracle10g'" rel="tag">oracle10g</a> <a href="/questions/tagged/statements" class="post-tag" title="show questions tagged 'statements'" rel="tag">statements</a> <a href="/ques [...]
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024418/pl-sql-two-statements-with-begin-and-end-run-fine-seperately-but-not-together/?lastactivity" class="started-link"><span title="2010-06-11 16:21:16Z" class="relativetime">33s ago</span></a>
+            <a href="/users/266304/alex-poole" >Alex Poole</a> <span class="reputation-score" title="reputation score">666</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3018026">
+    <div onclick="window.location.href='/questions/3018026/how-to-design-this'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">-2</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">49</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3018026/how-to-design-this" class="question-hyperlink" title="how can i make this entire process as 1 single event???
+
+http://code.google.com/apis/visualization/documentation/dev/dsl_get_started.html
+
+and draw the chart on single click?
+
+I am new to servlets  … ">How to design this ?</a></h3>
+        
+        <div class="tags t-servlets t-google-visualization">
+            <a href="/questions/tagged/servlets" class="post-tag" title="show questions tagged 'servlets'" rel="tag">servlets</a> <a href="/questions/tagged/google-visualization" class="post-tag" title="show questions tagged 'google-visualization'" rel="tag">google-visualization</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3018026/how-to-design-this/?lastactivity" class="started-link"><span title="2010-06-11 16:21:09Z" class="relativetime">40s ago</span></a>
+            <a href="/users/40516/juliet" >Juliet</a> <span class="reputation-score" title="reputation score 20120">20.1k</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3000857">
+    <div onclick="window.location.href='/questions/3000857/are-your-redirects-http-compliant-absolute-uri'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">2</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">4</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">44</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <div class="bounty-indicator" title="this question has an open bounty worth 100 reputation">+100</div><h3><a href="/questions/3000857/are-your-redirects-http-compliant-absolute-uri" class="question-hyperlink" title="In the Hypertext Transfer Protocol 1.1 spec, it states for the Location header:
+
+
+  The field value consists of a single
+  absolute URI.
+
+   Location       = "Location" ":" absoluteURI
+
+  
+  An  … ">Are your redirects HTTP compliant (absolute URI)?</a></h3>
+        
+        <div class="tags t-web-development t-http t-redirect t-http-header-fields t-specifications">
+            <a href="/questions/tagged/web-development" class="post-tag" title="show questions tagged 'web-development'" rel="tag">web-development</a> <a href="/questions/tagged/http" class="post-tag" title="show questions tagged 'http'" rel="tag">http</a> <a href="/questions/tagged/redirect" class="post-tag" title="show questions tagged 'redirect'" rel="tag">redirect</a> <a href="/questions/tagged/http-header-fields" class="post-tag" title="show questions tagged 'http-header-fields'" re [...]
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3000857/are-your-redirects-http-compliant-absolute-uri/?lastactivity" class="started-link"><span title="2010-06-11 16:21:05Z" class="relativetime">45s ago</span></a>
+            <a href="/users/294972/webbiedave" >webbiedave</a> <span class="reputation-score" title="reputation score">4,772</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024420">
+    <div onclick="window.location.href='/questions/3024420/android-how-can-i-upload-a-txt-file-to-a-website'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">6</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024420/android-how-can-i-upload-a-txt-file-to-a-website" class="question-hyperlink" title="I want to upload a txt file to a website, I'll admit I haven't looked into it in any great detail but I have looked at a few examples and would like more experienced opinions on whether I'm going in  … ">Android - How can I upload a txt file to a website?</a></h3>
+        
+        <div class="tags t-java t-android t-http t-upload t-httppost">
+            <a href="/questions/tagged/java" class="post-tag" title="show questions tagged 'java'" rel="tag">java</a> <a href="/questions/tagged/android" class="post-tag" title="show questions tagged 'android'" rel="tag"><img src="http://sstatic.net/so/img/tag-android.png" height="16" width="18" alt="" class="sponsor-tag-img">android</a> <a href="/questions/tagged/http" class="post-tag" title="show questions tagged 'http'" rel="tag">http</a> <a href="/questions/tagged/upload" class="post [...]
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024420/android-how-can-i-upload-a-txt-file-to-a-website/?lastactivity" class="started-link"><span title="2010-06-11 16:21:05Z" class="relativetime">45s ago</span></a>
+            <a href="/users/47773/matthew-flaschen" >Matthew Flaschen</a> <span class="reputation-score" title="reputation score 30082">30.1k</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-371107">
+    <div onclick="window.location.href='/questions/371107/how-much-ram-is-there-in-an-iphone'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">3</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered-accepted" title="one of the answers was accepted as the correct answer">
+            <div class="mini-counts">3</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts warm"><span title='2995 views'>3</span></div>
+            <div class='warm'>kviews</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/371107/how-much-ram-is-there-in-an-iphone" class="question-hyperlink" title="Different iPhones have different published memory 4GB, 8GB and 16GB. The touch can have 32GB. My understanding is this is the off-line memory (disk alike). 
+
+How much actual fast ram is there in the  … ">How much RAM is there in an iPhone?</a></h3>
+        
+        <div class="tags t-iphone t-objective-c t-cocoa t-osx t-ios">
+            <a href="/questions/tagged/iphone" class="post-tag" title="show questions tagged 'iphone'" rel="tag">iphone</a> <a href="/questions/tagged/objective-c" class="post-tag" title="show questions tagged 'objective-c'" rel="tag">objective-c</a> <a href="/questions/tagged/cocoa" class="post-tag" title="show questions tagged 'cocoa'" rel="tag">cocoa</a> <a href="/questions/tagged/osx" class="post-tag" title="show questions tagged 'osx'" rel="tag">osx</a> <a href="/questions/tagged/io [...]
+        </div>
+        <div class="started">
+            
+            <a href="/questions/371107/how-much-ram-is-there-in-an-iphone/?lastactivity" class="started-link"><span title="2010-06-11 16:20:56Z" class="relativetime">54s ago</span></a>
+            <a href="/users/31762/tony-lambert" >Tony Lambert</a> <span class="reputation-score" title="reputation score">1,946</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024434">
+    <div onclick="window.location.href='/questions/3024434/ipad-webapp-full-screen-in-safari'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">1</div>
+            <div>view</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024434/ipad-webapp-full-screen-in-safari" class="question-hyperlink" title="Apple says, the code
+
+ <meta name="apple-mobile-web-app-capable" content="yes">
+
+
+is supposed to make the the web app full screen from iPhone OS 2.1 and later. (Source:  … ">iPad WebApp Full Screen in Safari</a></h3>
+        
+        <div class="tags t-ipad t-webapp t-fullscreen t-meta-tags">
+            <a href="/questions/tagged/ipad" class="post-tag" title="show questions tagged 'ipad'" rel="tag">ipad</a> <a href="/questions/tagged/webapp" class="post-tag" title="show questions tagged 'webapp'" rel="tag">webapp</a> <a href="/questions/tagged/fullscreen" class="post-tag" title="show questions tagged 'fullscreen'" rel="tag">fullscreen</a> <a href="/questions/tagged/meta-tags" class="post-tag" title="show questions tagged 'meta-tags'" rel="tag">meta-tags</a> 
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:20:48Z" class="relativetime">1m ago</span>
+            <a href="/users/354204/christoph-b" >Christoph B</a> <span class="reputation-score" title="reputation score">9</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024349">
+    <div onclick="window.location.href='/questions/3024349/capture-string-from-array-c'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">4</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">41</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024349/capture-string-from-array-c" class="question-hyperlink" title="I'm trying to figure out how to get a string from an array starting at some given position. Say we have an array that's arbitrarily long and my string starts at location 1000. If I wanted to get a  … ">Capture String from Array, C#</a></h3>
+        
+        <div class="tags t-cñ t-string t-array">
+            <a href="/questions/tagged/c%23" class="post-tag" title="show questions tagged 'c#'" rel="tag">c#</a> <a href="/questions/tagged/string" class="post-tag" title="show questions tagged 'string'" rel="tag">string</a> <a href="/questions/tagged/array" class="post-tag" title="show questions tagged 'array'" rel="tag">array</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024349/capture-string-from-array-c/?lastactivity" class="started-link"><span title="2010-06-11 16:20:36Z" class="relativetime">1m ago</span></a>
+            <a href="/users/89586/matthew-whited" >Matthew Whited</a> <span class="reputation-score" title="reputation score">4,432</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024432">
+    <div onclick="window.location.href='/questions/3024432/whats-does-cardinality-of-an-relationship-mean-in-core-data'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">1</div>
+            <div>view</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024432/whats-does-cardinality-of-an-relationship-mean-in-core-data" class="question-hyperlink" title="From the docs:
+
+
+  If all of a managed object's
+  relationship delete rules are Nullify,
+  then for that object at least there is
+  no additional work to do (you may have
+  to consider other objects  … ">What’s does “cardinality of an relationship” mean in Core Data?</a></h3>
+        
+        <div class="tags t-iphone t-core-data">
+            <a href="/questions/tagged/iphone" class="post-tag" title="show questions tagged 'iphone'" rel="tag">iphone</a> <a href="/questions/tagged/core-data" class="post-tag" title="show questions tagged 'core-data'" rel="tag">core-data</a> 
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:20:36Z" class="relativetime">1m ago</span>
+            <a href="/users/268733/dontwatchmyprofile" >dontWatchMyProfile</a> <span class="reputation-score" title="reputation score">949</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024331">
+    <div onclick="window.location.href='/questions/3024331/search-for-a-string-and-replace-it-with-a-variable'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">20</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024331/search-for-a-string-and-replace-it-with-a-variable" class="question-hyperlink" title="Hello,
+
+I am trying to use regular expression to search a document fo a UUID number and replace the end of it with a new number. The code I have so far is:
+
+read_file = open('test.txt', 'r+')
+ … ">Search for a String and replace it with a variable</a></h3>
+        
+        <div class="tags t-python t-regex">
+            <a href="/questions/tagged/python" class="post-tag" title="show questions tagged 'python'" rel="tag">python</a> <a href="/questions/tagged/regex" class="post-tag" title="show questions tagged 'regex'" rel="tag">regex</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024331/search-for-a-string-and-replace-it-with-a-variable/?lastactivity" class="started-link"><span title="2010-06-11 16:20:11Z" class="relativetime">1m ago</span></a>
+            <a href="/users/71877/lyndsey-ferguson" >Lyndsey Ferguson</a> <span class="reputation-score" title="reputation score">1,491</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024327">
+    <div onclick="window.location.href='/questions/3024327/which-directories-does-include-statement-search-in-c-c'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">3</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">33</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024327/which-directories-does-include-statement-search-in-c-c" class="question-hyperlink" title="test.c:
+
+#include "file.h"
+
+
+In the above statement, which directories will be searched ?
+
+I suppose the directory where test.c locates will be searched, right?
+
+But is that all?
+
+BTW, what's the  … ">Which directories does include statement search in C/C++?</a></h3>
+        
+        <div class="tags t-cçç t-c t-include">
+            <a href="/questions/tagged/c%2b%2b" class="post-tag" title="show questions tagged 'c++'" rel="tag">c++</a> <a href="/questions/tagged/c" class="post-tag" title="show questions tagged 'c'" rel="tag">c</a> <a href="/questions/tagged/include" class="post-tag" title="show questions tagged 'include'" rel="tag">include</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024327/which-directories-does-include-statement-search-in-c-c/?lastactivity" class="started-link"><span title="2010-06-11 16:19:56Z" class="relativetime">1m ago</span></a>
+            <a href="/users/170443/jdehaan" >jdehaan</a> <span class="reputation-score" title="reputation score">2,875</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024381">
+    <div onclick="window.location.href='/questions/3024381/c-get-all-collection-properties-from-an-object'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">1</div>
+            <div>vote</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">2</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">18</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024381/c-get-all-collection-properties-from-an-object" class="question-hyperlink" title="Hi, 
+
+I have a class with 3 List collections like the following.
+
+I am trying to have a logic which will iterate through the object's "collection"
+ properties and do some operation using the data  … ">C#, get all collection properties from an object</a></h3>
+        
+        <div class="tags t-cñ t-reflection t-collection">
+            <a href="/questions/tagged/c%23" class="post-tag" title="show questions tagged 'c#'" rel="tag">c#</a> <a href="/questions/tagged/reflection" class="post-tag" title="show questions tagged 'reflection'" rel="tag">reflection</a> <a href="/questions/tagged/collection" class="post-tag" title="show questions tagged 'collection'" rel="tag">collection</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024381/c-get-all-collection-properties-from-an-object/?lastactivity" class="started-link"><span title="2010-06-11 16:19:36Z" class="relativetime">2m ago</span></a>
+            <a href="/users/23590/greg-b" >Greg B</a> <span class="reputation-score" title="reputation score">1,926</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024321">
+    <div onclick="window.location.href='/questions/3024321/run-a-macro-in-all-buffers-in-vim'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">3</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">12</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024321/run-a-macro-in-all-buffers-in-vim" class="question-hyperlink" title="I know about the :bufdo command, and was trying to combine it with a macro I had recorded (@a) to add a #include in the proper spot of each of the header files I'd loaded.  However, I couldn't find an  … ">Run a macro in all buffers in vim</a></h3>
+        
+        <div class="tags t-vim t-macro">
+            <a href="/questions/tagged/vim" class="post-tag" title="show questions tagged 'vim'" rel="tag">vim</a> <a href="/questions/tagged/macro" class="post-tag" title="show questions tagged 'macro'" rel="tag">macro</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024321/run-a-macro-in-all-buffers-in-vim/?lastactivity" class="started-link"><span title="2010-06-11 16:19:35Z" class="relativetime">2m ago</span></a>
+            <a href="/users/206417/dave-kirby" >Dave Kirby</a> <span class="reputation-score" title="reputation score">4,321</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024323">
+    <div onclick="window.location.href='/questions/3024323/flatten-date-range-memberships-retaining-only-the-highest-priority-membership-tr'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">10</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024323/flatten-date-range-memberships-retaining-only-the-highest-priority-membership-tr" class="question-hyperlink" title="Problem statement:
+A table contains an item_id, a category_id and a date range (begin_date and end_date).
+
+No item may be in more than one category on any given date (in general; during daily  … ">Flatten date range memberships retaining only the highest priority membership (TRANSACT-SQL)</a></h3>
+        
+        <div class="tags t-sql t-sql-server t-stored-procedures">
+            <a href="/questions/tagged/sql" class="post-tag" title="show questions tagged 'sql'" rel="tag">sql</a> <a href="/questions/tagged/sql-server" class="post-tag" title="show questions tagged 'sql-server'" rel="tag"><img src="http://sstatic.net/so/img/tag-redgate.png" height="16" width="18" alt="" class="sponsor-tag-img">sql-server</a> <a href="/questions/tagged/stored-procedures" class="post-tag" title="show questions tagged 'stored-procedures'" rel="tag">stored-procedures</a> 
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:19:30Z" class="relativetime">2m ago</span>
+            <a href="/users/364696/shadowranger" >shadowranger</a> <span class="reputation-score" title="reputation score">1</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3020690">
+    <div onclick="window.location.href='/questions/3020690/how-to-remove-unwanted-charecters-using-split-in-tcl'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">1</div>
+            <div>vote</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">3</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">18</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3020690/how-to-remove-unwanted-charecters-using-split-in-tcl" class="question-hyperlink" title="Here is an example
+
+Interface {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} IP-Address {} {} {} {} {} OK? Method Status {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {Protocol
+FastEthernet0/0} {}  … ">How to remove unwanted charecters using split in tcl</a></h3>
+        
+        <div class="tags t-tcl">
+            <a href="/questions/tagged/tcl" class="post-tag" title="show questions tagged 'tcl'" rel="tag">tcl</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3020690/how-to-remove-unwanted-charecters-using-split-in-tcl/?lastactivity" class="started-link"><span title="2010-06-11 16:19:27Z" class="relativetime">2m ago</span></a>
+            <a href="/users/26816/rhseeger" >RHSeeger</a> <span class="reputation-score" title="reputation score">2,713</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024404">
+    <div onclick="window.location.href='/questions/3024404/transform-longitude-latitude-into-meters'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">9</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024404/transform-longitude-latitude-into-meters" class="question-hyperlink" title="I need a function that maps gps positions to x/y values like this:
+
+getXYpos(GeoPoint relativeNullPoint, GeoPoint p){
+   deltaLatitude=p.latitude-relativeNullPoint.latitude;
+    … ">transform longitude latitude into meters</a></h3>
+        
+        <div class="tags t-mapping t-coordinates t-latitude-longitude t-latitude t-longitude">
+            <a href="/questions/tagged/mapping" class="post-tag" title="show questions tagged 'mapping'" rel="tag">mapping</a> <a href="/questions/tagged/coordinates" class="post-tag" title="show questions tagged 'coordinates'" rel="tag">coordinates</a> <a href="/questions/tagged/latitude-longitude" class="post-tag" title="show questions tagged 'latitude-longitude'" rel="tag">latitude-longitude</a> <a href="/questions/tagged/latitude" class="post-tag" title="show questions tagged 'latitu [...]
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024404/transform-longitude-latitude-into-meters/?lastactivity" class="started-link"><span title="2010-06-11 16:19:24Z" class="relativetime">2m ago</span></a>
+            <a href="/users/347594/johncatfish" >johncatfish</a> <span class="reputation-score" title="reputation score">396</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024382">
+    <div onclick="window.location.href='/questions/3024382/how-to-create-a-new-file-in-qt'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">2</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">6</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024382/how-to-create-a-new-file-in-qt" class="question-hyperlink" title="Hello friends,
+
+I am a Qt beginner and just got stuck with the problem. I am looking for a file SomePath/NewDirectoryA/NewFile.kml ( NewFile.kml will be the only file in NewDirectoryA, having this  … ">How to create a new File in Qt </a></h3>
+        
+        <div class="tags t-beginner t-qt t-file t-qfile">
+            <a href="/questions/tagged/beginner" class="post-tag" title="show questions tagged 'beginner'" rel="tag">beginner</a> <a href="/questions/tagged/qt" class="post-tag" title="show questions tagged 'qt'" rel="tag">qt</a> <a href="/questions/tagged/file" class="post-tag" title="show questions tagged 'file'" rel="tag">file</a> <a href="/questions/tagged/qfile" class="post-tag" title="show questions tagged 'qfile'" rel="tag">qfile</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024382/how-to-create-a-new-file-in-qt/?lastactivity" class="started-link"><span title="2010-06-11 16:19:17Z" class="relativetime">2m ago</span></a>
+            <a href="/users/127007/jurily" >Jurily</a> <span class="reputation-score" title="reputation score">2,122</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024369">
+    <div onclick="window.location.href='/questions/3024369/javscript-loop-array-variable-question'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">5</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024369/javscript-loop-array-variable-question" class="question-hyperlink" title="Hi. I'm trying to get this to work and I hope this isn't too vague.    -Chris
+
+var example = new Array();
+
+var test1 = "one";
+var test2 = "two";
+var test3 = "three";
+
+for (v = 1; v <= 3; v++) {
+ … ">Javscript Loop / Array / Variable question</a></h3>
+        
+        <div class="tags t-array t-variable t-loop t-for">
+            <a href="/questions/tagged/array" class="post-tag" title="show questions tagged 'array'" rel="tag">array</a> <a href="/questions/tagged/variable" class="post-tag" title="show questions tagged 'variable'" rel="tag">variable</a> <a href="/questions/tagged/loop" class="post-tag" title="show questions tagged 'loop'" rel="tag">loop</a> <a href="/questions/tagged/for" class="post-tag" title="show questions tagged 'for'" rel="tag">for</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024369/javscript-loop-array-variable-question/?lastactivity" class="started-link"><span title="2010-06-11 16:19:12Z" class="relativetime">2m ago</span></a>
+            <a href="/users/70465/andy" >Andy</a> <span class="reputation-score" title="reputation score">49</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3022965">
+    <div onclick="window.location.href='/questions/3022965/which-is-faster-in-sql-while-loop-recursive-stored-proc-or-cursor'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">7</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">9</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">155</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3022965/which-is-faster-in-sql-while-loop-recursive-stored-proc-or-cursor" class="question-hyperlink" title="Which is faster in SQL, While loop, Recursive Stored proc, or Cursor?
+I want to optimize the performance in a couple of spots in a stored procedure.
+The code I'm optimizing formats some strings for  … ">Which is faster in SQL, While loop, Recursive Stored proc, or Cursor?</a></h3>
+        
+        <div class="tags t-sql t-stored-procedures t-cursor t-performance-comparison t-while">
+            <a href="/questions/tagged/sql" class="post-tag" title="show questions tagged 'sql'" rel="tag">sql</a> <a href="/questions/tagged/stored-procedures" class="post-tag" title="show questions tagged 'stored-procedures'" rel="tag">stored-procedures</a> <a href="/questions/tagged/cursor" class="post-tag" title="show questions tagged 'cursor'" rel="tag">cursor</a> <a href="/questions/tagged/performance-comparison" class="post-tag" title="show questions tagged 'performance-comparison [...]
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3022965/which-is-faster-in-sql-while-loop-recursive-stored-proc-or-cursor/?lastactivity" class="started-link"><span title="2010-06-11 16:19:11Z" class="relativetime">2m ago</span></a>
+            <a href="/users/740/sqlmenace" >SQLMenace</a> <span class="reputation-score" title="reputation score 20701">20.7k</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024424">
+    <div onclick="window.location.href='/questions/3024424/how-to-setcookie-in-a-system-net-httpwebrequest-request-for-another-page2-aspx'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">1</div>
+            <div>view</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024424/how-to-setcookie-in-a-system-net-httpwebrequest-request-for-another-page2-aspx" class="question-hyperlink" title="How can I SetCookie in Page1.aspx by a System.Net.HttpWebRequest request for Page2.aspx which handle the SetCookie() function?
+
+Page1.aspx and Page2.aspx are in the same webapp.
+
+Page1.aspx:
+
+ … ">How to SetCookie() in a System.Net.HttpWebRequest request for another Page2.aspx?</a></h3>
+        
+        <div class="tags t-cñ t-httpwebrequest">
+            <a href="/questions/tagged/c%23" class="post-tag" title="show questions tagged 'c#'" rel="tag">c#</a> <a href="/questions/tagged/httpwebrequest" class="post-tag" title="show questions tagged 'httpwebrequest'" rel="tag">httpwebrequest</a> 
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:19:10Z" class="relativetime">2m ago</span>
+            <a href="/users/40919/mike108" >Mike108</a> <span class="reputation-score" title="reputation score">266</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024423">
+    <div onclick="window.location.href='/questions/3024423/drupal-features-include-theme'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">1</div>
+            <div>view</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024423/drupal-features-include-theme" class="question-hyperlink" title="Is it possible to include a theme in a Drupal Feature? if so how?
+">Drupal Features include Theme</a></h3>
+        
+        <div class="tags t-drupal">
+            <a href="/questions/tagged/drupal" class="post-tag" title="show questions tagged 'drupal'" rel="tag">drupal</a> 
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:19:03Z" class="relativetime">2m ago</span>
+            <a href="/users/201865/linda" >Linda</a> <span class="reputation-score" title="reputation score">93</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3022799">
+    <div onclick="window.location.href='/questions/3022799/select-in-mysql-based-on-two-tables'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">3</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered-accepted" title="one of the answers was accepted as the correct answer">
+            <div class="mini-counts">3</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">29</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3022799/select-in-mysql-based-on-two-tables" class="question-hyperlink" title="I have two tables.
+
+diseases
+
+-----------------------------
+| ID  |  NAME               |
+-----------------------------
+| 1   | Disease 1           |
+| 2   | Disease 2           |
+| 3   | Disease 3     … ">Select in MySQL based on two tables</a></h3>
+        
+        <div class="tags t-mysql t-join">
+            <a href="/questions/tagged/mysql" class="post-tag" title="show questions tagged 'mysql'" rel="tag">mysql</a> <a href="/questions/tagged/join" class="post-tag" title="show questions tagged 'join'" rel="tag">join</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3022799/select-in-mysql-based-on-two-tables/?lastactivity" class="started-link"><span title="2010-06-11 16:19:02Z" class="relativetime">2m ago</span></a>
+            <a href="/users/135152/omg-ponies" >OMG Ponies</a> <span class="reputation-score" title="reputation score 28790">28.8k</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024372">
+    <div onclick="window.location.href='/questions/3024372/how-to-read-a-file-from-bottom-to-top-in-ruby'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">8</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024372/how-to-read-a-file-from-bottom-to-top-in-ruby" class="question-hyperlink" title="I've been working on a log viewer for a Rails app and have found that I need to read around 200 lines of a log file from bottom to top instead of the default top to bottom.
+
+Log files can get quite  … ">How to read a file from bottom to top in Ruby?</a></h3>
+        
+        <div class="tags t-ruby-on-rails t-ruby t-file-io">
+            <a href="/questions/tagged/ruby-on-rails" class="post-tag" title="show questions tagged 'ruby-on-rails'" rel="tag">ruby-on-rails</a> <a href="/questions/tagged/ruby" class="post-tag" title="show questions tagged 'ruby'" rel="tag">ruby</a> <a href="/questions/tagged/file-io" class="post-tag" title="show questions tagged 'file-io'" rel="tag">file-io</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024372/how-to-read-a-file-from-bottom-to-top-in-ruby/?lastactivity" class="started-link"><span title="2010-06-11 16:19:01Z" class="relativetime">2m ago</span></a>
+            <a href="/users/349415/jesse-j" >Jesse J</a> <span class="reputation-score" title="reputation score">74</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024346">
+    <div onclick="window.location.href='/questions/3024346/put-buttons-inside-listbox-wpf'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">4</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024346/put-buttons-inside-listbox-wpf" class="question-hyperlink" title="I want to create list of buttons, and i want buttons to spread across the list item space. Here is what i have:
+
+    <ListBox Margin="44,54,134,0" Name="listView1" Height="64" >
+         … ">Put buttons inside ListBox [WPF]</a></h3>
+        
+        <div class="tags t-ûnet t-wpf">
+            <a href="/questions/tagged/.net" class="post-tag" title="show questions tagged '.net'" rel="tag">.net</a> <a href="/questions/tagged/wpf" class="post-tag" title="show questions tagged 'wpf'" rel="tag">wpf</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024346/put-buttons-inside-listbox-wpf/?lastactivity" class="started-link"><span title="2010-06-11 16:18:47Z" class="relativetime">3m ago</span></a>
+            <a href="/users/206394/dan-bryant" >Dan Bryant</a> <span class="reputation-score" title="reputation score">2,530</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024403">
+    <div onclick="window.location.href='/questions/3024403/jquery-ajax-load-post-result-to-div'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">8</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024403/jquery-ajax-load-post-result-to-div" class="question-hyperlink" title="Hello,
+
+I have a form that I need to post and show the result in a div. I'm not having any problems making the ajax call but I can't seem to figure out how to load the result to a div. I have tried:
+
+ … ">jquery, ajax, load post result to div</a></h3>
+        
+        <div class="tags t-javascript t-jquery t-ajax">
+            <a href="/questions/tagged/javascript" class="post-tag" title="show questions tagged 'javascript'" rel="tag">javascript</a> <a href="/questions/tagged/jquery" class="post-tag" title="show questions tagged 'jquery'" rel="tag">jquery</a> <a href="/questions/tagged/ajax" class="post-tag" title="show questions tagged 'ajax'" rel="tag">ajax</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024403/jquery-ajax-load-post-result-to-div/?lastactivity" class="started-link"><span title="2010-06-11 16:18:36Z" class="relativetime">3m ago</span></a>
+            <a href="/users/182668/pointy" >Pointy</a> <span class="reputation-score" title="reputation score 14892">14.9k</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3023947">
+    <div onclick="window.location.href='/questions/3023947/php-how-to-access-constant-defined-outside-class'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered-accepted" title="one of the answers was accepted as the correct answer">
+            <div class="mini-counts">4</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">34</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3023947/php-how-to-access-constant-defined-outside-class" class="question-hyperlink" title="I have defined some constants eg:
+
+define('DB_HOSTNAME', 'localhost', true);
+define('DB_USERNAME', 'root', true);
+define('DB_PASSWORD', 'root', true);
+define('DB_DATABASE', 'authtest', true);
+
+
+now  … ">PHP How to access constant defined outside class?</a></h3>
+        
+        <div class="tags t-php t-class t-global t-define t-constant">
+            <a href="/questions/tagged/php" class="post-tag" title="show questions tagged 'php'" rel="tag">php</a> <a href="/questions/tagged/class" class="post-tag" title="show questions tagged 'class'" rel="tag">class</a> <a href="/questions/tagged/global" class="post-tag" title="show questions tagged 'global'" rel="tag">global</a> <a href="/questions/tagged/define" class="post-tag" title="show questions tagged 'define'" rel="tag">define</a> <a href="/questions/tagged/constant" class=" [...]
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3023947/php-how-to-access-constant-defined-outside-class/?lastactivity" class="started-link"><span title="2010-06-11 16:18:30Z" class="relativetime">3m ago</span></a>
+            <a href="/users/345220/joseph" >Joseph</a> <span class="reputation-score" title="reputation score">170</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024417">
+    <div onclick="window.location.href='/questions/3024417/writing-hbase-reports'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">1</div>
+            <div>view</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024417/writing-hbase-reports" class="question-hyperlink" title="Hello i've just started exploring hbase
+
+i've run 2 samples : SampleUploader from examples and PerformanceEvaluation as given in 
+
+hadoop wiki:       http://wiki.apache.org/hadoop/Hbase/MapReduce 
+
+ … ">writing hbase reports </a></h3>
+        
+        <div class="tags t-hadoop t-hbase">
+            <a href="/questions/tagged/hadoop" class="post-tag" title="show questions tagged 'hadoop'" rel="tag">hadoop</a> <a href="/questions/tagged/hbase" class="post-tag" title="show questions tagged 'hbase'" rel="tag">hbase</a> 
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:18:24Z" class="relativetime">3m ago</span>
+            <a href="/users/358872/sammy" >sammy</a> <span class="reputation-score" title="reputation score">1</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024316">
+    <div onclick="window.location.href='/questions/3024316/how-can-i-forward-a-query-string-using-htaccess'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">2</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">2</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">7</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024316/how-can-i-forward-a-query-string-using-htaccess" class="question-hyperlink" title="I am using this, at present, to rewrite URLS:
+
+RewriteEngine on
+RewriteRule ^([^/?\.]+)$ /page.php?name=$1 [NC]
+
+
+So mysite.com/home gets rewritten to mysite.com/page.php?name=home
+
+How can I make it  … ">How can I forward a query string using htaccess?</a></h3>
+        
+        <div class="tags t-ûhtaccess t-querystring">
+            <a href="/questions/tagged/.htaccess" class="post-tag" title="show questions tagged '.htaccess'" rel="tag">.htaccess</a> <a href="/questions/tagged/querystring" class="post-tag" title="show questions tagged 'querystring'" rel="tag">querystring</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024316/how-can-i-forward-a-query-string-using-htaccess/?lastactivity" class="started-link"><span title="2010-06-11 16:18:19Z" class="relativetime">3m ago</span></a>
+            <a href="/users/102441/eric" >Eric</a> <span class="reputation-score" title="reputation score">2,629</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024127">
+    <div onclick="window.location.href='/questions/3024127/can-anyone-explain-why-my-crypto-decrypted-file-16-bytes-short'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">14</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024127/can-anyone-explain-why-my-crypto-decrypted-file-16-bytes-short" class="question-hyperlink" title="I suspect it might be too much to hope for, but can anyone with experience with crypto++ explain why the "decrypted.out" file created by main() is 16 characters short (which probably not  … ">Can anyone explain why my crypto++ decrypted file 16 bytes short?</a></h3>
+        
+        <div class="tags t-cçç t-encryption t-cryptoçç">
+            <a href="/questions/tagged/c%2b%2b" class="post-tag" title="show questions tagged 'c++'" rel="tag">c++</a> <a href="/questions/tagged/encryption" class="post-tag" title="show questions tagged 'encryption'" rel="tag">encryption</a> <a href="/questions/tagged/crypto%2b%2b" class="post-tag" title="show questions tagged 'crypto++'" rel="tag">crypto++</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024127/can-anyone-explain-why-my-crypto-decrypted-file-16-bytes-short/?lastactivity" class="started-link"><span title="2010-06-11 16:18:19Z" class="relativetime">3m ago</span></a>
+            <a href="/users/138255/aoi-karasu" >AOI Karasu</a> <span class="reputation-score" title="reputation score">195</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024387">
+    <div onclick="window.location.href='/questions/3024387/what-is-a-good-approach-to-preloading-data'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">1</div>
+            <div>vote</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">8</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024387/what-is-a-good-approach-to-preloading-data" class="question-hyperlink" title="Are there best practices out there for loading data into a database, to be used with a new installation of an application? For example, for application foo to run, it needs some basic data before it  … ">What is a good approach to preloading data?</a></h3>
+        
+        <div class="tags t-database t-web-applications t-new t-loading">
+            <a href="/questions/tagged/database" class="post-tag" title="show questions tagged 'database'" rel="tag">database</a> <a href="/questions/tagged/web-applications" class="post-tag" title="show questions tagged 'web-applications'" rel="tag">web-applications</a> <a href="/questions/tagged/new" class="post-tag" title="show questions tagged 'new'" rel="tag">new</a> <a href="/questions/tagged/loading" class="post-tag" title="show questions tagged 'loading'" rel="tag">loading</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024387/what-is-a-good-approach-to-preloading-data/?lastactivity" class="started-link"><span title="2010-06-11 16:18:15Z" class="relativetime">3m ago</span></a>
+            <a href="/users/18255/cade-roux" >Cade Roux</a> <span class="reputation-score" title="reputation score 21827">21.8k</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024362">
+    <div onclick="window.location.href='/questions/3024362/concatenation-output-problem-tostring-array-java'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">3</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">23</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024362/concatenation-output-problem-tostring-array-java" class="question-hyperlink" title="Hello,
+
+I am trying to display the output as "1(10) 2(23) 3(29)" but instead getting output as "1 2 3 (10)(23)(29)". I would be grateful if someone could have a look the code and possible help me. I  … ">concatenation output problem (toString Array) - java</a></h3>
+        
+        <div class="tags t-java">
+            <a href="/questions/tagged/java" class="post-tag" title="show questions tagged 'java'" rel="tag">java</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024362/concatenation-output-problem-tostring-array-java/?lastactivity" class="started-link"><span title="2010-06-11 16:18:12Z" class="relativetime">3m ago</span></a>
+            <a href="/users/265143/peter-torok" >Péter Török</a> <span class="reputation-score" title="reputation score 17330">17.3k</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3016508">
+    <div onclick="window.location.href='/questions/3016508/total-number-of-records-required-in-paged-net-datagrid-control'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">14</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3016508/total-number-of-records-required-in-paged-net-datagrid-control" class="question-hyperlink" title="I am using a data grid and has bound a data source with it. 
+
+I am trying to get the total number of records in the grid in overriden InitializePager method from pagedDataSource DataSourceCount. 
+
+I  … ">Total Number of records required in paged .NET datagrid control</a></h3>
+        
+        <div class="tags t-cñ t-ûnet t-datagrid t-asp t-custompaging">
+            <a href="/questions/tagged/c%23" class="post-tag" title="show questions tagged 'c#'" rel="tag">c#</a> <a href="/questions/tagged/.net" class="post-tag" title="show questions tagged '.net'" rel="tag">.net</a> <a href="/questions/tagged/datagrid" class="post-tag" title="show questions tagged 'datagrid'" rel="tag">datagrid</a> <a href="/questions/tagged/asp" class="post-tag" title="show questions tagged 'asp'" rel="tag">asp</a> <a href="/questions/tagged/custompaging" class="pos [...]
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:17:42Z" class="relativetime">4m ago</span>
+            <a href="/users/345280/sumitchauhan" >sumitchauhan</a> <span class="reputation-score" title="reputation score">1</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024409">
+    <div onclick="window.location.href='/questions/3024409/advice-on-setting-up-svn'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">9</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024409/advice-on-setting-up-svn" class="question-hyperlink" title="I'm trying to setup an svn server. 
+
+I maintain couple of websites based on asp. There are three environments currently.
+
+
+Development: Any new modules/enhancements will be done in this environment
+ … ">advice on setting up SVN</a></h3>
+        
+        <div class="tags t-svn t-tortoisesvn">
+            <a href="/questions/tagged/svn" class="post-tag" title="show questions tagged 'svn'" rel="tag">svn</a> <a href="/questions/tagged/tortoisesvn" class="post-tag" title="show questions tagged 'tortoisesvn'" rel="tag">tortoisesvn</a> 
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:17:35Z" class="relativetime">4m ago</span>
+            <a href="/users/251047/vivek-chandraprakash" >Vivek Chandraprakash</a> <span class="reputation-score" title="reputation score">120</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3021420">
+    <div onclick="window.location.href='/questions/3021420/java-api-to-exiftool'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">2</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">14</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3021420/java-api-to-exiftool" class="question-hyperlink" title="Hi!
+
+I am interesting en parser the exiftool result with a java api or something like that.
+
+I have been researching, but i didn't find any example. For example, how could I get theese results in my  … ">Java api to exiftool</a></h3>
+        
+        <div class="tags t-mini-exiftool">
+            <a href="/questions/tagged/mini-exiftool" class="post-tag" title="show questions tagged 'mini-exiftool'" rel="tag">mini-exiftool</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3021420/java-api-to-exiftool/?lastactivity" class="started-link"><span title="2010-06-11 16:17:24Z" class="relativetime">4m ago</span></a>
+            <a href="/users/177219/phil-harvey" >Phil Harvey</a> <span class="reputation-score" title="reputation score">26</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3021766">
+    <div onclick="window.location.href='/questions/3021766/spring-scheduling-and-pooling-runnables-of-different-state-each-runnable-inst'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">12</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3021766/spring-scheduling-and-pooling-runnables-of-different-state-each-runnable-inst" class="question-hyperlink" title="Hi, I can't figure out what to use for scheduling and pooling runnables of different state (each Runnable instance has different state). I could use ScheduledExecutorFactoryBean together with  … ">Spring -  scheduling and pooling runnables of different state (each Runnable instance has different state)</a></h3>
+        
+        <div class="tags t-spring t-threadpool">
+            <a href="/questions/tagged/spring" class="post-tag" title="show questions tagged 'spring'" rel="tag">spring</a> <a href="/questions/tagged/threadpool" class="post-tag" title="show questions tagged 'threadpool'" rel="tag">threadpool</a> 
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:17:19Z" class="relativetime">4m ago</span>
+            <a href="/users/306488/lisak" >lisak</a> <span class="reputation-score" title="reputation score">51</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3021693">
+    <div onclick="window.location.href='/questions/3021693/please-provide-an-alternative-for-db-visualiser-for-handling-netezza-database'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">5</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3021693/please-provide-an-alternative-for-db-visualiser-for-handling-netezza-database" class="question-hyperlink" title="Hi .. currently i use db visualiser for connecting the netezza database. can you suggest any otehr alternative (freeware) for the same.
+">Please provide an alternative for DB visualiser for handling netezza database</a></h3>
+        
+        <div class="tags t-database t-netezza">
+            <a href="/questions/tagged/database" class="post-tag" title="show questions tagged 'database'" rel="tag">database</a> <a href="/questions/tagged/netezza" class="post-tag" title="show questions tagged 'netezza'" rel="tag">netezza</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3021693/please-provide-an-alternative-for-db-visualiser-for-handling-netezza-database/?lastactivity" class="started-link"><span title="2010-06-11 16:17:19Z" class="relativetime">4m ago</span></a>
+            <a href="/users/364719/jeff" >Jeff</a> <span class="reputation-score" title="reputation score">1</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024384">
+    <div onclick="window.location.href='/questions/3024384/thread-safety-and-system-text-encoding-in-c'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">2</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">14</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024384/thread-safety-and-system-text-encoding-in-c" class="question-hyperlink" title="Is it safe to use the same Encoding object from different threads?
+
+By "using" I mean, calling Encoding.GetString(), Encoding.GetBytes() and write some XML with an XmlWriter (created by something like  … ">Thread safety and System.Text.Encoding in C#</a></h3>
+        
+        <div class="tags t-cñ t-thread-safety">
+            <a href="/questions/tagged/c%23" class="post-tag" title="show questions tagged 'c#'" rel="tag">c#</a> <a href="/questions/tagged/thread-safety" class="post-tag" title="show questions tagged 'thread-safety'" rel="tag">thread-safety</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024384/thread-safety-and-system-text-encoding-in-c/?lastactivity" class="started-link"><span title="2010-06-11 16:17:15Z" class="relativetime">4m ago</span></a>
+            <a href="/users/9453/daniel-dipaolo" >Daniel DiPaolo</a> <span class="reputation-score" title="reputation score">3,800</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024265">
+    <div onclick="window.location.href='/questions/3024265/expand-my-knowledge-in-db-programming'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">4</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">50</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024265/expand-my-knowledge-in-db-programming" class="question-hyperlink" title="Hi there, my name is Tal,
+
+Im working on a PHP Application the should have lots and lots of records, what DB should I use, and are there guides on the web that explains how to build efficient dbs and  … ">Expand my knowledge in DB programming</a></h3>
+        
+        <div class="tags t-php t-sql t-database">
+            <a href="/questions/tagged/php" class="post-tag" title="show questions tagged 'php'" rel="tag">php</a> <a href="/questions/tagged/sql" class="post-tag" title="show questions tagged 'sql'" rel="tag">sql</a> <a href="/questions/tagged/database" class="post-tag" title="show questions tagged 'database'" rel="tag">database</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024265/expand-my-knowledge-in-db-programming/?lastactivity" class="started-link"><span title="2010-06-11 16:16:42Z" class="relativetime">5m ago</span></a>
+            <a href="/users/200145/emanuil" >Emanuil</a> <span class="reputation-score" title="reputation score">687</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024197">
+    <div onclick="window.location.href='/questions/3024197/what-does-int-argc-char-argv-mean'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">6</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">100</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024197/what-does-int-argc-char-argv-mean" class="question-hyperlink" title="In many C++ IDE's and compilers, when it generates the main function for you, it looks like this:
+
+int main(int argc, char *argv[])
+
+When I code C++ without an IDE, just with a command line compiler,  … ">What does int argc, char *argv[] mean?</a></h3>
+        
+        <div class="tags t-cçç t-ide t-parameters">
+            <a href="/questions/tagged/c%2b%2b" class="post-tag" title="show questions tagged 'c++'" rel="tag">c++</a> <a href="/questions/tagged/ide" class="post-tag" title="show questions tagged 'ide'" rel="tag">ide</a> <a href="/questions/tagged/parameters" class="post-tag" title="show questions tagged 'parameters'" rel="tag">parameters</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024197/what-does-int-argc-char-argv-mean/?lastactivity" class="started-link"><span title="2010-06-11 16:16:33Z" class="relativetime">5m ago</span></a>
+            <a href="/users/229044/meagar" >meagar</a> <span class="reputation-score" title="reputation score">4,055</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3023985">
+    <div onclick="window.location.href='/questions/3023985/what-arguments-to-use-to-explain-why-sql-server-is-far-better-then-a-flat-file'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">1</div>
+            <div>vote</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">13</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">133</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3023985/what-arguments-to-use-to-explain-why-sql-server-is-far-better-then-a-flat-file" class="question-hyperlink" title="The higher ups in my company were told by good friends that flat files are the way to go, and we should switch from SQL Server to them for everything we do. We have over 300 servers and hundreds of  … ">What arguments to use to explain why SQL Server is far better then a flat file</a></h3>
+        
+        <div class="tags t-sql-server t-management t-flat-file">
+            <a href="/questions/tagged/sql-server" class="post-tag" title="show questions tagged 'sql-server'" rel="tag"><img src="http://sstatic.net/so/img/tag-redgate.png" height="16" width="18" alt="" class="sponsor-tag-img">sql-server</a> <a href="/questions/tagged/management" class="post-tag" title="show questions tagged 'management'" rel="tag">management</a> <a href="/questions/tagged/flat-file" class="post-tag" title="show questions tagged 'flat-file'" rel="tag">flat-file</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3023985/what-arguments-to-use-to-explain-why-sql-server-is-far-better-then-a-flat-file/?lastactivity" class="started-link"><span title="2010-06-11 16:16:14Z" class="relativetime">5m ago</span></a>
+            <a href="/users/305319/james-westgate" >James Westgate</a> <span class="reputation-score" title="reputation score">2,723</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024353">
+    <div onclick="window.location.href='/questions/3024353/finding-a-list-of-indices-from-master-array-using-secondary-array-with-non-unique'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">5</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024353/finding-a-list-of-indices-from-master-array-using-secondary-array-with-non-unique" class="question-hyperlink" title="I have a master array of length n of id numbers that apply to other analogous arrays with corresponding data for elements in my simulation that belong to those id numbers (e.g. data[id]). Were I to  … ">Finding a list of indices from master array using secondary array with non-unique entries</a></h3>
+        
+        <div class="tags t-python t-indexing t-numpy">
+            <a href="/questions/tagged/python" class="post-tag" title="show questions tagged 'python'" rel="tag">python</a> <a href="/questions/tagged/indexing" class="post-tag" title="show questions tagged 'indexing'" rel="tag">indexing</a> <a href="/questions/tagged/numpy" class="post-tag" title="show questions tagged 'numpy'" rel="tag">numpy</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024353/finding-a-list-of-indices-from-master-array-using-secondary-array-with-non-unique/?lastactivity" class="started-link"><span title="2010-06-11 16:16:07Z" class="relativetime">5m ago</span></a>
+            <a href="/users/355724/veearr" >VeeArr</a> <span class="reputation-score" title="reputation score">1,011</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3022640">
+    <div onclick="window.location.href='/questions/3022640/mysql-showing-null-values-for-group-by-statements'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">5</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">3</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">24</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3022640/mysql-showing-null-values-for-group-by-statements" class="question-hyperlink" title="I'm doing:
+
+   select sum(clicks), 
+          date 
+     from stats 
+ group by date
+
+
+...however when the sum is null for some date, the whole row is discarded, I want to see: | null | some_date |,  … ">mysql showing null values for group by statements</a></h3>
+        
+        <div class="tags t-sql t-mysql t-null t-group-by">
+            <a href="/questions/tagged/sql" class="post-tag" title="show questions tagged 'sql'" rel="tag">sql</a> <a href="/questions/tagged/mysql" class="post-tag" title="show questions tagged 'mysql'" rel="tag">mysql</a> <a href="/questions/tagged/null" class="post-tag" title="show questions tagged 'null'" rel="tag">null</a> <a href="/questions/tagged/group-by" class="post-tag" title="show questions tagged 'group-by'" rel="tag">group-by</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3022640/mysql-showing-null-values-for-group-by-statements/?lastactivity" class="started-link"><span title="2010-06-11 16:15:52Z" class="relativetime">5m ago</span></a>
+            <a href="/users/135152/omg-ponies" >OMG Ponies</a> <span class="reputation-score" title="reputation score 28790">28.8k</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024399">
+    <div onclick="window.location.href='/questions/3024399/use-vbscript-to-get-32-bit-floating-point-into-binary-byte-or-word-representation'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">2</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024399/use-vbscript-to-get-32-bit-floating-point-into-binary-byte-or-word-representation" class="question-hyperlink" title="Hello, I don't know how to do two somewhat related task within vbscript (not vb)
+-I need to break a 32 bit floating point into it's 4 byte binary representation.
+-I need to break a 32 bit floating  … ">use vbscript to get 32 bit floating point into binary byte or word representation</a></h3>
+        
+        <div class="tags t-vbscript t-floating-point t-word t-byte t-binary-data">
+            <a href="/questions/tagged/vbscript" class="post-tag" title="show questions tagged 'vbscript'" rel="tag">vbscript</a> <a href="/questions/tagged/floating-point" class="post-tag" title="show questions tagged 'floating-point'" rel="tag">floating-point</a> <a href="/questions/tagged/word" class="post-tag" title="show questions tagged 'word'" rel="tag">word</a> <a href="/questions/tagged/byte" class="post-tag" title="show questions tagged 'byte'" rel="tag">byte</a> <a href="/ques [...]
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:15:51Z" class="relativetime">5m ago</span>
+            <a href="/users/364718/jmc" >jmc</a> <span class="reputation-score" title="reputation score">1</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024168">
+    <div onclick="window.location.href='/questions/3024168/django-how-do-i-redirect-a-post-and-pass-on-the-post-data'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">1</div>
+            <div>vote</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">14</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024168/django-how-do-i-redirect-a-post-and-pass-on-the-post-data" class="question-hyperlink" title="When processing a POST request in the Django views.py file, I sometimes need to redirect it to another url. This url I'm redirecting to is handled by another function in the same Django views.py file.  … ">Django: How do I redirect a post and pass on the post data</a></h3>
+        
+        <div class="tags t-django">
+            <a href="/questions/tagged/django" class="post-tag" title="show questions tagged 'django'" rel="tag">django</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024168/django-how-do-i-redirect-a-post-and-pass-on-the-post-data/?lastactivity" class="started-link"><span title="2010-06-11 16:15:48Z" class="relativetime">6m ago</span></a>
+            <a href="/users/256218/matthew-j-morrison" >Matthew J Morrison</a> <span class="reputation-score" title="reputation score">225</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024398">
+    <div onclick="window.location.href='/questions/3024398/tips-for-setting-up-a-public-facing-webserver'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">4</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024398/tips-for-setting-up-a-public-facing-webserver" class="question-hyperlink" title="Hello,
+I have a Dell Server with Windows 2008 R2 Web Edition.
+I'm going to be using it for web hosting (30+ websites) with IIS 7.
+
+Are there some good tips as far as performance, stability, and  … ">Tips for setting up a public facing webserver</a></h3>
+        
+        <div class="tags t-iis7 t-rdp t-webhosting">
+            <a href="/questions/tagged/iis7" class="post-tag" title="show questions tagged 'iis7'" rel="tag">iis7</a> <a href="/questions/tagged/rdp" class="post-tag" title="show questions tagged 'rdp'" rel="tag">rdp</a> <a href="/questions/tagged/webhosting" class="post-tag" title="show questions tagged 'webhosting'" rel="tag">webhosting</a> 
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:15:46Z" class="relativetime">6m ago</span>
+            <a href="/users/87302/aron" >aron</a> <span class="reputation-score" title="reputation score">235</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3016860">
+    <div onclick="window.location.href='/questions/3016860/reading-data-from-a-unix-device'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">32</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3016860/reading-data-from-a-unix-device" class="question-hyperlink" title="On one of my RedHat Linux Servers a couple devices have been setup. /dev/ap and /dev/reuter. They are AP and Reuters news feeds. At the unix command line I can do "cat /dev/ap" and it waits until a  … ">Reading data from a unix device</a></h3>
+        
+        <div class="tags t-java t-unix t-devices">
+            <a href="/questions/tagged/java" class="post-tag" title="show questions tagged 'java'" rel="tag">java</a> <a href="/questions/tagged/unix" class="post-tag" title="show questions tagged 'unix'" rel="tag">unix</a> <a href="/questions/tagged/devices" class="post-tag" title="show questions tagged 'devices'" rel="tag">devices</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3016860/reading-data-from-a-unix-device/?lastactivity" class="started-link"><span title="2010-06-11 16:15:06Z" class="relativetime">6m ago</span></a>
+            <a href="/users/230513/trashgod" >trashgod</a> <span class="reputation-score" title="reputation score">6,824</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024267">
+    <div onclick="window.location.href='/questions/3024267/doing-sums-if-certain-conditions-are-true'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">1</div>
+            <div>vote</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">4</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">10</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024267/doing-sums-if-certain-conditions-are-true" class="question-hyperlink" title="I am trying to build a query that does a sum if a certain parameter is 
+set. For example:
+
+SELECT SUM(IF(<condition>,field,field)) AS total_value
+
+
+...which is working correctly.
+
+But i have  … ">Doing sum’s if certain conditions are true</a></h3>
+        
+        <div class="tags t-mysql">
+            <a href="/questions/tagged/mysql" class="post-tag" title="show questions tagged 'mysql'" rel="tag">mysql</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024267/doing-sums-if-certain-conditions-are-true/?lastactivity" class="started-link"><span title="2010-06-11 16:14:56Z" class="relativetime">6m ago</span></a>
+            <a href="/users/198643/thomas" >Thomas</a> <span class="reputation-score" title="reputation score 10965">11k</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024395">
+    <div onclick="window.location.href='/questions/3024395/android-listview-slide-subview-in-from-right'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">5</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024395/android-listview-slide-subview-in-from-right" class="question-hyperlink" title="I have a ListView. When I select an item in the ListView, I would like to have a Subview slide in from the right, the way that it does in many Apps. 
+
+I have been searching for tutorials on this topic  … ">Android ListView - Slide Subview in from Right?</a></h3>
+        
+        <div class="tags t-android t-listview t-subview">
+            <a href="/questions/tagged/android" class="post-tag" title="show questions tagged 'android'" rel="tag"><img src="http://sstatic.net/so/img/tag-android.png" height="16" width="18" alt="" class="sponsor-tag-img">android</a> <a href="/questions/tagged/listview" class="post-tag" title="show questions tagged 'listview'" rel="tag">listview</a> <a href="/questions/tagged/subview" class="post-tag" title="show questions tagged 'subview'" rel="tag">subview</a> 
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:14:48Z" class="relativetime">7m ago</span>
+            <a href="/users/300129/chris" >Chris</a> <span class="reputation-score" title="reputation score">113</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-200850">
+    <div onclick="window.location.href='/questions/200850/are-there-any-open-source-iphone-applications-around'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">39</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered-accepted" title="one of the answers was accepted as the correct answer">
+            <div class="mini-counts">16</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts hot"><span title='15782 views'>16</span></div>
+            <div class='hot'>kviews</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/200850/are-there-any-open-source-iphone-applications-around" class="question-hyperlink" title="I'm looking for open source iPhone applications. There are many sample applications around, but not many "complete" applications. Any ideas?
+">Are there any Open-source iPhone applications around?</a></h3>
+        
+        <div class="tags t-iphone t-open-source">
+            <a href="/questions/tagged/iphone" class="post-tag" title="show questions tagged 'iphone'" rel="tag">iphone</a> <a href="/questions/tagged/open-source" class="post-tag" title="show questions tagged 'open-source'" rel="tag">open-source</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/200850/are-there-any-open-source-iphone-applications-around/?lastactivity" class="started-link"><span title="2010-06-11 16:14:47Z" class="relativetime">7m ago</span></a>
+            <a href="/users/130556/ryanjm-mp" >ryanjm.mp</a> <span class="reputation-score" title="reputation score">94</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-1108527">
+    <div onclick="window.location.href='/questions/1108527/recursively-add-file-extension-to-all-files'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">3</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered-accepted" title="one of the answers was accepted as the correct answer">
+            <div class="mini-counts">6</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts warm"><span title='1163 views'>1</span></div>
+            <div class='warm'>kviews</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/1108527/recursively-add-file-extension-to-all-files" class="question-hyperlink" title="I have a few directories and sub-directories containing files with no file extension. I want to add .jpg to all the files contained within these directories. I've seen bash scripts for changing the  … ">recursively add file extension to all files</a></h3>
+        
+        <div class="tags t-bash t-file t-shell t-command-line t-file-extension">
+            <a href="/questions/tagged/bash" class="post-tag" title="show questions tagged 'bash'" rel="tag">bash</a> <a href="/questions/tagged/file" class="post-tag" title="show questions tagged 'file'" rel="tag">file</a> <a href="/questions/tagged/shell" class="post-tag" title="show questions tagged 'shell'" rel="tag">shell</a> <a href="/questions/tagged/command-line" class="post-tag" title="show questions tagged 'command-line'" rel="tag">command-line</a> <a href="/questions/tagged/fi [...]
+        </div>
+        <div class="started">
+            
+            <a href="/questions/1108527/recursively-add-file-extension-to-all-files/?lastactivity" class="started-link"><span title="2010-06-11 16:14:33Z" class="relativetime">7m ago</span></a>
+            <a href="/users/364499/brian" >Brian</a> <span class="reputation-score" title="reputation score">1</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-2940923">
+    <div onclick="window.location.href='/questions/2940923/tikz-horizontal-centering-of-group-of-nodes'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">6</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">72</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/2940923/tikz-horizontal-centering-of-group-of-nodes" class="question-hyperlink" title="Hi, I need to align each row of the graph to the center. I am trying to do it with xshift. Here the code:
+
+    \begin{tikzpicture}[node distance=1.5cm, auto, text centered]
+    \tikzstyle{every  … ">Tikz: horizontal centering of group of nodes</a></h3>
+        
+        <div class="tags t-latex t-horizontal t-tikz t-centering t-pgf">
+            <a href="/questions/tagged/latex" class="post-tag" title="show questions tagged 'latex'" rel="tag">latex</a> <a href="/questions/tagged/horizontal" class="post-tag" title="show questions tagged 'horizontal'" rel="tag">horizontal</a> <a href="/questions/tagged/tikz" class="post-tag" title="show questions tagged 'tikz'" rel="tag">tikz</a> <a href="/questions/tagged/centering" class="post-tag" title="show questions tagged 'centering'" rel="tag">centering</a> <a href="/questions/ [...]
+        </div>
+        <div class="started">
+            
+            <a href="/questions/2940923/tikz-horizontal-centering-of-group-of-nodes/?lastactivity" class="started-link"><span title="2010-06-11 16:14:18Z" class="relativetime">7m ago</span></a>
+            <a href="/users/310165/geoff" >Geoff</a> <span class="reputation-score" title="reputation score">1,014</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3022907">
+    <div onclick="window.location.href='/questions/3022907/deadlock-in-sql-server-2005-two-real-time-bulk-upserts-are-fighting-why'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">2</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">18</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3022907/deadlock-in-sql-server-2005-two-real-time-bulk-upserts-are-fighting-why" class="question-hyperlink" title="
+
+Here's the scenario: 
+
+I've got a table called MarketDataCurrent (MDC) that has live updating stock prices. 
+
+I've got one process called 'LiveFeed' which reads prices streaming from the wire,  … ">Deadlock in SQL Server 2005! Two real-time bulk upserts are fighting. WHY?</a></h3>
+        
+        <div class="tags t-sql-server-2005 t-insert t-deadlock t-bulk t-primarykey">
+            <a href="/questions/tagged/sql-server-2005" class="post-tag" title="show questions tagged 'sql-server-2005'" rel="tag"><img src="http://sstatic.net/so/img/tag-redgate.png" height="16" width="18" alt="" class="sponsor-tag-img">sql-server-2005</a> <a href="/questions/tagged/insert" class="post-tag" title="show questions tagged 'insert'" rel="tag">insert</a> <a href="/questions/tagged/deadlock" class="post-tag" title="show questions tagged 'deadlock'" rel="tag">deadlock</a> <a h [...]
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3022907/deadlock-in-sql-server-2005-two-real-time-bulk-upserts-are-fighting-why/?lastactivity" class="started-link"><span title="2010-06-11 16:13:45Z" class="relativetime">8m ago</span></a>
+            <a href="/users/270317/skimania" >skimania</a> <span class="reputation-score" title="reputation score">28</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024389">
+    <div onclick="window.location.href='/questions/3024389/c-dataset-ensuring-primarykey-data-when-filling'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">4</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024389/c-dataset-ensuring-primarykey-data-when-filling" class="question-hyperlink" title="When filling a DataSet, I am using the "AddWithKey" value for the DataAdapter's MissingSchemaAction.  According to MSDN:
+
+
+  Adding schema information to a DataSet
+  before filling it with data  … ">C# DataSet - Ensuring PrimaryKey data when Filling.</a></h3>
+        
+        <div class="tags t-cñ t-database t-dataset t-dataadapter">
+            <a href="/questions/tagged/c%23" class="post-tag" title="show questions tagged 'c#'" rel="tag">c#</a> <a href="/questions/tagged/database" class="post-tag" title="show questions tagged 'database'" rel="tag">database</a> <a href="/questions/tagged/dataset" class="post-tag" title="show questions tagged 'dataset'" rel="tag">dataset</a> <a href="/questions/tagged/dataadapter" class="post-tag" title="show questions tagged 'dataadapter'" rel="tag">dataadapter</a> 
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:13:07Z" class="relativetime">8m ago</span>
+            <a href="/users/176536/justlooking" >JustLooking</a> <span class="reputation-score" title="reputation score">90</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024135">
+    <div onclick="window.location.href='/questions/3024135/jquery-load-from-another-page-that-contains-javascript'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">3</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">20</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024135/jquery-load-from-another-page-that-contains-javascript" class="question-hyperlink" title="I've been using jQuery .load() to load content into a div.  The content being .loaded occasionally has a document.ready() function which is called, and works, correctly (i.e. the ready() function is  … ">jQuery .load from another page that contains Javascript</a></h3>
+        
+        <div class="tags t-jquery">
+            <a href="/questions/tagged/jquery" class="post-tag" title="show questions tagged 'jquery'" rel="tag">jquery</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024135/jquery-load-from-another-page-that-contains-javascript/?lastactivity" class="started-link"><span title="2010-06-11 16:13:05Z" class="relativetime">8m ago</span></a>
+            <a href="/users/358037/halkeye" >halkeye</a> <span class="reputation-score" title="reputation score">281</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024386">
+    <div onclick="window.location.href='/questions/3024386/tracesource-tracetransfer-vs-tracesource-traceeventtraceeventtype-transfer'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">2</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024386/tracesource-tracetransfer-vs-tracesource-traceeventtraceeventtype-transfer" class="question-hyperlink" title="When using System.Diagnostics TraceSource for logging/tracing, is there a difference between using TraceSource.TraceTransfer and TraceSource.TraceEvent(TraceEventType.Transfer, ... ?
+
+In our  … ">TraceSource.TraceTransfer vs TraceSource.TraceEvent(TraceEventType.Transfer …</a></h3>
+        
+        <div class="tags t-cñ t-ûnet t-wcf t-logging t-diagnostics">
+            <a href="/questions/tagged/c%23" class="post-tag" title="show questions tagged 'c#'" rel="tag">c#</a> <a href="/questions/tagged/.net" class="post-tag" title="show questions tagged '.net'" rel="tag">.net</a> <a href="/questions/tagged/wcf" class="post-tag" title="show questions tagged 'wcf'" rel="tag">wcf</a> <a href="/questions/tagged/logging" class="post-tag" title="show questions tagged 'logging'" rel="tag">logging</a> <a href="/questions/tagged/diagnostics" class="post-ta [...]
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:12:49Z" class="relativetime">9m ago</span>
+            <a href="/users/125439/wageoghe" >wageoghe</a> <span class="reputation-score" title="reputation score">35</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024385">
+    <div onclick="window.location.href='/questions/3024385/how-add-logic-to-views-ruby-on-rails'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">6</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024385/how-add-logic-to-views-ruby-on-rails" class="question-hyperlink" title="Right now I'm building a project management app in rails, here is some background info:
+
+Right now i have 2 models, one is User and the other one is Client. Clients and Users have a one-to-one  … ">How add logic to Views? Ruby on Rails</a></h3>
+        
+        <div class="tags t-ruby-on-rails t-ruby t-view t-controller t-erb">
+            <a href="/questions/tagged/ruby-on-rails" class="post-tag" title="show questions tagged 'ruby-on-rails'" rel="tag">ruby-on-rails</a> <a href="/questions/tagged/ruby" class="post-tag" title="show questions tagged 'ruby'" rel="tag">ruby</a> <a href="/questions/tagged/view" class="post-tag" title="show questions tagged 'view'" rel="tag">view</a> <a href="/questions/tagged/controller" class="post-tag" title="show questions tagged 'controller'" rel="tag">controller</a> <a href="/q [...]
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:12:47Z" class="relativetime">9m ago</span>
+            <a href="/users/214038/gotjosh" >Gotjosh</a> <span class="reputation-score" title="reputation score">51</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024380">
+    <div onclick="window.location.href='/questions/3024380/can-somebody-help-me-install-this-jbpm-based-workflow-management-suite'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">2</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024380/can-somebody-help-me-install-this-jbpm-based-workflow-management-suite" class="question-hyperlink" title="Its a book Workflow Interface software available at sourceforge http://bookworkflowint.sourceforge.net/
+
+Any instructions would be great especially in windows, however I can try Linux specific ones as  … ">Can somebody help me install this jBPM based workflow management suite?</a></h3>
+        
+        <div class="tags t-workflow t-management t-document-imaging">
+            <a href="/questions/tagged/workflow" class="post-tag" title="show questions tagged 'workflow'" rel="tag">workflow</a> <a href="/questions/tagged/management" class="post-tag" title="show questions tagged 'management'" rel="tag">management</a> <a href="/questions/tagged/document-imaging" class="post-tag" title="show questions tagged 'document-imaging'" rel="tag">document-imaging</a> 
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:12:06Z" class="relativetime">9m ago</span>
+            <a href="/users/364716/eternal-saint" >Eternal Saint</a> <span class="reputation-score" title="reputation score">1</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024354">
+    <div onclick="window.location.href='/questions/3024354/c-progress-bar-not-synced-with-download-webclient-class'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">17</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024354/c-progress-bar-not-synced-with-download-webclient-class" class="question-hyperlink" title="Hi,
+
+I am coding a system which has a small FTP module included inside, it's not the main feature at all, but needed...
+
+I must link the progressbar with the WebClient class event  … ">C# progress bar not synced with download (WebClient class)</a></h3>
+        
+        <div class="tags t-cñ t-ftp t-webclient">
+            <a href="/questions/tagged/c%23" class="post-tag" title="show questions tagged 'c#'" rel="tag">c#</a> <a href="/questions/tagged/ftp" class="post-tag" title="show questions tagged 'ftp'" rel="tag">ftp</a> <a href="/questions/tagged/webclient" class="post-tag" title="show questions tagged 'webclient'" rel="tag">webclient</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024354/c-progress-bar-not-synced-with-download-webclient-class/?lastactivity" class="started-link"><span title="2010-06-11 16:11:55Z" class="relativetime">9m ago</span></a>
+            <a href="/users/29798/mjmarsh" >mjmarsh</a> <span class="reputation-score" title="reputation score">2,120</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3023372">
+    <div onclick="window.location.href='/questions/3023372/get-subdomain-of-xml-page-from-xsl'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">-1</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">2</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">13</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3023372/get-subdomain-of-xml-page-from-xsl" class="question-hyperlink" title="I am working with a guild hosting site that provides an XML/XSL transformation widget where all I need to do is enter the URL for the XML and XSL and it does the rest.
+
+I have written an XSL transform  … ">Get subdomain of XML page from XSL</a></h3>
+        
+        <div class="tags t-xslt t-xsl">
+            <a href="/questions/tagged/xslt" class="post-tag" title="show questions tagged 'xslt'" rel="tag">xslt</a> <a href="/questions/tagged/xsl" class="post-tag" title="show questions tagged 'xsl'" rel="tag">xsl</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3023372/get-subdomain-of-xml-page-from-xsl/?lastactivity" class="started-link"><span title="2010-06-11 16:11:54Z" class="relativetime">9m ago</span></a>
+            <a href="/users/36305/dimitre-novatchev" >Dimitre Novatchev</a> <span class="reputation-score" title="reputation score 12936">12.9k</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024186">
+    <div onclick="window.location.href='/questions/3024186/java-how-for-loop-work-in-the-case-of-biginteger'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">1</div>
+            <div>vote</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">3</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">43</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024186/java-how-for-loop-work-in-the-case-of-biginteger" class="question-hyperlink" title="I want to take Input from the user as Big-Integer and manipulate it into  a For loop
+
+BigInteger i;
+
+for(BigInteger i=100000;i<=1;i--){
+
+    i=i+i;
+
+}
+
+
+But it won't work
+
+can any body help me.
+">java: how for loop work in the case of BigInteger </a></h3>
+        
+        <div class="tags t-java t-biginteger">
+            <a href="/questions/tagged/java" class="post-tag" title="show questions tagged 'java'" rel="tag">java</a> <a href="/questions/tagged/biginteger" class="post-tag" title="show questions tagged 'biginteger'" rel="tag">biginteger</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024186/java-how-for-loop-work-in-the-case-of-biginteger/?lastactivity" class="started-link"><span title="2010-06-11 16:11:48Z" class="relativetime">10m ago</span></a>
+            <a href="/users/276101/polygenelubricants" >polygenelubricants</a> <span class="reputation-score" title="reputation score 25273">25.3k</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-69730">
+    <div onclick="window.location.href='/questions/69730/what-is-a-programmers-life-like'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">5</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered-accepted" title="one of the answers was accepted as the correct answer">
+            <div class="mini-counts">5</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">345</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/69730/what-is-a-programmers-life-like" class="question-hyperlink" title="Imagine like an 8-hour long video of any "typical/average" programming job. What is it like?  Before I get myself involved in that path, what can I expect?
+
+I am interested in gathering first-hand  … ">What is a programmer’s life like?</a></h3>
+        
+        <div class="tags t-career-development t-programmers">
+            <a href="/questions/tagged/career-development" class="post-tag" title="show questions tagged 'career-development'" rel="tag">career-development</a> <a href="/questions/tagged/programmers" class="post-tag" title="show questions tagged 'programmers'" rel="tag">programmers</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/69730/what-is-a-programmers-life-like/?lastactivity" class="started-link"><span title="2010-06-11 16:11:42Z" class="relativetime">10m ago</span></a>
+            <a href="/users/8745/jb-king" >JB King</a> <span class="reputation-score" title="reputation score">9,428</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024342">
+    <div onclick="window.location.href='/questions/3024342/visual-studio-2k8-specifying-custom-properties'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">6</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024342/visual-studio-2k8-specifying-custom-properties" class="question-hyperlink" title="Hello,
+
+I'd like to use custom build properties to drive the build process. Is it possible to specify them using VisualStudio user interface? I'd like to avoid editing the msbuild file every time I  … ">Visual Studio 2k8: specifying custom properties</a></h3>
+        
+        <div class="tags t-visual-studio-2008 t-msbuild">
+            <a href="/questions/tagged/visual-studio-2008" class="post-tag" title="show questions tagged 'visual-studio-2008'" rel="tag">visual-studio-2008</a> <a href="/questions/tagged/msbuild" class="post-tag" title="show questions tagged 'msbuild'" rel="tag">msbuild</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024342/visual-studio-2k8-specifying-custom-properties/?lastactivity" class="started-link"><span title="2010-06-11 16:11:37Z" class="relativetime">10m ago</span></a>
+            <a href="/users/333316/zbigniew-kawalec" >Zbigniew Kawalec</a> <span class="reputation-score" title="reputation score">1</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024374">
+    <div onclick="window.location.href='/questions/3024374/generate-a-set-of-strings-with-maximum-edit-distance'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">3</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024374/generate-a-set-of-strings-with-maximum-edit-distance" class="question-hyperlink" title="Problem 1: I'd like to generate a set of n strings of fixed length m from alphabet s such that the minimum Levenshtein distance (edit distance) between any two strings is greater than some constant c.  … ">Generate a set of strings with maximum edit distance</a></h3>
+        
+        <div class="tags t-levenstein-distance">
+            <a href="/questions/tagged/levenstein-distance" class="post-tag" title="show questions tagged 'levenstein-distance'" rel="tag">levenstein-distance</a> 
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:11:37Z" class="relativetime">10m ago</span>
+            <a href="/users/364715/kevin-jacobs" >Kevin Jacobs</a> <span class="reputation-score" title="reputation score">1</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024371">
+    <div onclick="window.location.href='/questions/3024371/problems-with-eclipse-and-ruby-plugin'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">2</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024371/problems-with-eclipse-and-ruby-plugin" class="question-hyperlink" title="I installed Eclipse and then the Ruby Development Tools (RDT), but it would crash when I try to alter certain features, like having line numbers, how far back to have history, and the code coloring  … ">Problems With Eclipse and Ruby Plugin</a></h3>
+        
+        <div class="tags t-ruby t-eclipse">
+            <a href="/questions/tagged/ruby" class="post-tag" title="show questions tagged 'ruby'" rel="tag">ruby</a> <a href="/questions/tagged/eclipse" class="post-tag" title="show questions tagged 'eclipse'" rel="tag">eclipse</a> 
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:11:16Z" class="relativetime">10m ago</span>
+            <a href="/users/349415/jesse-j" >Jesse J</a> <span class="reputation-score" title="reputation score">74</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3007739">
+    <div onclick="window.location.href='/questions/3007739/ldapsearch-and-vcard-creation'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">67</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3007739/ldapsearch-and-vcard-creation" class="question-hyperlink" title="I'm using openldap on Mac OS X Server 10.6 and need to generate a vcard for all the users in a given group. By using the ldapsearch I can list all the memberUid's for all users in that group. I found  … ">ldapsearch and vcard creation</a></h3>
+        
+        <div class="tags t-python t-perl t-ldap">
+            <a href="/questions/tagged/python" class="post-tag" title="show questions tagged 'python'" rel="tag">python</a> <a href="/questions/tagged/perl" class="post-tag" title="show questions tagged 'perl'" rel="tag">perl</a> <a href="/questions/tagged/ldap" class="post-tag" title="show questions tagged 'ldap'" rel="tag">ldap</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3007739/ldapsearch-and-vcard-creation/?lastactivity" class="started-link"><span title="2010-06-11 16:11:15Z" class="relativetime">10m ago</span></a>
+            <a href="/users/362922/elmugrat" >elmugrat</a> <span class="reputation-score" title="reputation score">11</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024309">
+    <div onclick="window.location.href='/questions/3024309/dropdown-selection-navigation-to-different-page-with-dropdown-values-asp-net-j'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">3</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">11</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024309/dropdown-selection-navigation-to-different-page-with-dropdown-values-asp-net-j" class="question-hyperlink" title="I want to access drop down menu's variable in java script on change event, here is my code
+
+ <asp:DropDownList ID="DropDownList1" runat="server" onchange="document.location.href = url_Lookbook;"  … ">Dropdown selection navigation to different page with dropdown values; Asp.Net + Javascript </a></h3>
+        
+        <div class="tags t-aspûnet t-javascript">
+            <a href="/questions/tagged/asp.net" class="post-tag" title="show questions tagged 'asp.net'" rel="tag">asp.net</a> <a href="/questions/tagged/javascript" class="post-tag" title="show questions tagged 'javascript'" rel="tag">javascript</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024309/dropdown-selection-navigation-to-different-page-with-dropdown-values-asp-net-j/?lastactivity" class="started-link"><span title="2010-06-11 16:11:15Z" class="relativetime">10m ago</span></a>
+            <a href="/users/198643/thomas" >Thomas</a> <span class="reputation-score" title="reputation score 10965">11k</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-9033">
+    <div onclick="window.location.href='/questions/9033/hidden-features-of-c'" class="cp">
+        <div class="votes">
+            <div class="mini-counts"><span title='1320 views'>1</span></div>
+            <div>kvotes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">290</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts supernova"><span title='101129 views'>101</span></div>
+            <div class='supernova'>kviews</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/9033/hidden-features-of-c" class="question-hyperlink" title="This came to my mind after I learned the following from this question:
+
+where T : struct
+
+
+We, C# developers, all know the basics of C#. I mean declarations, conditionals, loops, operators, etc.
+
+Some  … ">Hidden Features of C#?</a></h3>
+        
+        <div class="tags t-cñ t-ûnet t-tips-and-tricks t-hidden-features">
+            <a href="/questions/tagged/c%23" class="post-tag" title="show questions tagged 'c#'" rel="tag">c#</a> <a href="/questions/tagged/.net" class="post-tag" title="show questions tagged '.net'" rel="tag">.net</a> <a href="/questions/tagged/tips-and-tricks" class="post-tag" title="show questions tagged 'tips-and-tricks'" rel="tag">tips-and-tricks</a> <a href="/questions/tagged/hidden-features" class="post-tag" title="show questions tagged 'hidden-features'" rel="tag">hidden-features</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/9033/hidden-features-of-c/?lastactivity" class="started-link"><span title="2010-06-11 16:10:55Z" class="relativetime">10m ago</span></a>
+            <a href="/users/4872/ray-vega" >Ray Vega</a> <span class="reputation-score" title="reputation score">4,794</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024229">
+    <div onclick="window.location.href='/questions/3024229/c-com-cross-thread-problem'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">1</div>
+            <div>vote</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">2</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">23</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024229/c-com-cross-thread-problem" class="question-hyperlink" title="Hi,
+
+we're developing a software to control a scientific measuring device. it provides a COM-Interface defines serveral functions to set measurement parameters and fires an event when it measured  … ">C# COM Cross Thread problem</a></h3>
+        
+        <div class="tags t-cñ t-multithreading t-com t-thread t-cross">
+            <a href="/questions/tagged/c%23" class="post-tag" title="show questions tagged 'c#'" rel="tag">c#</a> <a href="/questions/tagged/multithreading" class="post-tag" title="show questions tagged 'multithreading'" rel="tag">multithreading</a> <a href="/questions/tagged/com" class="post-tag" title="show questions tagged 'com'" rel="tag">com</a> <a href="/questions/tagged/thread" class="post-tag" title="show questions tagged 'thread'" rel="tag">thread</a> <a href="/questions/tagged/ [...]
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024229/c-com-cross-thread-problem/?lastactivity" class="started-link"><span title="2010-06-11 16:10:34Z" class="relativetime">11m ago</span></a>
+            <a href="/users/17028/franci-penov" >Franci Penov</a> <span class="reputation-score" title="reputation score 18680">18.7k</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024364">
+    <div onclick="window.location.href='/questions/3024364/objective-c-object-release-and-allocation-timing'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">5</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024364/objective-c-object-release-and-allocation-timing" class="question-hyperlink" title="The code for this question is too long to be of any use.  But I'm pretty sure my problem has to do with releasing a class.
+
+I have a helper class, ConnectionHelper.h/.m, that handles a NSURLConnection  … ">Objective-C object release and allocation timing</a></h3>
+        
+        <div class="tags t-objective-c t-memory-allocation t-release t-nsurlconnection t-dealloc">
+            <a href="/questions/tagged/objective-c" class="post-tag" title="show questions tagged 'objective-c'" rel="tag">objective-c</a> <a href="/questions/tagged/memory-allocation" class="post-tag" title="show questions tagged 'memory-allocation'" rel="tag">memory-allocation</a> <a href="/questions/tagged/release" class="post-tag" title="show questions tagged 'release'" rel="tag">release</a> <a href="/questions/tagged/nsurlconnection" class="post-tag" title="show questions tagged 'ns [...]
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:10:17Z" class="relativetime">11m ago</span>
+            <a href="/users/130556/ryanjm-mp" >ryanjm.mp</a> <span class="reputation-score" title="reputation score">94</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024253">
+    <div onclick="window.location.href='/questions/3024253/create-delegate-via-reflection'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">2</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">2</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">28</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024253/create-delegate-via-reflection" class="question-hyperlink" title="Given an assembly that contains
+
+namespace Foo{public class Bar;}
+
+
+How could I create an Action<Foo.Bar> from another assembly without referencing the first assembly at compile time?
+">Create delegate via reflection.</a></h3>
+        
+        <div class="tags t-cñ t-reflection t-ûnet-3û5 t-delegates">
+            <a href="/questions/tagged/c%23" class="post-tag" title="show questions tagged 'c#'" rel="tag">c#</a> <a href="/questions/tagged/reflection" class="post-tag" title="show questions tagged 'reflection'" rel="tag">reflection</a> <a href="/questions/tagged/.net-3.5" class="post-tag" title="show questions tagged '.net-3.5'" rel="tag">.net-3.5</a> <a href="/questions/tagged/delegates" class="post-tag" title="show questions tagged 'delegates'" rel="tag">delegates</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024253/create-delegate-via-reflection/?lastactivity" class="started-link"><span title="2010-06-11 16:10:01Z" class="relativetime">11m ago</span></a>
+            <a href="/users/55721/dss539" >dss539</a> <span class="reputation-score" title="reputation score">1,341</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024218">
+    <div onclick="window.location.href='/questions/3024218/why-is-my-type-getfieldsbindingflags-instancebindingflags-public-not-working'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">2</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">33</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024218/why-is-my-type-getfieldsbindingflags-instancebindingflags-public-not-working" class="question-hyperlink" title="My code can see the non-public members, but not the public ones. Why?
+
+FieldInfo[] publicFieldInfos =
+    t.GetFields(BindingFlags.Instance | BindingFlags.Public);
+
+
+is returning nothing.
+
+Note: I'm  … ">Why is my Type.GetFields(BindingFlags.Instance|BindingFlags.Public) not working? </a></h3>
+        
+        <div class="tags t-cñ t-ûnet t-reflection">
+            <a href="/questions/tagged/c%23" class="post-tag" title="show questions tagged 'c#'" rel="tag">c#</a> <a href="/questions/tagged/.net" class="post-tag" title="show questions tagged '.net'" rel="tag">.net</a> <a href="/questions/tagged/reflection" class="post-tag" title="show questions tagged 'reflection'" rel="tag">reflection</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024218/why-is-my-type-getfieldsbindingflags-instancebindingflags-public-not-working/?lastactivity" class="started-link"><span title="2010-06-11 16:09:42Z" class="relativetime">12m ago</span></a>
+            <a href="/users/105570/dan-tao" >Dan Tao</a> <span class="reputation-score" title="reputation score">9,672</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-392749">
+    <div onclick="window.location.href='/questions/392749/xcode-adjusting-indentation-of-auto-generated-braces'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">7</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">5</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts warm"><span title='1860 views'>2</span></div>
+            <div class='warm'>kviews</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/392749/xcode-adjusting-indentation-of-auto-generated-braces" class="question-hyperlink" title="Code auto-generated by XCode seems to have the opening brace on the same line by default:
+
+ at interface Controller : NSObject {
+
+}
+
+
+I'd like the opening brace on a line of its own, like this:
+
+ … ">XCode: Adjusting indentation of auto-generated braces?</a></h3>
+        
+        <div class="tags t-xcode">
+            <a href="/questions/tagged/xcode" class="post-tag" title="show questions tagged 'xcode'" rel="tag">xcode</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/392749/xcode-adjusting-indentation-of-auto-generated-braces/?lastactivity" class="started-link"><span title="2010-06-11 16:08:58Z" class="relativetime">12m ago</span></a>
+            <a href="/users/317759/laughing-jack" >Laughing_Jack</a> <span class="reputation-score" title="reputation score">41</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024054">
+    <div onclick="window.location.href='/questions/3024054/building-64bit-qt-on-32bit-xp-computer'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">13</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024054/building-64bit-qt-on-32bit-xp-computer" class="question-hyperlink" title="I'm trying to build Qt in a shared 64 bit mode on my 32bit XP system.  
+
+I can configure the QMake and start the 64bit build.  The problem is that when the build starts, the first thing that happens  … ">Building 64bit Qt on 32bit Xp computer</a></h3>
+        
+        <div class="tags t-cçç t-qt t-64bit t-qmake">
+            <a href="/questions/tagged/c%2b%2b" class="post-tag" title="show questions tagged 'c++'" rel="tag">c++</a> <a href="/questions/tagged/qt" class="post-tag" title="show questions tagged 'qt'" rel="tag">qt</a> <a href="/questions/tagged/64bit" class="post-tag" title="show questions tagged '64bit'" rel="tag">64bit</a> <a href="/questions/tagged/qmake" class="post-tag" title="show questions tagged 'qmake'" rel="tag">qmake</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024054/building-64bit-qt-on-32bit-xp-computer/?lastactivity" class="started-link"><span title="2010-06-11 16:08:54Z" class="relativetime">12m ago</span></a>
+            <a href="/users/127007/jurily" >Jurily</a> <span class="reputation-score" title="reputation score">2,122</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-60260">
+    <div onclick="window.location.href='/questions/60260/my-first-lisp-macro-is-it-leaky'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">3</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered-accepted" title="one of the answers was accepted as the correct answer">
+            <div class="mini-counts">4</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">409</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/60260/my-first-lisp-macro-is-it-leaky" class="question-hyperlink" title="I've been working through Practical Common Lisp and as an exercise decided to write a macro to determine if a number is a multiple of another number:
+
+(defmacro multp (value factor)
+   `(= (rem ,value  … ">My first Lisp macro; is it leaky?</a></h3>
+        
+        <div class="tags t-best-practices t-macros t-lisp">
+            <a href="/questions/tagged/best-practices" class="post-tag" title="show questions tagged 'best-practices'" rel="tag">best-practices</a> <a href="/questions/tagged/macros" class="post-tag" title="show questions tagged 'macros'" rel="tag">macros</a> <a href="/questions/tagged/lisp" class="post-tag" title="show questions tagged 'lisp'" rel="tag">lisp</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/60260/my-first-lisp-macro-is-it-leaky/?lastactivity" class="started-link"><span title="2010-06-11 16:08:49Z" class="relativetime">13m ago</span></a>
+            <a href="/users/34771/vatine" >Vatine</a> <span class="reputation-score" title="reputation score">2,535</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024352">
+    <div onclick="window.location.href='/questions/3024352/need-suggestion-for-ruby-and-rails-coding-standards'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">7</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024352/need-suggestion-for-ruby-and-rails-coding-standards" class="question-hyperlink" title=" I am developing a my application on rails.It has 400 or more models.
+ And some model contains more than 200 rows just for relationships.
+ so it's too hard handle it. 
+ Is there any ways i can handle  … ">Need suggestion for ruby and rails coding standards.</a></h3>
+        
+        <div class="tags t-ruby-on-rails t-ruby">
+            <a href="/questions/tagged/ruby-on-rails" class="post-tag" title="show questions tagged 'ruby-on-rails'" rel="tag">ruby-on-rails</a> <a href="/questions/tagged/ruby" class="post-tag" title="show questions tagged 'ruby'" rel="tag">ruby</a> 
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:08:08Z" class="relativetime">13m ago</span>
+            <a href="/users/363503/krunal-shah" >krunal shah</a> <span class="reputation-score" title="reputation score">3</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3023424">
+    <div onclick="window.location.href='/questions/3023424/the-best-way-to-refresh-my-aspx-site-with-a-timer-in-c'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">3</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">4</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">58</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3023424/the-best-way-to-refresh-my-aspx-site-with-a-timer-in-c" class="question-hyperlink" title="I have a default.aspx page that needs to be refresh every 10 sec.
+
+My solution so far is a javascript function, but it only works in firefux and not IE.
+
+I'm looking for a way to handle the refresh  … ">The best way to refresh my .aspx site with a Timer in C#?</a></h3>
+        
+        <div class="tags t-cñ t-aspûnet t-timer t-timers t-defaultûaspx">
+            <a href="/questions/tagged/c%23" class="post-tag" title="show questions tagged 'c#'" rel="tag">c#</a> <a href="/questions/tagged/asp.net" class="post-tag" title="show questions tagged 'asp.net'" rel="tag">asp.net</a> <a href="/questions/tagged/timer" class="post-tag" title="show questions tagged 'timer'" rel="tag">timer</a> <a href="/questions/tagged/timers" class="post-tag" title="show questions tagged 'timers'" rel="tag">timers</a> <a href="/questions/tagged/default.aspx" c [...]
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3023424/the-best-way-to-refresh-my-aspx-site-with-a-timer-in-c/?lastactivity" class="started-link"><span title="2010-06-11 16:08:03Z" class="relativetime">13m ago</span></a>
+            <a href="/users/305319/james-westgate" >James Westgate</a> <span class="reputation-score" title="reputation score">2,723</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024295">
+    <div onclick="window.location.href='/questions/3024295/headless-html-rendering-to-image-on-centos-5-4'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">2</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">10</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024295/headless-html-rendering-to-image-on-centos-5-4" class="question-hyperlink" title="Hello,
+
+I have a project requirement to render HTML and capture the rendered image as a file on a headless CentOS 5.4 server.  My specific requirements are:
+
+1) Input will be a URL to the page to  … ">Headless HTML rendering to image on CentOS 5.4</a></h3>
+        
+        <div class="tags t-html t-linux t-image t-rendering t-headless">
+            <a href="/questions/tagged/html" class="post-tag" title="show questions tagged 'html'" rel="tag">html</a> <a href="/questions/tagged/linux" class="post-tag" title="show questions tagged 'linux'" rel="tag">linux</a> <a href="/questions/tagged/image" class="post-tag" title="show questions tagged 'image'" rel="tag">image</a> <a href="/questions/tagged/rendering" class="post-tag" title="show questions tagged 'rendering'" rel="tag">rendering</a> <a href="/questions/tagged/headless [...]
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024295/headless-html-rendering-to-image-on-centos-5-4/?lastactivity" class="started-link"><span title="2010-06-11 16:08:00Z" class="relativetime">13m ago</span></a>
+            <a href="/users/350890/peter-tillemans" >Peter Tillemans</a> <span class="reputation-score" title="reputation score">2,881</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-2962379">
+    <div onclick="window.location.href='/questions/2962379/using-non-railsy-route-to-prepopulate-a-form'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered-accepted" title="one of the answers was accepted as the correct answer">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">19</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/2962379/using-non-railsy-route-to-prepopulate-a-form" class="question-hyperlink" title="I have many instances of a Rails model, Post. When viewing an individual post, I'd like to create a form to create a child of Post called Comment. I'd like to prepopulate this form with a hidden tag  … ">Using non-Railsy route to prepopulate a form</a></h3>
+        
+        <div class="tags t-ruby-on-rails t-routes t-urls">
+            <a href="/questions/tagged/ruby-on-rails" class="post-tag" title="show questions tagged 'ruby-on-rails'" rel="tag">ruby-on-rails</a> <a href="/questions/tagged/routes" class="post-tag" title="show questions tagged 'routes'" rel="tag">routes</a> <a href="/questions/tagged/urls" class="post-tag" title="show questions tagged 'urls'" rel="tag">urls</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/2962379/using-non-railsy-route-to-prepopulate-a-form/?lastactivity" class="started-link"><span title="2010-06-11 16:07:50Z" class="relativetime">14m ago</span></a>
+            <a href="/users/124536/hurikhan77" >hurikhan77</a> <span class="reputation-score" title="reputation score">1,175</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3022098">
+    <div onclick="window.location.href='/questions/3022098/hibernate-query-language-problem'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">2</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">29</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3022098/hibernate-query-language-problem" class="question-hyperlink" title="Well, I have implemented a distinct query in hibernate. It returns me result. But, while casting the fields are getting interchanged. So, it generates casting error. What should be the solution?
+
+As  … ">Hibernate Query Language Problem</a></h3>
+        
+        <div class="tags t-java t-hibernate t-orm t-hql">
+            <a href="/questions/tagged/java" class="post-tag" title="show questions tagged 'java'" rel="tag">java</a> <a href="/questions/tagged/hibernate" class="post-tag" title="show questions tagged 'hibernate'" rel="tag">hibernate</a> <a href="/questions/tagged/orm" class="post-tag" title="show questions tagged 'orm'" rel="tag">orm</a> <a href="/questions/tagged/hql" class="post-tag" title="show questions tagged 'hql'" rel="tag">hql</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3022098/hibernate-query-language-problem/?lastactivity" class="started-link"><span title="2010-06-11 16:07:36Z" class="relativetime">14m ago</span></a>
+            <a href="/users/70604/pascal-thivent" >Pascal Thivent</a> <span class="reputation-score" title="reputation score 66866">66.9k</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-2983670">
+    <div onclick="window.location.href='/questions/2983670/automatically-host-user-domains-in-rails-apache'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">2</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">22</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/2983670/automatically-host-user-domains-in-rails-apache" class="question-hyperlink" title="Hi, I'm currently developing a user facing web application that gives each new user their own subdomain on the site, which is fine (using subdomain_fu), but is there a way to let a user map their own  … ">Automatically Host User Domains in Rails/Apache</a></h3>
+        
+        <div class="tags t-ruby-on-rails t-ruby t-apache t-subdomain t-vhosts">
+            <a href="/questions/tagged/ruby-on-rails" class="post-tag" title="show questions tagged 'ruby-on-rails'" rel="tag">ruby-on-rails</a> <a href="/questions/tagged/ruby" class="post-tag" title="show questions tagged 'ruby'" rel="tag">ruby</a> <a href="/questions/tagged/apache" class="post-tag" title="show questions tagged 'apache'" rel="tag">apache</a> <a href="/questions/tagged/subdomain" class="post-tag" title="show questions tagged 'subdomain'" rel="tag">subdomain</a> <a href= [...]
+        </div>
+        <div class="started">
+            
+            <a href="/questions/2983670/automatically-host-user-domains-in-rails-apache/?lastactivity" class="started-link"><span title="2010-06-11 16:07:21Z" class="relativetime">14m ago</span></a>
+            <a href="/users/41984/pjb3" >pjb3</a> <span class="reputation-score" title="reputation score">1,702</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3006431">
+    <div onclick="window.location.href='/questions/3006431/how-to-display-table-data-more-clearly-in-oracle-sqlplus'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">2</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">35</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3006431/how-to-display-table-data-more-clearly-in-oracle-sqlplus" class="question-hyperlink" title="Here is the way sqlplus displays my table data:
+
+
+
+but I want to show them as 
+
+Name   |    Address    |
+-------+---------------+
+name1  |    address1   |
+name2  |    address2   |
+name3  |    address3  … ">how to display table data more clearly. in oracle sqlplus</a></h3>
+        
+        <div class="tags t-database t-oracle t-sqlplus">
+            <a href="/questions/tagged/database" class="post-tag" title="show questions tagged 'database'" rel="tag">database</a> <a href="/questions/tagged/oracle" class="post-tag" title="show questions tagged 'oracle'" rel="tag">oracle</a> <a href="/questions/tagged/sqlplus" class="post-tag" title="show questions tagged 'sqlplus'" rel="tag">sqlplus</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3006431/how-to-display-table-data-more-clearly-in-oracle-sqlplus/?lastactivity" class="started-link"><span title="2010-06-11 16:06:52Z" class="relativetime">14m ago</span></a>
+            <a href="/users/18747/tony-andrews" >Tony Andrews</a> <span class="reputation-score" title="reputation score 18489">18.5k</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3021686">
+    <div onclick="window.location.href='/questions/3021686/visual-studio-2008-perforce-where-is-my-vspscc-files'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">6</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3021686/visual-studio-2008-perforce-where-is-my-vspscc-files" class="question-hyperlink" title="Hi, I use Visual Studio 2008 and Perforce.
+When I bind my project to perforce(File -> Source Control -> Change Source Control -> Bind),
+Visual Studio complain like "~.vspscc File is not under source  … ">Visual Studio 2008 & Perforce. Where is my .vspscc files?</a></h3>
+        
+        <div class="tags t-visual-studio-2008 t-perforce t-msvc t-msvcçç">
+            <a href="/questions/tagged/visual-studio-2008" class="post-tag" title="show questions tagged 'visual-studio-2008'" rel="tag">visual-studio-2008</a> <a href="/questions/tagged/perforce" class="post-tag" title="show questions tagged 'perforce'" rel="tag">perforce</a> <a href="/questions/tagged/msvc" class="post-tag" title="show questions tagged 'msvc'" rel="tag">msvc</a> <a href="/questions/tagged/msvc%2b%2b" class="post-tag" title="show questions tagged 'msvc++'" rel="tag">msv [...]
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:06:51Z" class="relativetime">14m ago</span>
+            <a href="/users/114064/p-p" >P-P</a> <span class="reputation-score" title="reputation score">32</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024344">
+    <div onclick="window.location.href='/questions/3024344/is-it-possible-to-detect-an-incoming-call-to-a-gsm-modem-huawei-e160-plugged-in'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">4</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024344/is-it-possible-to-detect-an-incoming-call-to-a-gsm-modem-huawei-e160-plugged-in" class="question-hyperlink" title="Ideally I'd like to find a library for Python.
+
+All I need is the caller number, I do not need to answer the call.
+">Is it possible to detect an incoming call to a GSM modem (HUAWEI E160) plugged into the USB port?</a></h3>
+        
+        <div class="tags t-python t-call t-modem t-gsm">
+            <a href="/questions/tagged/python" class="post-tag" title="show questions tagged 'python'" rel="tag">python</a> <a href="/questions/tagged/call" class="post-tag" title="show questions tagged 'call'" rel="tag">call</a> <a href="/questions/tagged/modem" class="post-tag" title="show questions tagged 'modem'" rel="tag">modem</a> <a href="/questions/tagged/gsm" class="post-tag" title="show questions tagged 'gsm'" rel="tag">gsm</a> 
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:06:28Z" class="relativetime">15m ago</span>
+            <a href="/users/286062/jeremy" >Jeremy</a> <span class="reputation-score" title="reputation score">1</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024260">
+    <div onclick="window.location.href='/questions/3024260/about-import-statement-in-java'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">1</div>
+            <div>vote</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">2</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">33</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024260/about-import-statement-in-java" class="question-hyperlink" title="test.java:
+
+import javax.media;
+
+
+Which directories are javax.media searched from?
+
+I suppose those in CLASSPATH specified by javac -cp will of course be searched.
+
+But will it also search in the  … ">About import statement in Java</a></h3>
+        
+        <div class="tags t-java t-classpath">
+            <a href="/questions/tagged/java" class="post-tag" title="show questions tagged 'java'" rel="tag">java</a> <a href="/questions/tagged/classpath" class="post-tag" title="show questions tagged 'classpath'" rel="tag">classpath</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024260/about-import-statement-in-java/?lastactivity" class="started-link"><span title="2010-06-11 16:06:24Z" class="relativetime">15m ago</span></a>
+            <a href="/users/1527/pete-kirkham" >Pete Kirkham</a> <span class="reputation-score" title="reputation score 16757">16.8k</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3021765">
+    <div onclick="window.location.href='/questions/3021765/how-do-i-install-forked-gems-on-heroku'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">2</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">12</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3021765/how-do-i-install-forked-gems-on-heroku" class="question-hyperlink" title="I'm trying to get Heroku working with European buckets on amazon s3 webserivces using the aws-s3 gem. It seems I need to install a forked version of the gem to get around the issue. However, with  … ">How do I install forked gems on heroku?</a></h3>
+        
+        <div class="tags t-ruby-on-rails t-rubygems t-amazon-s3 t-paperclip t-heroku">
+            <a href="/questions/tagged/ruby-on-rails" class="post-tag" title="show questions tagged 'ruby-on-rails'" rel="tag">ruby-on-rails</a> <a href="/questions/tagged/rubygems" class="post-tag" title="show questions tagged 'rubygems'" rel="tag">rubygems</a> <a href="/questions/tagged/amazon-s3" class="post-tag" title="show questions tagged 'amazon-s3'" rel="tag">amazon-s3</a> <a href="/questions/tagged/paperclip" class="post-tag" title="show questions tagged 'paperclip'" rel="tag">p [...]
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3021765/how-do-i-install-forked-gems-on-heroku/?lastactivity" class="started-link"><span title="2010-06-11 16:06:16Z" class="relativetime">15m ago</span></a>
+            <a href="/users/123527/simone-carletti" >Simone Carletti</a> <span class="reputation-score" title="reputation score 12801">12.8k</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024199">
+    <div onclick="window.location.href='/questions/3024199/why-are-extracted-interfaces-internal-rather-than-public'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">1</div>
+            <div>vote</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">12</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024199/why-are-extracted-interfaces-internal-rather-than-public" class="question-hyperlink" title="Visual Studio includes a refactoring function called "Extract Interface" that generates an interface based on a class implementation.
+
+The extracted interfaces are Internal by default.  Problem is, we  … ">Why are “Extracted Interfaces” Internal rather than Public?</a></h3>
+        
+        <div class="tags t-visual-studio t-conventions t-refactor t-visual">
+            <a href="/questions/tagged/visual-studio" class="post-tag" title="show questions tagged 'visual-studio'" rel="tag">visual-studio</a> <a href="/questions/tagged/conventions" class="post-tag" title="show questions tagged 'conventions'" rel="tag">conventions</a> <a href="/questions/tagged/refactor" class="post-tag" title="show questions tagged 'refactor'" rel="tag">refactor</a> <a href="/questions/tagged/visual" class="post-tag" title="show questions tagged 'visual'" rel="tag">v [...]
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3024199/why-are-extracted-interfaces-internal-rather-than-public/?lastactivity" class="started-link"><span title="2010-06-11 16:06:07Z" class="relativetime">15m ago</span></a>
+            <a href="/users/40347/0xa3" >0xA3</a> <span class="reputation-score" title="reputation score 19373">19.4k</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3022385">
+    <div onclick="window.location.href='/questions/3022385/cakephp-contain-condition'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">1</div>
+            <div>answer</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">9</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3022385/cakephp-contain-condition" class="question-hyperlink" title="my problem is that can i give condition [ 'BookTitleMaster.id' => $xtitid, ] as like below
+
+$bbookinfs = $this->BookStockin->BookIssue->find('all', array(
+    'conditions' =>  … ">cakephp contain - condition</a></h3>
+        
+        <div class="tags t-cakephp t-cakephp-1û3">
+            <a href="/questions/tagged/cakephp" class="post-tag" title="show questions tagged 'cakephp'" rel="tag">cakephp</a> <a href="/questions/tagged/cakephp-1.3" class="post-tag" title="show questions tagged 'cakephp-1.3'" rel="tag">cakephp-1.3</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3022385/cakephp-contain-condition/?lastactivity" class="started-link"><span title="2010-06-11 16:05:59Z" class="relativetime">15m ago</span></a>
+            <a href="/users/362745/nik" >Nik</a> <span class="reputation-score" title="reputation score">51</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024336">
+    <div onclick="window.location.href='/questions/3024336/ssis-lookup-fails-after-removing-output-column'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">4</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024336/ssis-lookup-fails-after-removing-output-column" class="question-hyperlink" title="I am so close to snap out after two weeks of SSIS... it is SO FULL of bugs, that I cannot imagine how it could be launched... I forgot how much I hated it...
+
+But, back to the problem:
+
+I have a  … ">SSIS Lookup fails after removing output column</a></h3>
+        
+        <div class="tags t-ssis t-bug t-lookup">
+            <a href="/questions/tagged/ssis" class="post-tag" title="show questions tagged 'ssis'" rel="tag">ssis</a> <a href="/questions/tagged/bug" class="post-tag" title="show questions tagged 'bug'" rel="tag">bug</a> <a href="/questions/tagged/lookup" class="post-tag" title="show questions tagged 'lookup'" rel="tag">lookup</a> 
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:05:48Z" class="relativetime">16m ago</span>
+            <a href="/users/317414/diana" >Diana</a> <span class="reputation-score" title="reputation score">15</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024335">
+    <div onclick="window.location.href='/questions/3024335/not-able-to-connect-android-client-with-local-xmpp-server'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">2</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024335/not-able-to-connect-android-client-with-local-xmpp-server" class="question-hyperlink" title="Hi
+This is with regards to post here
+
+I am able to connect my PC to the local tigase server setup locally(I am using Smack API). Now I am facing problems when I want to connect Android Phone to that  … ">Not able to connect Android client with local XMPP server.</a></h3>
+        
+        <div class="tags t-android t-client-server t-xmpp t-smack t-tigase">
+            <a href="/questions/tagged/android" class="post-tag" title="show questions tagged 'android'" rel="tag"><img src="http://sstatic.net/so/img/tag-android.png" height="16" width="18" alt="" class="sponsor-tag-img">android</a> <a href="/questions/tagged/client-server" class="post-tag" title="show questions tagged 'client-server'" rel="tag">client-server</a> <a href="/questions/tagged/xmpp" class="post-tag" title="show questions tagged 'xmpp'" rel="tag">xmpp</a> <a href="/questions [...]
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:05:24Z" class="relativetime">16m ago</span>
+            <a href="/users/355833/ameya-phadke" >Ameya Phadke</a> <span class="reputation-score" title="reputation score">6</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3022997">
+    <div onclick="window.location.href='/questions/3022997/service-broker-message-process-order'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status answered">
+            <div class="mini-counts">2</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">32</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3022997/service-broker-message-process-order" class="question-hyperlink" title="Everywhere I read says that messages handled by the service broker are processed in the order that they arrive, and yet if you create a table, message type, contract, service etc , and on activation  … ">service broker message process order</a></h3>
+        
+        <div class="tags t-sql-server t-sql-server-2005">
+            <a href="/questions/tagged/sql-server" class="post-tag" title="show questions tagged 'sql-server'" rel="tag"><img src="http://sstatic.net/so/img/tag-redgate.png" height="16" width="18" alt="" class="sponsor-tag-img">sql-server</a> <a href="/questions/tagged/sql-server-2005" class="post-tag" title="show questions tagged 'sql-server-2005'" rel="tag"><img src="http://sstatic.net/so/img/tag-redgate.png" height="16" width="18" alt="" class="sponsor-tag-img">sql-server-2005</a> 
+        </div>
+        <div class="started">
+            
+            <a href="/questions/3022997/service-broker-message-process-order/?lastactivity" class="started-link"><span title="2010-06-11 16:05:13Z" class="relativetime">16m ago</span></a>
+            <a href="/users/364709/allen-white" >Allen White</a> <span class="reputation-score" title="reputation score">1</span>
+        </div>
+    </div>
+</div>
+
+<div class="question-summary narrow" id="question-summary-3024330">
+    <div onclick="window.location.href='/questions/3024330/how-to-fix-codesign-when-it-says-user-cancelled-the-operation-and-i-didnt'" class="cp">
+        <div class="votes">
+            <div class="mini-counts">0</div>
+            <div>votes</div>
+        </div>
+        <div class="status unanswered">
+            <div class="mini-counts">0</div>
+            <div>answers</div>
+        </div>
+        <div class="views">
+            <div class="mini-counts">3</div>
+            <div>views</div>
+        </div>
+    </div>
+    <div class="summary">
+        <h3><a href="/questions/3024330/how-to-fix-codesign-when-it-says-user-cancelled-the-operation-and-i-didnt" class="question-hyperlink" title="I'm compiling an iPhone app meant to be Distributed. It's my first app so I followed the "iPhone Provisioning Profiles" instructions. Unfortunately it fails with this:
+
+CodeSign build/*_*_.app
+cd  … ">How to fix codesign when it says user cancelled the operation? (And I didn’t)</a></h3>
+        
+        <div class="tags t-iphone t-xcode t-codesign">
+            <a href="/questions/tagged/iphone" class="post-tag" title="show questions tagged 'iphone'" rel="tag">iphone</a> <a href="/questions/tagged/xcode" class="post-tag" title="show questions tagged 'xcode'" rel="tag">xcode</a> <a href="/questions/tagged/codesign" class="post-tag" title="show questions tagged 'codesign'" rel="tag">codesign</a> 
+        </div>
+        <div class="started">
+            <span title="2010-06-11 16:04:58Z" class="relativetime">16m ago</span>
+            <a href="/users/85495/eipipuz" >eipipuz</a> <span class="reputation-score" title="reputation score">171</span>
+        </div>
+    </div>
+</div>
+
+</div>
+
+<h2>Looking for more? Browse the <a href="/questions?sort=newest">complete list of questions</a>, or <a href="/tags">popular tags</a>. Help us answer <a href="/unanswered">unanswered questions</a>.</h2>
+
+    </div>
+    
+    <div id="sidebar">
+        
+<div class="module newuser" style="display:none">
+    <h4>Hello World!</h4>
+    <div>
+        <p>Stack Overflow is a <b>collaboratively edited question and answer site for programmers</b> – regardless of platform or language. It's 100% free, no registration required.</p>
+        <p class="ar"><a href="/about">about »</a>   <a href="/faq">faq »</a></p>
+    </div>
+</div>
+    <div class="everyonelovesstackoverflow">
+        <script type="text/javascript">
+            document.write('<s'+'cript lang' + 'uage="jav' + 'ascript" src="http://ads.stackoverflow.com/a.aspx?ZoneID=4&Task=Get&IFR=False&PageID=52405&SiteID=1&Random=' + (+new Date()) + '">'); 
+            document.write('</'+'scr'+'ipt>');
+        </script>
+        <noscript>
+            <div>
+            <a href="http://ads.stackoverflow.com/a.aspx?ZoneID=4&Task=Click&Mode=HTML&SiteID=1&PageID=52405">
+            <img src="http://ads.stackoverflow.com/a.aspx?ZoneID=4&Task=Get&Mode=HTML&SiteID=1&PageID=52405" alt="">
+            </a>
+            </div>
+        </noscript>
+    </div>
+    
+    <div class="welovestackoverflow">
+        <script type="text/javascript">
+            
+	document.write(
+	   '<strong>Wanted:</strong> ' +
+	   '<a href="http://jobs.stackoverflow.com/?6984">' +
+	   "Desktop Support Specialist" +
+	   ' at ' +
+	   "Ronin Capital LLC</a> (" +
+	   "New York, NY  10281" +
+	   '). See this and other great job listings at ' +
+	   '<a href="http://jobs.stackoverflow.com">jobs.stackoverflow.com</a>.');
+	
+        </script>
+    </div>
+          
+        
+<div class="module" id="recent-tags">
+    <h4>Recent Tags</h4>
+    <div id="recent-tags">
+    <a href="/questions/tagged/c%23" class="post-tag" title="show questions tagged 'c#'" rel="tag">c#</a><span class="item-multiplier">× 146</span><br>
+<a href="/questions/tagged/cifs" class="post-tag" title="show questions tagged 'cifs'" rel="tag">cifs</a><br>
+<a href="/questions/tagged/database" class="post-tag" title="show questions tagged 'database'" rel="tag">database</a><span class="item-multiplier">× 12</span><br>
+<a href="/questions/tagged/web-applications" class="post-tag" title="show questions tagged 'web-applications'" rel="tag">web-applications</a><span class="item-multiplier">× 5</span><br>
+<a href="/questions/tagged/new" class="post-tag" title="show questions tagged 'new'" rel="tag">new</a><br>
+<a href="/questions/tagged/loading" class="post-tag" title="show questions tagged 'loading'" rel="tag">loading</a><span class="item-multiplier">× 2</span><br>
+<a href="/questions/tagged/reflection" class="post-tag" title="show questions tagged 'reflection'" rel="tag">reflection</a><span class="item-multiplier">× 6</span><br>
+<a href="/questions/tagged/collection" class="post-tag" title="show questions tagged 'collection'" rel="tag">collection</a><br>
+<a href="/questions/tagged/.htaccess" class="post-tag" title="show questions tagged '.htaccess'" rel="tag">.htaccess</a><span class="item-multiplier">× 3</span><br>
+<a href="/questions/tagged/querystring" class="post-tag" title="show questions tagged 'querystring'" rel="tag">querystring</a><br>
+<a href="/questions/tagged/wpf" class="post-tag" title="show questions tagged 'wpf'" rel="tag">wpf</a><span class="item-multiplier">× 17</span><br>
+<a href="/questions/tagged/synchronization" class="post-tag" title="show questions tagged 'synchronization'" rel="tag">synchronization</a><span class="item-multiplier">× 2</span><br>
+<a href="/questions/tagged/wpf-controls" class="post-tag" title="show questions tagged 'wpf-controls'" rel="tag">wpf-controls</a><br>
+<a href="/questions/tagged/dependency-properties" class="post-tag" title="show questions tagged 'dependency-properties'" rel="tag">dependency-properties</a><br>
+<a href="/questions/tagged/race-condition" class="post-tag" title="show questions tagged 'race-condition'" rel="tag">race-condition</a><br>
+<a href="/questions/tagged/tsql" class="post-tag" title="show questions tagged 'tsql'" rel="tag"><img src="http://sstatic.net/so/img/tag-redgate.png" height="16" width="18" alt="" class="sponsor-tag-img">tsql</a><span class="item-multiplier">× 2</span><br>
+<a href="/questions/tagged/float" class="post-tag" title="show questions tagged 'float'" rel="tag">float</a><span class="item-multiplier">× 4</span><br>
+<a href="/questions/tagged/literals" class="post-tag" title="show questions tagged 'literals'" rel="tag">literals</a><br>
+<a href="/questions/tagged/git" class="post-tag" title="show questions tagged 'git'" rel="tag">git</a><span class="item-multiplier">× 11</span><br>
+<a href="/questions/tagged/version-control" class="post-tag" title="show questions tagged 'version-control'" rel="tag">version-control</a><span class="item-multiplier">× 3</span><br>
+<a href="/questions/tagged/github" class="post-tag" title="show questions tagged 'github'" rel="tag">github</a><span class="item-multiplier">× 2</span><br>
+<a href="/questions/tagged/whitespace" class="post-tag" title="show questions tagged 'whitespace'" rel="tag">whitespace</a><br>
+<a href="/questions/tagged/html" class="post-tag" title="show questions tagged 'html'" rel="tag">html</a><span class="item-multiplier">× 36</span><br>
+<a href="/questions/tagged/linux" class="post-tag" title="show questions tagged 'linux'" rel="tag">linux</a><span class="item-multiplier">× 15</span><br>
+<a href="/questions/tagged/image" class="post-tag" title="show questions tagged 'image'" rel="tag">image</a><span class="item-multiplier">× 7</span><br>
+<a href="/questions/tagged/rendering" class="post-tag" title="show questions tagged 'rendering'" rel="tag">rendering</a><span class="item-multiplier">× 2</span><br>
+<a href="/questions/tagged/headless" class="post-tag" title="show questions tagged 'headless'" rel="tag">headless</a><br>
+<a href="/questions/tagged/javascript" class="post-tag" title="show questions tagged 'javascript'" rel="tag">javascript</a><span class="item-multiplier">× 74</span><br>
+<a href="/questions/tagged/jquery" class="post-tag" title="show questions tagged 'jquery'" rel="tag">jquery</a><span class="item-multiplier">× 70</span><br>
+<a href="/questions/tagged/xml" class="post-tag" title="show questions tagged 'xml'" rel="tag">xml</a><span class="item-multiplier">× 23</span><br>
+<a href="/questions/tagged/traversal" class="post-tag" title="show questions tagged 'traversal'" rel="tag">traversal</a><br>
+<a href="/questions/tagged/owl" class="post-tag" title="show questions tagged 'owl'" rel="tag">owl</a><br>
+<a href="/questions/tagged/jena" class="post-tag" title="show questions tagged 'jena'" rel="tag">jena</a><br>
+<a href="/questions/tagged/inference" class="post-tag" title="show questions tagged 'inference'" rel="tag">inference</a><br>
+<a href="/questions/tagged/mysql" class="post-tag" title="show questions tagged 'mysql'" rel="tag">mysql</a><span class="item-multiplier">× 39</span><br>
+<a href="/questions/tagged/java" class="post-tag" title="show questions tagged 'java'" rel="tag">java</a><span class="item-multiplier">× 137</span><br>
+<a href="/questions/tagged/classpath" class="post-tag" title="show questions tagged 'classpath'" rel="tag">classpath</a><br>
+<a href="/questions/tagged/.net-3.5" class="post-tag" title="show questions tagged '.net-3.5'" rel="tag">.net-3.5</a><span class="item-multiplier">× 3</span><br>
+<a href="/questions/tagged/delegates" class="post-tag" title="show questions tagged 'delegates'" rel="tag">delegates</a><br>
+<a href="/questions/tagged/multithreading" class="post-tag" title="show questions tagged 'multithreading'" rel="tag">multithreading</a><span class="item-multiplier">× 6</span><br>
+<a href="/questions/tagged/com" class="post-tag" title="show questions tagged 'com'" rel="tag">com</a><span class="item-multiplier">× 3</span><br>
+<a href="/questions/tagged/thread" class="post-tag" title="show questions tagged 'thread'" rel="tag">thread</a><span class="item-multiplier">× 3</span><br>
+<a href="/questions/tagged/cross" class="post-tag" title="show questions tagged 'cross'" rel="tag">cross</a><br>
+<a href="/questions/tagged/asp.net" class="post-tag" title="show questions tagged 'asp.net'" rel="tag">asp.net</a><span class="item-multiplier">× 53</span><br>
+<a href="/questions/tagged/asp.net-mvc" class="post-tag" title="show questions tagged 'asp.net-mvc'" rel="tag">asp.net-mvc</a><span class="item-multiplier">× 18</span><br>
+<a href="/questions/tagged/sound" class="post-tag" title="show questions tagged 'sound'" rel="tag">sound</a><br>
+<a href="/questions/tagged/filtering" class="post-tag" title="show questions tagged 'filtering'" rel="tag">filtering</a><span class="item-multiplier">× 2</span><br>
+<a href="/questions/tagged/noise" class="post-tag" title="show questions tagged 'noise'" rel="tag">noise</a><br>
+<a href="/questions/tagged/linq-to-sql" class="post-tag" title="show questions tagged 'linq-to-sql'" rel="tag">linq-to-sql</a><span class="item-multiplier">× 7</span><br>
+<a href="/questions/tagged/visual-studio" class="post-tag" title="show questions tagged 'visual-studio'" rel="tag">visual-studio</a><span class="item-multiplier">× 9</span><br>
+<a href="/questions/tagged/conventions" class="post-tag" title="show questions tagged 'conventions'" rel="tag">conventions</a><br>
+<a href="/questions/tagged/refactor" class="post-tag" title="show questions tagged 'refactor'" rel="tag">refactor</a><br>
+<a href="/questions/tagged/visual" class="post-tag" title="show questions tagged 'visual'" rel="tag">visual</a><span class="item-multiplier">× 2</span><br>
+<a href="/questions/tagged/c%2b%2b" class="post-tag" title="show questions tagged 'c++'" rel="tag">c++</a><span class="item-multiplier">× 75</span><br>
+<a href="/questions/tagged/ide" class="post-tag" title="show questions tagged 'ide'" rel="tag">ide</a><br>
+<a href="/questions/tagged/parameters" class="post-tag" title="show questions tagged 'parameters'" rel="tag">parameters</a><span class="item-multiplier">× 3</span><br>
+<a href="/questions/tagged/mfc" class="post-tag" title="show questions tagged 'mfc'" rel="tag">mfc</a><span class="item-multiplier">× 3</span><br>
+<a href="/questions/tagged/activex" class="post-tag" title="show questions tagged 'activex'" rel="tag">activex</a><br>
+<a href="/questions/tagged/biginteger" class="post-tag" title="show questions tagged 'biginteger'" rel="tag">biginteger</a><br>
+<a href="/questions/tagged/django" class="post-tag" title="show questions tagged 'django'" rel="tag">django</a><span class="item-multiplier">× 10</span><br>
+
+    </div>
+    <div class="ar"><a href="/tags">all tags »</a></div>
+</div>  
+        
+<div class="module" id="recent-badges">
+    <h4>Recent Badges</h4>
+    <table>
+    
+    <tr><td><a href="/badges/12/strunk-white" title="silver badge: Edited 100 entries" class="badge"><span class="badge2"></span> Strunk & White</a>
+ <a href="/users/9453/daniel-dipaolo" >Daniel DiPaolo</a></td></tr>
+    
+    <tr><td><a href="/badges/27/notable-question" title="silver badge: Asked a question with 2,500 views" class="badge"><span class="badge2"></span> Notable Question</a>
+ <a href="/users/82937/jonty" >jonty</a></td></tr>
+    
+    <tr><td><a href="/badges/27/notable-question" title="silver badge: Asked a question with 2,500 views" class="badge"><span class="badge2"></span> Notable Question</a>
+ <a href="/users/10387/tim-jarvis" >Tim Jarvis</a></td></tr>
+    
+    <tr><td><a href="/badges/24/good-answer" title="silver badge: Answer score of 25 or more" class="badge"><span class="badge2"></span> Good Answer</a>
+ <a href="/users/33890/jay-godse" >Jay Godse</a></td></tr>
+    
+    <tr><td><a href="/badges/24/good-answer" title="silver badge: Answer score of 25 or more" class="badge"><span class="badge2"></span> Good Answer</a>
+ <a href="/users/88851/bastien-leonard" >Bastien Léonard</a></td></tr>
+    
+    <tr><td><a href="/badges/17/necromancer" title="silver badge: Answered a question more than 60 days later with score of 5 or more" class="badge"><span class="badge2"></span> Necromancer</a>
+ <a href="/users/242943/j-chris-a" >J Chris A</a></td></tr>
+    
+    <tr><td><a href="/badges/32/civic-duty" title="silver badge: Voted 300 or more times" class="badge"><span class="badge2"></span> Civic Duty</a>
+ <a href="/users/41717/steve" >Steve</a></td></tr>
+    
+    <tr><td><a href="/badges/27/notable-question" title="silver badge: Asked a question with 2,500 views" class="badge"><span class="badge2"></span> Notable Question</a>
+ <a href="/users/51278/juvenis" >juvenis</a></td></tr>
+    
+    <tr><td><a href="/badges/28/famous-question" title="gold badge: Asked a question with 10,000 views" class="badge"><span class="badge1"></span> Famous Question</a>
+ <a href="/users/4872/ray-vega" >Ray Vega</a></td></tr>
+    
+    <tr><td><a href="/badges/19/enlightened" title="silver badge: First answer was accepted with score of 10 or more" class="badge"><span class="badge2"></span> Enlightened</a>
+ <a href="/users/1968/konrad-rudolph" >Konrad Rudolph</a></td></tr>
+    
+    <tr><td><a href="/badges/19/enlightened" title="silver badge: First answer was accepted with score of 10 or more" class="badge"><span class="badge2"></span> Enlightened</a>
+ <a href="/users/140719/sbi" >sbi</a></td></tr>
+    
+    <tr><td><a href="/badges/19/enlightened" title="silver badge: First answer was accepted with score of 10 or more" class="badge"><span class="badge2"></span> Enlightened</a>
+ <a href="/users/7586/kobi" >Kobi</a></td></tr>
+    
+    <tr><td><a href="/badges/19/enlightened" title="silver badge: First answer was accepted with score of 10 or more" class="badge"><span class="badge2"></span> Enlightened</a>
+ <a href="/users/76310/joe-koberg" >Joe Koberg</a></td></tr>
+    
+    <tr><td><a href="/badges/19/enlightened" title="silver badge: First answer was accepted with score of 10 or more" class="badge"><span class="badge2"></span> Enlightened</a>
+ <a href="/users/33708/mehrdad-afshari" >Mehrdad Afshari</a></td></tr>
+    
+    <tr><td><a href="/badges/19/enlightened" title="silver badge: First answer was accepted with score of 10 or more" class="badge"><span class="badge2"></span> Enlightened</a>
+ <a href="/users/118145/yacoby" >Yacoby</a></td></tr>
+    
+    <tr><td><a href="/badges/19/enlightened" title="silver badge: First answer was accepted with score of 10 or more" class="badge"><span class="badge2"></span> Enlightened</a>
+ <a href="/users/350890/peter-tillemans" >Peter Tillemans</a></td></tr>
+    
+    <tr><td><a href="/badges/19/enlightened" title="silver badge: First answer was accepted with score of 10 or more" class="badge"><span class="badge2"></span> Enlightened</a>
+ <a href="/users/240411/unomi" >unomi</a></td></tr>
+    
+    <tr><td><a href="/badges/19/enlightened" title="silver badge: First answer was accepted with score of 10 or more" class="badge"><span class="badge2"></span> Enlightened</a>
+ <a href="/users/23283/jaredpar" >JaredPar</a></td></tr>
+    
+    <tr><td><a href="/badges/19/enlightened" title="silver badge: First answer was accepted with score of 10 or more" class="badge"><span class="badge2"></span> Enlightened</a>
+ <a href="/users/1053/ed-swangren" >Ed Swangren</a></td></tr>
+    
+    <tr><td><a href="/badges/19/enlightened" title="silver badge: First answer was accepted with score of 10 or more" class="badge"><span class="badge2"></span> Enlightened</a>
+ <a href="/users/22656/jon-skeet" >Jon Skeet</a></td></tr>
+    
+    <tr><td><a href="/badges/27/notable-question" title="silver badge: Asked a question with 2,500 views" class="badge"><span class="badge2"></span> Notable Question</a>
+ <a href="/users/44762/sam" >Sam</a></td></tr>
+    
+    <tr><td><a href="/badges/27/notable-question" title="silver badge: Asked a question with 2,500 views" class="badge"><span class="badge2"></span> Notable Question</a>
+ <a href="/users/7675/adam-backstrom" >Adam Backstrom</a></td></tr>
+    
+    <tr><td><a href="/badges/11/taxonomist" title="silver badge: Created a tag used by 50 questions" class="badge"><span class="badge2"></span> Taxonomist</a>
+ <a href="/users/14769/marcus-krueger" >Marcus Krueger</a></td></tr>
+    
+    <tr><td><a href="/badges/27/notable-question" title="silver badge: Asked a question with 2,500 views" class="badge"><span class="badge2"></span> Notable Question</a>
+ <a href="/users/14860/paxdiablo" >paxdiablo</a></td></tr>
+    
+    <tr><td><a href="/badges/28/famous-question" title="gold badge: Asked a question with 10,000 views" class="badge"><span class="badge1"></span> Famous Question</a>
+ <a href="/users/4964/gerhard-weiss" >Gerhard Weiss</a></td></tr>
+    
+    <tr><td><a href="/badges/17/necromancer" title="silver badge: Answered a question more than 60 days later with score of 5 or more" class="badge"><span class="badge2"></span> Necromancer</a>
+ <a href="/users/237186/jhurrah" >JHurrah</a></td></tr>
+    
+    <tr><td><a href="/badges/17/necromancer" title="silver badge: Answered a question more than 60 days later with score of 5 or more" class="badge"><span class="badge2"></span> Necromancer</a>
+ <a href="/users/145190/meder" >meder</a></td></tr>
+    
+    <tr><td><a href="/badges/21/good-question" title="silver badge: Question score of 25 or more" class="badge"><span class="badge2"></span> Good Question</a>
+ <a href="/users/4770/joek1975" >joek1975</a></td></tr>
+    
+    <tr><td><a href="/badges/13/yearling" title="silver badge: Active member for a year, earning at least 200 reputation" class="badge"><span class="badge2"></span> Yearling</a>
+ <a href="/users/92554/bbudge" >bbudge</a></td></tr>
+    
+    <tr><td><a href="/badges/27/notable-question" title="silver badge: Asked a question with 2,500 views" class="badge"><span class="badge2"></span> Notable Question</a>
+ <a href="/users/67391/iphoney" >iPhoney</a></td></tr>
+    
+    <tr><td><a href="/badges/27/notable-question" title="silver badge: Asked a question with 2,500 views" class="badge"><span class="badge2"></span> Notable Question</a>
+ <a href="/users/31762/tony-lambert" >Tony Lambert</a></td></tr>
+    
+    <tr><td><a href="/badges/27/notable-question" title="silver badge: Asked a question with 2,500 views" class="badge"><span class="badge2"></span> Notable Question</a>
+ <a href="/users/16524/fostah" >Fostah</a></td></tr>
+    
+    </table>
+    <div class="ar"><a href="/badges">all badges »</a></div>
+</div>  
+              
+    </div>
+    
+        
+<div id="feed-link">
+    <div id="feed-link-text"><a href="/feeds" title="the 30 most recent questions"><span class="feed-icon"></span>recent questions feed</a></div>
+</div>
+
+        </div>
+    </div>
+    <div id="footer">
+        <div class="footerwrap">
+            <div id="footer-menu">
+                <a href="/about">about</a> |
+                <a href="/faq">faq</a> |
+                <a href="http://blog.stackoverflow.com">blog</a> |
+                <a href="http://itc.conversationsnetwork.org/series/stackoverflow.html">podcast</a> |
+                <a href="/legal">legal</a> |
+                <a href="http://ads.stackoverflow.com/a.aspx?ZoneID=0&BannerID=323&AdvertiserID=5&CampaignID=194&Task=Click&SiteID=1">advertising info</a> |
+                <b><a href="mailto:team at stackoverflow.com">contact us</a></b> |
+                <b><a href="http://meta.stackoverflow.com">feedback always welcome</a></b>
+                <div id="footer-sites">
+                    <span style="color:#FE7A15;font-size:140%">■</span> <a href="http://stackoverflow.com">stackoverflow.com</a>  
+                    <span style="color:#FE7A15;font-size:140%">■</span> <a href="http://stackapps.com">api/apps</a>  
+                    <span style="color:#FE7A15;font-size:140%">■</span> <a href="http://careers.stackoverflow.com">careers</a>                      
+                    <span style="color:#E8272C;font-size:140%">■</span> <a href="http://serverfault.com">serverfault.com</a>  
+                    <span style="color:#00AFEF;font-size:140%">■</span> <a href="http://superuser.com">superuser.com</a>  
+                    <span style="color:#969696;font-size:140%">■</span> <a href="http://meta.stackoverflow.com">meta</a>  
+                    <a href="http://www.howtogeek.com">howtogeek.com</a>  
+                    <a href="http://doctype.com">doctype.com</a>
+                </div>
+            </div>
+            <div id="footer-flair">
+	            <a href="http://creativecommons.org/licenses/by-sa/2.5/" class="cc-wiki-link"></a>
+	            <a href="http://www.peakinternet.com/business/hosting/colocation-dedicated#" class="peak-link"></a>
+                <div id="svnrev">revision: 2010.6.11.3</div>
+            
+            </div>
+            <div id="copyright">
+                site design / logo © 2010 stack overflow internet services, inc; 
+                user contributions licensed under <a href="http://creativecommons.org/licenses/by-sa/2.5/" rel="license">cc-wiki</a> with <a href="http://blog.stackoverflow.com/2009/06/attribution-required/" rel="license">attribution required</a>
+            </div>
+        </div>
+    </div>
+    
+    <noscript>
+        <div id="noscript-warning">Stack Overflow works best with JavaScript enabled<img src="http://pixel.quantserve.com/pixel/p-c1rF4kxgLUzNc.gif" alt="" class="dno"></div>
+    </noscript>
+    
+    <script type="text/javascript">
+        document.write(unescape("%3Cscript src='http://www.google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
+    </script>
+    <script type="text/javascript">
+        var pageTracker = _gat._getTracker("UA-5620270-1");
+        pageTracker._trackPageview();
+    </script>
+    <script type="text/javascript">
+        _qoptions = { qacct : "p-c1rF4kxgLUzNc" };
+    </script>
+    <script type="text/javascript" src="http://edge.quantserve.com/quant.js"></script>
+        
+</body>
+</html>
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/testdata/trackerchecker.html b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/testdata/trackerchecker.html
new file mode 100644
index 0000000..2dfb1a0
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/testdata/trackerchecker.html
@@ -0,0 +1,2733 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+<title>www.trackerchecker.com - We check your trackers</title>
+<meta name="verify-v1" content="x+jg/QDgbFTlQIZIRtyf/2MnRz8390r1gsx9ZdlY8d4=" />
+<META NAME="Description" CONTENT="Trackerchecker.com is a torrent tracker checker. It will show you wich private torrent trackers are open for signup.">
+<link href="style/stylesheet.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div id="holder" style="position:relative; margin-left:auto; margin-right:auto;width:520px;1px;">
+<table cellpadding="1" cellspacing="1"><tr>
+<td><a href="/" target="_self" class="menu">Home</a></td>
+<td> || </td>
+<td><a href="/?action=mailform" target="_self" class="menu">Add a tracker</a></td>
+<td> || </td>
+<td><a href="/?action=showLastEdit" target="_self" class="menu">Latest trackers</a></td>
+</tr></table>
+<br>
+<table>
+<tr><td>
+<a href="http://www.twitter.com/trackerchecker" target="_blank"><img src="images/twitter_trackerchecker.png" height="90" width="90"  alt="follow us on Twitter" border="0"/></a><br />
+Follow trackerchecker on Twitter --> <a href="http://www.twitter.com/trackerchecker" target="_blank">@trackerchecker</a>.
+</td></tr>
+</table>
+<form action="send.php" method="post">
+<table>
+<tr><td colspan="2">
+<b>We need your input!</b><br> We're developing a new version of Trackerchecker and we want to know what functionality the users like to see in Trackerchecker V3! :) Contribute please and tell us what you like to see in Trackerchecker V3! 
+</td></tr>
+<tr><td>Name:</td><td><input type="text" name="name"></td></tr>
+<tr><td>E-mail:</td><td><input type="text" name="email"></td></tr>
+<tr><td>Suggestion</td><td><textarea name="suggestion"></textarea></td></tr>
+<tr><td></td><td><input type="submit" value="Submit"></td></tr>
+<tr><td></td><td><input type="hidden" name="subs"></td></tr>
+</table>
+</form>
+<br>
+  
+
+<div class="listitem">
+            <div class="header">
+               TrackerList</div>
+            <table class="contenttable" cellpadding="0" cellspacing="0">               
+                <tr>
+                    <th class="TableSorting SpaceLeft"> </th>
+                    <th class="TableSorting">TrackerName</th>
+					<th class="TableSorting">History</th>
+                    <th class="TableSorting">LastChecked</th>
+                    <th class="TableSorting">Status</th>                    
+                </tr>
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://1337x.org/register" target="_blank">1337x.org</a></td>
+					<td><a href="index.php?action=showHistory&id=296" target="_self">view history</a></td>
+                    <td>2010-04-15 18:14:14</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://420project.org/signup.php" target="_blank">420project.org</a></td>
+					<td><a href="index.php?action=showHistory&id=231" target="_self">view history</a></td>
+                    <td>2010-04-15 18:23:46</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://acehd.net/signup.php" target="_blank">acehd.net</a></td>
+					<td><a href="index.php?action=showHistory&id=315" target="_self">view history</a></td>
+                    <td>2010-04-15 18:05:34</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.acetorrents.net/signup.php" target="_blank">acetorrents.net</a></td>
+					<td><a href="index.php?action=showHistory&id=78" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:10</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.adult-cinema-network.net/signup.php" target="_blank">adult-cinema-network.net</a></td>
+					<td><a href="index.php?action=showHistory&id=226" target="_self">view history</a></td>
+                    <td>2010-04-15 18:21:21</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://all4nothin.net/signup.php" target="_blank">all4nothin.net</a></td>
+					<td><a href="index.php?action=showHistory&id=83" target="_self">view history</a></td>
+                    <td>2010-04-15 17:35:20</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.allgirltorrents.com/account-signup.php" target="_blank">allgirltorrents.com</a></td>
+					<td><a href="index.php?action=showHistory&id=216" target="_self">view history</a></td>
+                    <td>2010-04-15 17:45:50</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.allotracker.com/account-signup.php" target="_blank">allotracker.com</a></td>
+					<td><a href="index.php?action=showHistory&id=316" target="_self">view history</a></td>
+                    <td>2010-04-15 17:38:15</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://appz.bitshock.org/signup.php" target="_blank">appz.bitshock.org</a></td>
+					<td><a href="index.php?action=showHistory&id=274" target="_self">view history</a></td>
+                    <td>2010-04-15 17:53:16</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.appzuniverse.org/signup.php" target="_blank">appzuniverse.org</a></td>
+					<td><a href="index.php?action=showHistory&id=79" target="_self">view history</a></td>
+                    <td>2010-04-15 17:49:10</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.arabfilms.org/signup.php" target="_blank">arabfilms.org</a></td>
+					<td><a href="index.php?action=showHistory&id=20" target="_self">view history</a></td>
+                    <td>2010-04-15 17:36:29</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.arabseries.org/signup.php" target="_blank">arabseries.org</a></td>
+					<td><a href="index.php?action=showHistory&id=317" target="_self">view history</a></td>
+                    <td>2010-04-15 17:53:15</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.araditracker.com/account.php" target="_blank">araditracker.com</a></td>
+					<td><a href="index.php?action=showHistory&id=21" target="_self">view history</a></td>
+                    <td>2010-04-15 17:37:17</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.arena-tr.com/signup.php" target="_blank">arena-tr.com</a></td>
+					<td><a href="index.php?action=showHistory&id=264" target="_self">view history</a></td>
+                    <td>2010-04-15 18:21:22</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://arenabg.com/register-en.php" target="_blank">arenabg.com</a></td>
+					<td><a href="index.php?action=showHistory&id=84" target="_self">view history</a></td>
+                    <td>2010-04-15 17:36:30</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://artofmisdirection.com/account-signup.php" target="_blank">artofmisdirection.com</a></td>
+					<td><a href="index.php?action=showHistory&id=302" target="_self">view history</a></td>
+                    <td>2010-04-15 17:49:51</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://asiandvdclub.org/signup.php" target="_blank">asiandvdclub.org</a></td>
+					<td><a href="index.php?action=showHistory&id=85" target="_self">view history</a></td>
+                    <td>2010-04-15 17:35:13</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://at-tracker.org/signup.php" target="_blank">at-tracker.org</a></td>
+					<td><a href="index.php?action=showHistory&id=112" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:40</td>
+                    <td><span style='color:red'>Offline</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.atomico-torrent.com/trackers/signup.php" target="_blank">atomico-torrent.com</a></td>
+					<td><a href="index.php?action=showHistory&id=318" target="_self">view history</a></td>
+                    <td>2010-04-15 18:00:09</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://forum.audionews.ru/index.php" target="_blank">audionews.ru</a></td>
+					<td><a href="index.php?action=showHistory&id=22" target="_self">view history</a></td>
+                    <td>2010-04-15 17:57:00</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.audiotracer.com/signup.php" target="_blank">audiotracer.com</a></td>
+					<td><a href="index.php?action=showHistory&id=103" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:12</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://audiozonetorrents.com/signup.php" target="_blank">audiozonetorrents.com</a></td>
+					<td><a href="index.php?action=showHistory&id=114" target="_self">view history</a></td>
+                    <td>2010-04-15 18:22:18</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://avatarbg.info/signup.php?lang=en" target="_blank">avatarbg.info</a></td>
+					<td><a href="index.php?action=showHistory&id=129" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:40</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://awesome-hd.com/register.php" target="_blank">awesome-hd.com</a></td>
+					<td><a href="index.php?action=showHistory&id=281" target="_self">view history</a></td>
+                    <td>2010-04-15 18:03:09</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.awesome-hd.net/signup.php" target="_blank">awesome-hd.net</a></td>
+					<td><a href="index.php?action=showHistory&id=341" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:25</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.baltracker.net/account.php" target="_blank">baltracker.net</a></td>
+					<td><a href="index.php?action=showHistory&id=308" target="_self">view history</a></td>
+                    <td>2010-04-15 18:14:10</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://bestmmatorrents.com/account-signup.php" target="_blank">bestmmatorrents.com</a></td>
+					<td><a href="index.php?action=showHistory&id=269" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:18</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.bestshare.ro/signup.php" target="_blank">bestshare.ro</a></td>
+					<td><a href="index.php?action=showHistory&id=130" target="_self">view history</a></td>
+                    <td>2010-04-15 17:37:02</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://bestxvid.org/signup.php" target="_blank">bestxvid.org</a></td>
+					<td><a href="index.php?action=showHistory&id=80" target="_self">view history</a></td>
+                    <td>2010-04-15 17:35:13</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.bit-hdtv.com/signup.php" target="_blank">bit-hdtv.com</a></td>
+					<td><a href="index.php?action=showHistory&id=131" target="_self">view history</a></td>
+                    <td>2010-04-15 18:14:09</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://bitaddict.org/signup.php" target="_blank">bitaddict.org</a></td>
+					<td><a href="index.php?action=showHistory&id=132" target="_self">view history</a></td>
+                    <td>2010-04-15 17:45:11</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.bitchil.com/signup.php" target="_blank">bitchil.com</a></td>
+					<td><a href="index.php?action=showHistory&id=262" target="_self">view history</a></td>
+                    <td>2010-04-15 17:45:16</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.bitflamers.com/signup.php" target="_blank">bitflamers.com</a></td>
+					<td><a href="index.php?action=showHistory&id=236" target="_self">view history</a></td>
+                    <td>2010-04-15 18:21:13</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.bitgamer.com/signup.php" target="_blank">bitgamer.com</a></td>
+					<td><a href="index.php?action=showHistory&id=285" target="_self">view history</a></td>
+                    <td>2010-04-15 18:05:52</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.bithq.org/signup.php" target="_blank">bithq.org</a></td>
+					<td><a href="index.php?action=showHistory&id=74" target="_self">view history</a></td>
+                    <td>2010-04-15 18:05:56</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://bithumen.ath.cx/signup.php" target="_blank">bithumen.ath.cx</a></td>
+					<td><a href="index.php?action=showHistory&id=195" target="_self">view history</a></td>
+                    <td>2010-04-15 17:44:41</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://bitlove.hu/signupsms.php" target="_blank">bitlove.hu</a></td>
+					<td><a href="index.php?action=showHistory&id=190" target="_self">view history</a></td>
+                    <td>2010-04-15 17:35:02</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.bitme.org/signup.php" target="_blank">bitme.org</a></td>
+					<td><a href="index.php?action=showHistory&id=1" target="_self">view history</a></td>
+                    <td>2010-04-15 17:35:16</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.bitmetv.org/signup.php" target="_blank">bitmetv.org</a></td>
+					<td><a href="index.php?action=showHistory&id=9" target="_self">view history</a></td>
+                    <td>2010-04-15 17:40:50</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://bitmusic.hu/signup.php" target="_blank">bitmusic.hu</a></td>
+					<td><a href="index.php?action=showHistory&id=150" target="_self">view history</a></td>
+                    <td>2010-04-15 18:22:56</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="" target="_blank">bitnation.com</a></td>
+					<td><a href="index.php?action=showHistory&id=133" target="_self">view history</a></td>
+                    <td>2010-04-15 18:22:18</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.bitseduce.com/signup.php" target="_blank">bitseduce.com</a></td>
+					<td><a href="index.php?action=showHistory&id=105" target="_self">view history</a></td>
+                    <td>2010-04-15 17:49:53</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.bitseek.org/signup.php" target="_blank">bitseek.org</a></td>
+					<td><a href="index.php?action=showHistory&id=219" target="_self">view history</a></td>
+                    <td>2010-04-15 18:21:12</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.bitseek.org/signup.php" target="_blank">bitseek.org</a></td>
+					<td><a href="index.php?action=showHistory&id=220" target="_self">view history</a></td>
+                    <td>2010-04-15 18:03:09</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.bitshock.org/signup.php" target="_blank">bitshock.org</a></td>
+					<td><a href="index.php?action=showHistory&id=81" target="_self">view history</a></td>
+                    <td>2010-04-15 17:35:11</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="" target="_blank">bitshock.org</a></td>
+					<td><a href="index.php?action=showHistory&id=134" target="_self">view history</a></td>
+                    <td>2010-04-15 17:56:11</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.bitsoup.org/signup.php" target="_blank">bitsoup.org</a></td>
+					<td><a href="index.php?action=showHistory&id=17" target="_self">view history</a></td>
+                    <td>2010-04-15 17:35:20</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.bitspyder.net/signup.php" target="_blank">bitSpyder.net</a></td>
+					<td><a href="index.php?action=showHistory&id=2" target="_self">view history</a></td>
+                    <td>2010-04-15 17:38:08</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://bittorrents.ro/signup.php" target="_blank">bittorrents.ro</a></td>
+					<td><a href="index.php?action=showHistory&id=82" target="_self">view history</a></td>
+                    <td>2010-04-15 17:36:29</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.bitturk.net/signup.php" target="_blank">bitturk.net</a></td>
+					<td><a href="index.php?action=showHistory&id=234" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:18</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://biztorrents.com/signup.php" target="_blank">biztorrents.com</a></td>
+					<td><a href="index.php?action=showHistory&id=175" target="_self">view history</a></td>
+                    <td>2010-04-15 17:45:11</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.blackcats-games.net/signup.php" target="_blank">blackcats-games.net</a></td>
+					<td><a href="index.php?action=showHistory&id=18" target="_self">view history</a></td>
+                    <td>2010-04-15 17:36:28</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.blades-heaven.com/signup.php" target="_blank">blades-heaven.com</a></td>
+					<td><a href="index.php?action=showHistory&id=334" target="_self">view history</a></td>
+                    <td>2010-04-15 18:24:28</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.blue-bytez.com/signup.php" target="_blank">blue-bytez.com</a></td>
+					<td><a href="index.php?action=showHistory&id=136" target="_self">view history</a></td>
+                    <td>2010-04-15 18:23:03</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.blue-whitegt.com/signup.php" target="_blank">blue-whitegt.com</a></td>
+					<td><a href="index.php?action=showHistory&id=321" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:29</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://bmtorrents.net/signup.php" target="_blank">bmtorrents.net</a></td>
+					<td><a href="index.php?action=showHistory&id=135" target="_self">view history</a></td>
+                    <td>2010-04-15 17:38:13</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.bootytape.com/signup.php" target="_blank">bootytape.com</a></td>
+					<td><a href="index.php?action=showHistory&id=301" target="_self">view history</a></td>
+                    <td>2010-04-15 17:45:17</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.bootytorrents.com/signup.php" target="_blank">bootytorrents.com</a></td>
+					<td><a href="index.php?action=showHistory&id=23" target="_self">view history</a></td>
+                    <td>2010-04-15 18:22:21</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.boxtorrents.com/signup.php" target="_blank">boxtorrents.com</a></td>
+					<td><a href="index.php?action=showHistory&id=137" target="_self">view history</a></td>
+                    <td>2010-04-15 18:22:19</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://bt.avistaz.com/account.php" target="_blank">bt.avistaz.com</a></td>
+					<td><a href="index.php?action=showHistory&id=138" target="_self">view history</a></td>
+                    <td>2010-04-15 18:14:10</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://bt.davka.info/register.php" target="_blank">bt.davka.info</a></td>
+					<td><a href="index.php?action=showHistory&id=140" target="_self">view history</a></td>
+                    <td>2010-04-15 17:56:15</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://bt.xbox-sky.cc/register.php" target="_blank">bt.xbox-sky.cc</a></td>
+					<td><a href="index.php?action=showHistory&id=306" target="_self">view history</a></td>
+                    <td>2010-04-15 18:06:25</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://bt.xbox-sky.com/register.php" target="_blank">bt.xbox-sky.com</a></td>
+					<td><a href="index.php?action=showHistory&id=90" target="_self">view history</a></td>
+                    <td>2010-04-15 18:21:45</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://btgigs.info/signup.php" target="_blank">btgigs.info</a></td>
+					<td><a href="index.php?action=showHistory&id=98" target="_self">view history</a></td>
+                    <td>2010-04-15 18:24:22</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.bwtorrents.com/register.php" target="_blank">bwtorrents.com</a></td>
+					<td><a href="index.php?action=showHistory&id=139" target="_self">view history</a></td>
+                    <td>2010-04-15 18:05:56</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.bytelist.org/signup.php" target="_blank">bytelist.org</a></td>
+					<td><a href="index.php?action=showHistory&id=99" target="_self">view history</a></td>
+                    <td>2010-04-15 17:53:12</td>
+                    <td><span style='color:red'>Offline</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.cartoonchaos.org/index.php?page=signup" target="_blank">cartoonchaos.org</a></td>
+					<td><a href="index.php?action=showHistory&id=227" target="_self">view history</a></td>
+                    <td>2010-04-15 17:53:13</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://ccfbits.org/signup.php" target="_blank">ccfbits.org</a></td>
+					<td><a href="index.php?action=showHistory&id=311" target="_self">view history</a></td>
+                    <td>2010-04-15 17:56:59</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://chdbits.org/signup.php" target="_blank">chdbits.org</a></td>
+					<td><a href="index.php?action=showHistory&id=314" target="_self">view history</a></td>
+                    <td>2010-04-15 18:13:08</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://cheggit.net/register.php" target="_blank">cheggit.net/</a></td>
+					<td><a href="index.php?action=showHistory&id=208" target="_self">view history</a></td>
+                    <td>2010-04-15 17:35:14</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.chilebt.com/signup.php?" target="_blank">chilebt.com</a></td>
+					<td><a href="index.php?action=showHistory&id=295" target="_self">view history</a></td>
+                    <td>2010-04-15 17:38:18</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://christiantorrents.com/signup.php" target="_blank">christiantorrents.com</a></td>
+					<td><a href="index.php?action=showHistory&id=277" target="_self">view history</a></td>
+                    <td>2010-04-15 17:56:54</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://chronictracker.com/signup.php" target="_blank">chronictracker.com</a></td>
+					<td><a href="index.php?action=showHistory&id=51" target="_self">view history</a></td>
+                    <td>2010-04-15 18:00:23</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.cinema-obscura.com/register.php" target="_blank">cinema-obscura.com</a></td>
+					<td><a href="index.php?action=showHistory&id=200" target="_self">view history</a></td>
+                    <td>2010-04-15 18:17:13</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.cinemageddon.org/signup.php" target="_blank">cinemageddon.org</a></td>
+					<td><a href="index.php?action=showHistory&id=177" target="_self">view history</a></td>
+                    <td>2010-04-15 17:45:11</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://cinematik.net/signup.php" target="_blank">cinematik.net</a></td>
+					<td><a href="index.php?action=showHistory&id=222" target="_self">view history</a></td>
+                    <td>2010-04-15 18:21:20</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.cleanvobs.org/signup.php" target="_blank">cleanvobs.org</a></td>
+					<td><a href="index.php?action=showHistory&id=237" target="_self">view history</a></td>
+                    <td>2010-04-15 18:04:32</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://colombo-bt.org/index.php?action=register" target="_blank">colombo-bt.org</a></td>
+					<td><a href="index.php?action=showHistory&id=156" target="_self">view history</a></td>
+                    <td>2010-04-15 17:37:16</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.contego.ws/account-signup.php" target="_blank">contego.ws</a></td>
+					<td><a href="index.php?action=showHistory&id=179" target="_self">view history</a></td>
+                    <td>2010-04-15 17:45:15</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://crazytorrent.eu/account-signup.php" target="_blank">crazytorrent.eu</a></td>
+					<td><a href="index.php?action=showHistory&id=113" target="_self">view history</a></td>
+                    <td>2010-04-15 18:22:17</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://torrents.czone.ro/signup.php" target="_blank">czone.ro</a></td>
+					<td><a href="index.php?action=showHistory&id=144" target="_self">view history</a></td>
+                    <td>2010-04-15 17:49:08</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.danger.lv/signup.php" target="_blank">danger.lv</a></td>
+					<td><a href="index.php?action=showHistory&id=210" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:16</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://definitive-scene.com/signup.php" target="_blank">definitive-scene.com</a></td>
+					<td><a href="index.php?action=showHistory&id=348" target="_self">view history</a></td>
+                    <td>2010-04-15 18:23:46</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.demonoid.com/register.php" target="_blank">demonoid.com</a></td>
+					<td><a href="index.php?action=showHistory&id=16" target="_self">view history</a></td>
+                    <td>2010-04-15 17:45:48</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.devilwolfs.com/signup.php" target="_blank">devilwolfs.com</a></td>
+					<td><a href="index.php?action=showHistory&id=213" target="_self">view history</a></td>
+                    <td>2010-04-15 18:14:43</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.diablotorrent.hu/signup.php" target="_blank">diablotorrent.hu</a></td>
+					<td><a href="index.php?action=showHistory&id=224" target="_self">view history</a></td>
+                    <td>2010-04-15 18:04:34</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.dididave.com/signup.php" target="_blank">dididave.com</a></td>
+					<td><a href="index.php?action=showHistory&id=72" target="_self">view history</a></td>
+                    <td>2010-04-15 17:36:36</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.digitalhive.org/signup.php" target="_blank">digitalhive.org</a></td>
+					<td><a href="index.php?action=showHistory&id=128" target="_self">view history</a></td>
+                    <td>2010-04-15 17:45:10</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.dimeadozen.org/account-signup.php" target="_blank">dimeadozen.org</a></td>
+					<td><a href="index.php?action=showHistory&id=10" target="_self">view history</a></td>
+                    <td>2010-04-15 17:40:53</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://dnbtracker.org/account-signup.php" target="_blank">dnbtracker.org</a></td>
+					<td><a href="index.php?action=showHistory&id=209" target="_self">view history</a></td>
+                    <td>2010-04-15 18:17:16</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://docs.torrents.ro/signup.php" target="_blank">docs.torrents.ro</a></td>
+					<td><a href="index.php?action=showHistory&id=8" target="_self">view history</a></td>
+                    <td>2010-04-15 17:49:53</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.dvdseed.org/signup.php" target="_blank">dvdseed.org</a></td>
+					<td><a href="index.php?action=showHistory&id=268" target="_self">view history</a></td>
+                    <td>2010-04-15 17:56:11</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://dvdtreasure.eu/signup.php" target="_blank">dvdtreasure.eu</a></td>
+					<td><a href="index.php?action=showHistory&id=280" target="_self">view history</a></td>
+                    <td>2010-04-15 17:53:16</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.ebookvortex.com/account-signup.php" target="_blank">ebookvortex.com</a></td>
+					<td><a href="index.php?action=showHistory&id=124" target="_self">view history</a></td>
+                    <td>2010-04-15 17:38:12</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.eclipsetorrents.org/signup.php" target="_blank">eclipsetorrents.org</a></td>
+					<td><a href="index.php?action=showHistory&id=214" target="_self">view history</a></td>
+                    <td>2010-04-15 17:40:45</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.egytorrent.com/signup.php" target="_blank">egytorrent.com</a></td>
+					<td><a href="index.php?action=showHistory&id=251" target="_self">view history</a></td>
+                    <td>2010-04-15 17:49:09</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.egytorrent.com/signup.php" target="_blank">egytorrent.com</a></td>
+					<td><a href="index.php?action=showHistory&id=273" target="_self">view history</a></td>
+                    <td>2010-04-15 18:16:07</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://elbitz.net/signup.php" target="_blank">elbitz.net</a></td>
+					<td><a href="index.php?action=showHistory&id=7" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:35</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://tracker.elektronik.ro/signup.php" target="_blank">elektronik.ro</a></td>
+					<td><a href="index.php?action=showHistory&id=193" target="_self">view history</a></td>
+                    <td>2010-04-15 17:45:16</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.empornium.us/signup.php" target="_blank">empornium.us</a></td>
+					<td><a href="index.php?action=showHistory&id=26" target="_self">view history</a></td>
+                    <td>2010-04-15 18:10:02</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://eroticsource.pl/signup.php" target="_blank">eroticsource.pl</a></td>
+					<td><a href="index.php?action=showHistory&id=253" target="_self">view history</a></td>
+                    <td>2010-04-15 18:06:22</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.estrenoslatinos.com/signup.php" target="_blank">estrenoslatinos.com</a></td>
+					<td><a href="index.php?action=showHistory&id=239" target="_self">view history</a></td>
+                    <td>2010-04-15 17:49:09</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://ethor.net/signup.php" target="_blank">ethor.net</a></td>
+					<td><a href="index.php?action=showHistory&id=320" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:38</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://evopt.org/signup.php" target="_blank">evopt.org</a></td>
+					<td><a href="index.php?action=showHistory&id=297" target="_self">view history</a></td>
+                    <td>2010-04-15 17:49:03</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.exigomusic.org/signup.php" target="_blank">Exigomusic</a></td>
+					<td><a href="index.php?action=showHistory&id=292" target="_self">view history</a></td>
+                    <td>2010-04-15 18:17:18</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.extremebits.org/signup.php" target="_blank">extremebits.org</a></td>
+					<td><a href="index.php?action=showHistory&id=110" target="_self">view history</a></td>
+                    <td>2010-04-15 18:17:19</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.extremeshare.org/tracker/signup.php" target="_blank">extremeshare.org</a></td>
+					<td><a href="index.php?action=showHistory&id=106" target="_self">view history</a></td>
+                    <td>2010-04-15 17:36:35</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.faplife.net/signup.php" target="_blank">faplife.net</a></td>
+					<td><a href="index.php?action=showHistory&id=218" target="_self">view history</a></td>
+                    <td>2010-04-15 17:36:44</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="https://feedthe.net/signup.php" target="_blank">feedthe.net</a></td>
+					<td><a href="index.php?action=showHistory&id=197" target="_self">view history</a></td>
+                    <td>2010-04-15 17:37:23</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.filebits.org/signup.php" target="_blank">filebits.org</a></td>
+					<td><a href="index.php?action=showHistory&id=27" target="_self">view history</a></td>
+                    <td>2010-04-15 17:56:52</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.filelist.org/signup.php" target="_blank">filelist.org</a></td>
+					<td><a href="index.php?action=showHistory&id=5" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:17</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://filelist.ro/signup.php" target="_blank">filelist.ro</a></td>
+					<td><a href="index.php?action=showHistory&id=298" target="_self">view history</a></td>
+                    <td>2010-04-15 17:49:53</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.filemp3.org/signup.php" target="_blank">filemp3.org</a></td>
+					<td><a href="index.php?action=showHistory&id=6" target="_self">view history</a></td>
+                    <td>2010-04-15 17:36:43</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://fileporn.org/signup.php" target="_blank">fileporn.org</a></td>
+					<td><a href="index.php?action=showHistory&id=331" target="_self">view history</a></td>
+                    <td>2010-04-15 17:53:11</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.flashtorrents.com.ar/account-signup.php" target="_blank">flashtorrents.com.ar</a></td>
+					<td><a href="index.php?action=showHistory&id=337" target="_self">view history</a></td>
+                    <td>2010-04-15 17:56:15</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.freethescene.net/register.php" target="_blank">Free The Scene (FTS)</a></td>
+					<td><a href="index.php?action=showHistory&id=286" target="_self">view history</a></td>
+                    <td>2010-04-15 18:22:19</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://freshon.tv/signup.php" target="_blank">Fresh On TV (TvT)</a></td>
+					<td><a href="index.php?action=showHistory&id=289" target="_self">view history</a></td>
+                    <td>2010-04-15 18:17:13</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://frztracker.sytes.net/signup.php" target="_blank">frztracker.sytes.net</a></td>
+					<td><a href="index.php?action=showHistory&id=247" target="_self">view history</a></td>
+                    <td>2010-04-15 18:03:49</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://fst.omnilounge.co.uk/signup.php" target="_blank">fst.omnilounge.co.uk</a></td>
+					<td><a href="index.php?action=showHistory&id=54" target="_self">view history</a></td>
+                    <td>2010-04-15 17:36:29</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://tracker.fullcontactzone.com/signup.php" target="_blank">fullcontactzone.com</a></td>
+					<td><a href="index.php?action=showHistory&id=63" target="_self">view history</a></td>
+                    <td>2010-04-15 18:03:17</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.gamecrook.com/account-signup.php" target="_blank">gamecrook.com</a></td>
+					<td><a href="index.php?action=showHistory&id=117" target="_self">view history</a></td>
+                    <td>2010-04-15 17:42:03</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://share.gbvnet.ro/signup.php" target="_blank">gbvnet.ro</a></td>
+					<td><a href="index.php?action=showHistory&id=185" target="_self">view history</a></td>
+                    <td>2010-04-15 17:38:09</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://gettorrents.org/signup.php" target="_blank">gettorrents.org</a></td>
+					<td><a href="index.php?action=showHistory&id=309" target="_self">view history</a></td>
+                    <td>2010-04-15 17:45:03</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://forum.gfxnews.ru/profile.php?mode=register" target="_blank">gfxnews.ru</a></td>
+					<td><a href="index.php?action=showHistory&id=19" target="_self">view history</a></td>
+                    <td>2010-04-15 17:36:28</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.gigatorrents.ws/signup.php" target="_blank">gigatorrents.ws</a></td>
+					<td><a href="index.php?action=showHistory&id=196" target="_self">view history</a></td>
+                    <td>2010-04-15 18:14:10</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://glabella.org/signup.php" target="_blank">glabella.org</a></td>
+					<td><a href="index.php?action=showHistory&id=349" target="_self">view history</a></td>
+                    <td>2010-04-15 17:35:12</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.globus-tracker.com/signup.php" target="_blank">globus-tracker.com</a></td>
+					<td><a href="index.php?action=showHistory&id=260" target="_self">view history</a></td>
+                    <td>2010-04-15 17:45:46</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://goem.org/reqinvite.php" target="_blank">goem.org</a></td>
+					<td><a href="index.php?action=showHistory&id=233" target="_self">view history</a></td>
+                    <td>2010-04-15 17:40:51</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.gormogon.com/index.php?page=signup" target="_blank">gormogon.com</a></td>
+					<td><a href="index.php?action=showHistory&id=345" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:29</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.greek-tracker.com/signup.php" target="_blank">greek-tracker.com</a></td>
+					<td><a href="index.php?action=showHistory&id=270" target="_self">view history</a></td>
+                    <td>2010-04-15 17:35:15</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.grimetorrent.com/signup.php" target="_blank">grimetorrent.com</a></td>
+					<td><a href="index.php?action=showHistory&id=119" target="_self">view history</a></td>
+                    <td>2010-04-15 18:00:31</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.grtorrent.com/index.php?page=signup" target="_blank">grtorrent.com</a></td>
+					<td><a href="index.php?action=showHistory&id=338" target="_self">view history</a></td>
+                    <td>2010-04-15 18:24:19</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.guiks.net/register" target="_blank">guiks.net</a></td>
+					<td><a href="index.php?action=showHistory&id=284" target="_self">view history</a></td>
+                    <td>2010-04-15 17:37:19</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.h264torrents.com/signup.php" target="_blank">h264torrents.com</a></td>
+					<td><a href="index.php?action=showHistory&id=229" target="_self">view history</a></td>
+                    <td>2010-04-15 18:21:54</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.h33t.com/account.php" target="_blank">h33t.com</a></td>
+					<td><a href="index.php?action=showHistory&id=257" target="_self">view history</a></td>
+                    <td>2010-04-15 18:17:20</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.hd-bits.ro/signup.php" target="_blank">hd-bits.ro</a></td>
+					<td><a href="index.php?action=showHistory&id=256" target="_self">view history</a></td>
+                    <td>2010-04-15 17:37:21</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://hd-torrents.org/account.php" target="_blank">hd-torrents.org</a></td>
+					<td><a href="index.php?action=showHistory&id=313" target="_self">view history</a></td>
+                    <td>2010-04-15 17:56:15</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://hdbits.org/signup.php" target="_blank">hdbits.org</a></td>
+					<td><a href="index.php?action=showHistory&id=48" target="_self">view history</a></td>
+                    <td>2010-04-15 17:45:47</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.hdchina.org/signup.php" target="_blank">hdchina.org</a></td>
+					<td><a href="index.php?action=showHistory&id=184" target="_self">view history</a></td>
+                    <td>2010-04-15 18:24:15</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.hdfrench.com/signup.php" target="_blank">hdfrench.com</a></td>
+					<td><a href="index.php?action=showHistory&id=142" target="_self">view history</a></td>
+                    <td>2010-04-15 17:53:15</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.hdme.eu/signup.php" target="_blank">hdme.eu</a></td>
+					<td><a href="index.php?action=showHistory&id=326" target="_self">view history</a></td>
+                    <td>2010-04-15 18:00:28</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://hdpre.com/signup.php" target="_blank">hdpre.com</a></td>
+					<td><a href="index.php?action=showHistory&id=307" target="_self">view history</a></td>
+                    <td>2010-04-15 17:35:03</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.hdsource.biz/signup.php" target="_blank">hdsource.biz</a></td>
+					<td><a href="index.php?action=showHistory&id=255" target="_self">view history</a></td>
+                    <td>2010-04-15 18:04:34</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.hdstar.org/signup.php" target="_blank">hdstar.org</a></td>
+					<td><a href="index.php?action=showHistory&id=312" target="_self">view history</a></td>
+                    <td>2010-04-15 17:45:12</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://hdvnbits.org/signup.php" target="_blank">hdvnbits.org</a></td>
+					<td><a href="index.php?action=showHistory&id=294" target="_self">view history</a></td>
+                    <td>2010-04-15 17:49:50</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.heaventracker.org/inv.php?lang=en" target="_blank">heaventracker.org</a></td>
+					<td><a href="index.php?action=showHistory&id=254" target="_self">view history</a></td>
+                    <td>2010-04-15 17:36:33</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.hermeticos.org/signup.php" target="_blank">hermeticos.org</a></td>
+					<td><a href="index.php?action=showHistory&id=172" target="_self">view history</a></td>
+                    <td>2010-04-15 18:14:44</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.horrorcharnel.kicks-ass.org/signup.php" target="_blank">horrorcharnel.kicks-ass.org</a></td>
+					<td><a href="index.php?action=showHistory&id=303" target="_self">view history</a></td>
+                    <td>2010-04-15 18:21:15</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.hungercity.org/signup.php" target="_blank">hungercity.org</a></td>
+					<td><a href="index.php?action=showHistory&id=180" target="_self">view history</a></td>
+                    <td>2010-04-15 17:34:14</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.ifyounotknow.com/signup.php" target="_blank">ifyounotknow.com</a></td>
+					<td><a href="index.php?action=showHistory&id=158" target="_self">view history</a></td>
+                    <td>2010-04-15 18:21:19</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.ilovetorrents.com/signup.php" target="_blank">ilovetorrents.com</a></td>
+					<td><a href="index.php?action=showHistory&id=28" target="_self">view history</a></td>
+                    <td>2010-04-15 18:16:08</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.indeep.biz/signup.php" target="_blank">indeep.biz</a></td>
+					<td><a href="index.php?action=showHistory&id=249" target="_self">view history</a></td>
+                    <td>2010-04-15 18:17:18</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.indietorrents.com/signup.php" target="_blank">indietorrents.com</a></td>
+					<td><a href="index.php?action=showHistory&id=13" target="_self">view history</a></td>
+                    <td>2010-04-15 18:24:30</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.iplay.ro/signup.php" target="_blank">iplay.ro</a></td>
+					<td><a href="index.php?action=showHistory&id=145" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:41</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.ipodnova.tv/account-signup.php" target="_blank">ipodnova.tv</a></td>
+					<td><a href="index.php?action=showHistory&id=75" target="_self">view history</a></td>
+                    <td>2010-04-15 17:36:36</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.iptorrents.com/signup.php" target="_blank">iptorrents.com</a></td>
+					<td><a href="index.php?action=showHistory&id=167" target="_self">view history</a></td>
+                    <td>2010-04-15 18:23:02</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.joompalace.com/index.php" target="_blank">joompalace.com</a></td>
+					<td><a href="index.php?action=showHistory&id=69" target="_self">view history</a></td>
+                    <td>2010-04-15 18:24:21</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://karagarga.net/signup.php" target="_blank">karagarga.net</a></td>
+					<td><a href="index.php?action=showHistory&id=126" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:40</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://killawaves.net/signup.php" target="_blank">killawaves.net</a></td>
+					<td><a href="index.php?action=showHistory&id=323" target="_self">view history</a></td>
+                    <td>2010-04-15 18:06:23</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.killawaves.org/signup.php" target="_blank">killawaves.org</a></td>
+					<td><a href="index.php?action=showHistory&id=346" target="_self">view history</a></td>
+                    <td>2010-04-15 17:45:13</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.kinozal.ws/TK/signup.php" target="_blank">kinozal.ws</a></td>
+					<td><a href="index.php?action=showHistory&id=118" target="_self">view history</a></td>
+                    <td>2010-04-15 18:22:18</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.kludd.com/signup.php" target="_blank">kludd.com</a></td>
+					<td><a href="index.php?action=showHistory&id=206" target="_self">view history</a></td>
+                    <td>2010-04-15 18:00:23</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://lasttorrents.org/signup.php" target="_blank">lasttorrents.org</a></td>
+					<td><a href="index.php?action=showHistory&id=324" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:38</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://leecherslair.com/signup.php" target="_blank">leecherslair.com</a></td>
+					<td><a href="index.php?action=showHistory&id=207" target="_self">view history</a></td>
+                    <td>2010-04-15 17:49:52</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.libble.com/signup.php" target="_blank">libble.com</a></td>
+					<td><a href="index.php?action=showHistory&id=29" target="_self">view history</a></td>
+                    <td>2010-04-15 18:03:18</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://libitina.net/signup.php" target="_blank">libitina.net</a></td>
+					<td><a href="index.php?action=showHistory&id=152" target="_self">view history</a></td>
+                    <td>2010-04-15 18:21:16</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.linuxmafia.net/signup.php" target="_blank">linuxmafia.net</a></td>
+					<td><a href="index.php?action=showHistory&id=101" target="_self">view history</a></td>
+                    <td>2010-04-15 17:40:43</td>
+                    <td><span style='color:red'>Offline</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://linuxtracker.org/index.php?page=signup" target="_blank">linuxtracker.org</a></td>
+					<td><a href="index.php?action=showHistory&id=258" target="_self">view history</a></td>
+                    <td>2010-04-15 17:56:11</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://lostfilm.tv/signup.php" target="_blank">lostfilm.tv</a></td>
+					<td><a href="index.php?action=showHistory&id=205" target="_self">view history</a></td>
+                    <td>2010-04-15 18:03:20</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.magiciantorrents.com/signup.php" target="_blank">magiciantorrents.com</a></td>
+					<td><a href="index.php?action=showHistory&id=125" target="_self">view history</a></td>
+                    <td>2010-04-15 17:49:07</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://masterstb.com/signup.php" target="_blank">masterstb.com</a></td>
+					<td><a href="index.php?action=showHistory&id=151" target="_self">view history</a></td>
+                    <td>2010-04-15 17:34:17</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.mazetorrents.net/register.php" target="_blank">mazetorrents.net</a></td>
+					<td><a href="index.php?action=showHistory&id=102" target="_self">view history</a></td>
+                    <td>2010-04-15 17:40:43</td>
+                    <td><span style='color:red'>Offline</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://medioteka.com/signup.php" target="_blank">medioteka.com</a></td>
+					<td><a href="index.php?action=showHistory&id=157" target="_self">view history</a></td>
+                    <td>2010-04-15 17:37:02</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.mega-bits.com/signup.php" target="_blank">mega-bits.com</a></td>
+					<td><a href="index.php?action=showHistory&id=149" target="_self">view history</a></td>
+                    <td>2010-04-15 17:34:16</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.mentol.ro/index.php?page=signup" target="_blank">mentol.ro</a></td>
+					<td><a href="index.php?action=showHistory&id=143" target="_self">view history</a></td>
+                    <td>2010-04-15 17:36:42</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://metal.iplay.ro/signup.php" target="_blank">metal.iplay.ro</a></td>
+					<td><a href="index.php?action=showHistory&id=204" target="_self">view history</a></td>
+                    <td>2010-04-15 18:21:21</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://metalbits.org/signup.php" target="_blank">metalbits.org</a></td>
+					<td><a href="index.php?action=showHistory&id=111" target="_self">view history</a></td>
+                    <td>2010-04-15 17:45:09</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="https://www.midnight-scene.com/signup.php" target="_blank">midnight-scene.com</a></td>
+					<td><a href="index.php?action=showHistory&id=333" target="_self">view history</a></td>
+                    <td>2010-04-15 18:23:43</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.midnight-torrents.com/signup.php" target="_blank">midnight-torrents.com</a></td>
+					<td><a href="index.php?action=showHistory&id=45" target="_self">view history</a></td>
+                    <td>2010-04-15 17:38:14</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://mma-central.org.uk/signup.php" target="_blank">mma-central.org.uk</a></td>
+					<td><a href="index.php?action=showHistory&id=265" target="_self">view history</a></td>
+                    <td>2010-04-15 17:36:27</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://mma-tracker.net/signup.php" target="_blank">mma-tracker.net</a></td>
+					<td><a href="index.php?action=showHistory&id=203" target="_self">view history</a></td>
+                    <td>2010-04-15 17:38:15</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://mp3nerds.org/signup.php" target="_blank">mp3nerds.org</a></td>
+					<td><a href="index.php?action=showHistory&id=178" target="_self">view history</a></td>
+                    <td>2010-04-15 18:22:21</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://music-vid.com/signup.php" target="_blank">mucis-vid.com</a></td>
+					<td><a href="index.php?action=showHistory&id=4" target="_self">view history</a></td>
+                    <td>2010-04-15 17:35:16</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.musicplace.lv/signup.php" target="_blank">musicplace.lv</a></td>
+					<td><a href="index.php?action=showHistory&id=248" target="_self">view history</a></td>
+                    <td>2010-04-15 17:53:17</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.mytorrent.tv/tracker/signup.php" target="_blank">mytorrent.tv</a></td>
+					<td><a href="index.php?action=showHistory&id=261" target="_self">view history</a></td>
+                    <td>2010-04-15 17:35:14</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.norbits.net/signup.php" target="_blank">norbits.net</a></td>
+					<td><a href="index.php?action=showHistory&id=194" target="_self">view history</a></td>
+                    <td>2010-04-15 18:00:21</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://nordic-t.org/signup.php" target="_blank">nordic-t.org</a></td>
+					<td><a href="index.php?action=showHistory&id=3" target="_self">view history</a></td>
+                    <td>2010-04-15 18:00:22</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://nordicbits.org/signup.php" target="_blank">nordicbits.org</a></td>
+					<td><a href="index.php?action=showHistory&id=186" target="_self">view history</a></td>
+                    <td>2010-04-15 18:24:26</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.novaro.info/signup.php" target="_blank">novaro.info</a></td>
+					<td><a href="index.php?action=showHistory&id=191" target="_self">view history</a></td>
+                    <td>2010-04-15 18:16:56</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.novaro.info/signup.php" target="_blank">novaro.info</a></td>
+					<td><a href="index.php?action=showHistory&id=192" target="_self">view history</a></td>
+                    <td>2010-04-15 18:07:02</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.noviteti.com/signup.php" target="_blank">noviteti.com</a></td>
+					<td><a href="index.php?action=showHistory&id=30" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:35</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://ntorrents.net/signup.php" target="_blank">ntorrents.net</a></td>
+					<td><a href="index.php?action=showHistory&id=127" target="_self">view history</a></td>
+                    <td>2010-04-15 17:34:13</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.nutorrent.com/register.php" target="_blank">nutorrent.com</a></td>
+					<td><a href="index.php?action=showHistory&id=202" target="_self">view history</a></td>
+                    <td>2010-04-15 18:14:45</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.opennetwork.ro/signup.php" target="_blank">opennetwork.ro</a></td>
+					<td><a href="index.php?action=showHistory&id=173" target="_self">view history</a></td>
+                    <td>2010-04-15 17:40:42</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.overtopropetorrents.com/signup.php?agree=yes&invitehash=" target="_blank">overtopropetorrents.com</a></td>
+					<td><a href="index.php?action=showHistory&id=304" target="_self">view history</a></td>
+                    <td>2010-04-15 17:49:55</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.ozone-torrents.org/signup.php" target="_blank">ozone-torrents.org</a></td>
+					<td><a href="index.php?action=showHistory&id=107" target="_self">view history</a></td>
+                    <td>2010-04-15 18:00:26</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="https://packme.in/signup.php" target="_blank">packme.in</a></td>
+					<td><a href="index.php?action=showHistory&id=351" target="_self">view history</a></td>
+                    <td>2010-04-15 17:49:54</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://btmusic.eu/account-signup.php" target="_blank">Pedros btmusic</a></td>
+					<td><a href="index.php?action=showHistory&id=290" target="_self">view history</a></td>
+                    <td>2010-04-15 18:17:17</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.pianosheets.org/signup.php" target="_blank">pianosheets.org</a></td>
+					<td><a href="index.php?action=showHistory&id=31" target="_self">view history</a></td>
+                    <td>2010-04-15 18:17:16</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.pinkytorrents.com/account-signup.php" target="_blank">pinkytorrents.com</a></td>
+					<td><a href="index.php?action=showHistory&id=225" target="_self">view history</a></td>
+                    <td>2010-04-15 18:03:11</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://piranha.excom.us/signup-complied.php" target="_blank">piranha.excom.us</a></td>
+					<td><a href="index.php?action=showHistory&id=174" target="_self">view history</a></td>
+                    <td>2010-04-15 17:40:43</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://piratethe.net/signup.php" target="_blank">Pirate The Net (PtN)</a></td>
+					<td><a href="index.php?action=showHistory&id=288" target="_self">view history</a></td>
+                    <td>2010-04-15 17:40:45</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.piratebits.org/signup.php" target="_blank">piratebits.org</a></td>
+					<td><a href="index.php?action=showHistory&id=32" target="_self">view history</a></td>
+                    <td>2010-04-15 17:44:14</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://piratefiles.se/signup.php" target="_blank">piratefiles.se</a></td>
+					<td><a href="index.php?action=showHistory&id=160" target="_self">view history</a></td>
+                    <td>2010-04-15 18:17:11</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.piratetorrents.nu/signup.php" target="_blank">piratetorrents.nu</a></td>
+					<td><a href="index.php?action=showHistory&id=238" target="_self">view history</a></td>
+                    <td>2010-04-15 18:00:28</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.pisexy.org/join.php" target="_blank">pisexy.org</a></td>
+					<td><a href="index.php?action=showHistory&id=33" target="_self">view history</a></td>
+                    <td>2010-04-15 17:56:16</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://polishbytes.net/signup.php" target="_blank">polishbytes.net</a></td>
+					<td><a href="index.php?action=showHistory&id=245" target="_self">view history</a></td>
+                    <td>2010-04-15 17:57:00</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://polishtracker.org/signup.php" target="_blank">polishtracker.org</a></td>
+					<td><a href="index.php?action=showHistory&id=325" target="_self">view history</a></td>
+                    <td>2010-04-15 18:05:34</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.pornbay.org/signup.php" target="_blank">pornbay.org</a></td>
+					<td><a href="index.php?action=showHistory&id=243" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:11</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.potuk.com/newforum/register.php?do=signup" target="_blank">PotUK</a></td>
+					<td><a href="index.php?action=showHistory&id=293" target="_self">view history</a></td>
+                    <td>2010-04-15 17:37:21</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.powerscene.org/signup.php" target="_blank">powerscene.org</a></td>
+					<td><a href="index.php?action=showHistory&id=215" target="_self">view history</a></td>
+                    <td>2010-04-15 18:14:14</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://pretome.net/signup.php" target="_blank">pretome.net</a></td>
+					<td><a href="index.php?action=showHistory&id=212" target="_self">view history</a></td>
+                    <td>2010-04-15 17:40:44</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.proaudiotorrents.org/signup.php" target="_blank">proaudiotorrents.org</a></td>
+					<td><a href="index.php?action=showHistory&id=77" target="_self">view history</a></td>
+                    <td>2010-04-15 18:03:17</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.psytorrents.info/account-signup.php" target="_blank">psytorrents.info</a></td>
+					<td><a href="index.php?action=showHistory&id=335" target="_self">view history</a></td>
+                    <td>2010-04-15 17:49:54</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.ptfiles.org/signupform.php" target="_blank">ptfiles.org</a></td>
+					<td><a href="index.php?action=showHistory&id=242" target="_self">view history</a></td>
+                    <td>2010-04-15 18:03:49</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://punkhc.dyndns.org/signup.php" target="_blank">punkhc.dyndns.org</a></td>
+					<td><a href="index.php?action=showHistory&id=11" target="_self">view history</a></td>
+                    <td>2010-04-15 17:56:12</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.puretna.com/signup.php" target="_blank">puretna.com</a></td>
+					<td><a href="index.php?action=showHistory&id=73" target="_self">view history</a></td>
+                    <td>2010-04-15 17:40:53</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.pussytorrents.org/signup.php" target="_blank">pussytorrents.org</a></td>
+					<td><a href="index.php?action=showHistory&id=176" target="_self">view history</a></td>
+                    <td>2010-04-15 18:05:34</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://rapthe.net/signup.php" target="_blank">rapthe.net</a></td>
+					<td><a href="index.php?action=showHistory&id=267" target="_self">view history</a></td>
+                    <td>2010-04-15 18:21:22</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://rarbg.com/account.php" target="_blank">rarbg.com</a></td>
+					<td><a href="index.php?action=showHistory&id=161" target="_self">view history</a></td>
+                    <td>2010-04-15 18:04:33</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.reload-paradise.net/account-signup.php" target="_blank">reload-paradise.net</a></td>
+					<td><a href="index.php?action=showHistory&id=263" target="_self">view history</a></td>
+                    <td>2010-04-15 18:05:55</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.revolutiontt.net/signup.php" target="_blank">revolutiontt.net</a></td>
+					<td><a href="index.php?action=showHistory&id=52" target="_self">view history</a></td>
+                    <td>2010-04-15 18:21:55</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://rmvbusters.pl/signup_key.php?lang=en" target="_blank">rmvbusters</a></td>
+					<td><a href="index.php?action=showHistory&id=291" target="_self">view history</a></td>
+                    <td>2010-04-15 18:00:23</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://rmvbusters.pl/signup_key.php" target="_blank">rmvbusters.pl</a></td>
+					<td><a href="index.php?action=showHistory&id=235" target="_self">view history</a></td>
+                    <td>2010-04-15 18:03:09</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.scaliwags.org/signup.php" target="_blank">scaliwags.org</a></td>
+					<td><a href="index.php?action=showHistory&id=148" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:42</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://scene-gold.info/signup.php" target="_blank">scene-gold.info</a></td>
+					<td><a href="index.php?action=showHistory&id=108" target="_self">view history</a></td>
+                    <td>2010-04-15 17:37:27</td>
+                    <td><span style='color:red'>Offline</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://scene-inspired.com/signup.php" target="_blank">scene-inspired.com</a></td>
+					<td><a href="index.php?action=showHistory&id=66" target="_self">view history</a></td>
+                    <td>2010-04-15 18:03:18</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.sceneaccess.org/signup.php" target="_blank">sceneaccess.org</a></td>
+					<td><a href="index.php?action=showHistory&id=228" target="_self">view history</a></td>
+                    <td>2010-04-15 17:40:44</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.scenebytes.cl/signup.php" target="_blank">scenebytes.cl</a></td>
+					<td><a href="index.php?action=showHistory&id=120" target="_self">view history</a></td>
+                    <td>2010-04-15 17:38:10</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.scenehd.org/signup" target="_blank">scenehd.org</a></td>
+					<td><a href="index.php?action=showHistory&id=259" target="_self">view history</a></td>
+                    <td>2010-04-15 17:45:03</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.sceneleech.org/signup.php" target="_blank">sceneleech.org</a></td>
+					<td><a href="index.php?action=showHistory&id=182" target="_self">view history</a></td>
+                    <td>2010-04-15 17:57:00</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://scenelife.net/signup.php" target="_blank">SceneLife (ScL)</a></td>
+					<td><a href="index.php?action=showHistory&id=287" target="_self">view history</a></td>
+                    <td>2010-04-15 18:23:43</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.scenetorrents.org/signup.php" target="_blank">scenetorrents.org</a></td>
+					<td><a href="index.php?action=showHistory&id=146" target="_self">view history</a></td>
+                    <td>2010-04-15 18:23:44</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.scenetuga.org/signup.php" target="_blank">scenetuga.org</a></td>
+					<td><a href="index.php?action=showHistory&id=100" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:37</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="https://sciencehd.net/signup.php" target="_blank">sciencehd.net</a></td>
+					<td><a href="index.php?action=showHistory&id=319" target="_self">view history</a></td>
+                    <td>2010-04-15 17:53:14</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://scifitorrents.net/account-signup.php" target="_blank">scifitorrents.net</a></td>
+					<td><a href="index.php?action=showHistory&id=275" target="_self">view history</a></td>
+                    <td>2010-04-15 17:45:16</td>
+                    <td><span style='color:red'>Offline</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.secret-cinema.net/register.php" target="_blank">secret-cinema.net</a></td>
+					<td><a href="index.php?action=showHistory&id=272" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:44</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.seductiongr.com/signup.php" target="_blank">seductiongr.com</a></td>
+					<td><a href="index.php?action=showHistory&id=347" target="_self">view history</a></td>
+                    <td>2010-04-15 18:22:20</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://seedgames.org/signup.php" target="_blank">seedgames.org</a></td>
+					<td><a href="index.php?action=showHistory&id=283" target="_self">view history</a></td>
+                    <td>2010-04-15 18:10:01</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.seedmore.org/signup.php" target="_blank">seedmore.org</a></td>
+					<td><a href="index.php?action=showHistory&id=109" target="_self">view history</a></td>
+                    <td>2010-04-15 17:49:07</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://sendthatshit.org/signup.php" target="_blank">sendthatshit.org</a></td>
+					<td><a href="index.php?action=showHistory&id=350" target="_self">view history</a></td>
+                    <td>2010-04-15 18:23:44</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.sharetorrents.pl/signup.php" target="_blank">sharetorrents.pl</a></td>
+					<td><a href="index.php?action=showHistory&id=35" target="_self">view history</a></td>
+                    <td>2010-04-15 17:34:13</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://sharing-torrents.com/account-signup.php" target="_blank">sharing-torrents.com</a></td>
+					<td><a href="index.php?action=showHistory&id=153" target="_self">view history</a></td>
+                    <td>2010-04-15 18:21:18</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.slosoul.net/signup.php" target="_blank">slosoul.net</a></td>
+					<td><a href="index.php?action=showHistory&id=244" target="_self">view history</a></td>
+                    <td>2010-04-15 17:35:19</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.snowtigers.net/account-signup.php" target="_blank">snowtigers.net</a></td>
+					<td><a href="index.php?action=showHistory&id=282" target="_self">view history</a></td>
+                    <td>2010-04-15 17:49:49</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.softmp3.org/signup.php?returnto=%2F" target="_blank">softmp3.org</a></td>
+					<td><a href="index.php?action=showHistory&id=223" target="_self">view history</a></td>
+                    <td>2010-04-15 18:14:44</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.softmupparna.net/signup.php" target="_blank">softmupparna.net</a></td>
+					<td><a href="index.php?action=showHistory&id=241" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:11</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.sounddamage.com/signup.php" target="_blank">sounddamage.com</a></td>
+					<td><a href="index.php?action=showHistory&id=104" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:25</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.spanishtracker.com/account.php" target="_blank">spanishtracker.com</a></td>
+					<td><a href="index.php?action=showHistory&id=71" target="_self">view history</a></td>
+                    <td>2010-04-15 17:37:27</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://spank-d-monkey.com/signup.php" target="_blank">spank-d-monkey.com</a></td>
+					<td><a href="index.php?action=showHistory&id=199" target="_self">view history</a></td>
+                    <td>2010-04-15 18:24:23</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="special.pwtorrents.net/signup.php" target="_blank">special.pwtorrents.net</a></td>
+					<td><a href="index.php?action=showHistory&id=50" target="_self">view history</a></td>
+                    <td>2010-04-15 18:17:19</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.speed.cd/signup.php" target="_blank">speed.cd</a></td>
+					<td><a href="index.php?action=showHistory&id=116" target="_self">view history</a></td>
+                    <td>2010-04-15 17:53:17</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://spiryt.ath.cx/signupsms.php" target="_blank">spiryt.ath.cx</a></td>
+					<td><a href="index.php?action=showHistory&id=189" target="_self">view history</a></td>
+                    <td>2010-04-15 17:49:49</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.sport-scene.net/signup.php" target="_blank">sport-scene.net</a></td>
+					<td><a href="index.php?action=showHistory&id=141" target="_self">view history</a></td>
+                    <td>2010-04-15 18:17:19</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.sportbit.org/signup.php" target="_blank">sportbit.org</a></td>
+					<td><a href="index.php?action=showHistory&id=76" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:09</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://sportleech.net/index.php?page=signup" target="_blank">sportleech.net</a></td>
+					<td><a href="index.php?action=showHistory&id=232" target="_self">view history</a></td>
+                    <td>2010-04-15 17:40:48</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.stmusic.org/signup.php" target="_blank">stmusic.org</a></td>
+					<td><a href="index.php?action=showHistory&id=299" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:23</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.supertorrents.org/signup.php" target="_blank">supertorrents.org</a></td>
+					<td><a href="index.php?action=showHistory&id=36" target="_self">view history</a></td>
+                    <td>2010-04-15 17:57:00</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.swebits.org/signup.php" target="_blank">swebits.org</a></td>
+					<td><a href="index.php?action=showHistory&id=37" target="_self">view history</a></td>
+                    <td>2010-04-15 17:49:54</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://sweninjaz.org/signup.php" target="_blank">sweninjaz.org</a></td>
+					<td><a href="index.php?action=showHistory&id=343" target="_self">view history</a></td>
+                    <td>2010-04-15 18:21:15</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.swep2p.org/signup.php" target="_blank">swep2p.org</a></td>
+					<td><a href="index.php?action=showHistory&id=163" target="_self">view history</a></td>
+                    <td>2010-04-15 17:37:25</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://swepiracy.org/signup.php" target="_blank">swepiracy.org</a></td>
+					<td><a href="index.php?action=showHistory&id=168" target="_self">view history</a></td>
+                    <td>2010-04-15 18:24:22</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://swetorrents.no-ip.org/signup.php" target="_blank">swetorrents.no-ip.org</a></td>
+					<td><a href="index.php?action=showHistory&id=38" target="_self">view history</a></td>
+                    <td>2010-04-15 17:35:10</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://taiphimhd.com/login.php?returnto=index.php" target="_blank">taiphimhd.com</a></td>
+					<td><a href="index.php?action=showHistory&id=342" target="_self">view history</a></td>
+                    <td>2010-04-15 17:40:49</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://tastetherainbow.ws/signup.php" target="_blank">tastetherainbow.ws</a></td>
+					<td><a href="index.php?action=showHistory&id=230" target="_self">view history</a></td>
+                    <td>2010-04-15 17:56:13</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.teamofgreekz.com/signup.php" target="_blank">teamofgreekz.com</a></td>
+					<td><a href="index.php?action=showHistory&id=344" target="_self">view history</a></td>
+                    <td>2010-04-15 18:23:46</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.tehconnection.eu/signup.php" target="_blank">tehconnection.eu</a></td>
+					<td><a href="index.php?action=showHistory&id=211" target="_self">view history</a></td>
+                    <td>2010-04-15 18:06:22</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://zombtracker.the-zomb.com/signup.php" target="_blank">the-zomb.com</a></td>
+					<td><a href="index.php?action=showHistory&id=43" target="_self">view history</a></td>
+                    <td>2010-04-15 17:38:13</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://thebox.bz/signup.php" target="_blank">thebox.bz</a></td>
+					<td><a href="index.php?action=showHistory&id=154" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:44</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://thedvdclub.org/signup.php" target="_blank">thedvdclub.org</a></td>
+					<td><a href="index.php?action=showHistory&id=65" target="_self">view history</a></td>
+                    <td>2010-04-15 17:49:50</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.thegt.net/signup.php" target="_blank">thegt.net</a></td>
+					<td><a href="index.php?action=showHistory&id=322" target="_self">view history</a></td>
+                    <td>2010-04-15 18:00:20</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://themixingbowl.org/signup.php" target="_blank">themixingbowl.org</a></td>
+					<td><a href="index.php?action=showHistory&id=14" target="_self">view history</a></td>
+                    <td>2010-04-15 17:38:10</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.theoccult.bz/signup.php" target="_blank">theoccult.bz</a></td>
+					<td><a href="index.php?action=showHistory&id=336" target="_self">view history</a></td>
+                    <td>2010-04-15 17:56:12</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://thepeerhub.com/signup.php" target="_blank">thepeerhub.com</a></td>
+					<td><a href="index.php?action=showHistory&id=201" target="_self">view history</a></td>
+                    <td>2010-04-15 18:24:16</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.theplace.bz/signup.php" target="_blank">theplace.bz</a></td>
+					<td><a href="index.php?action=showHistory&id=115" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:17</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.thepokerbay.org/signup.php" target="_blank">thepokerbay.org</a></td>
+					<td><a href="index.php?action=showHistory&id=67" target="_self">view history</a></td>
+                    <td>2010-04-15 17:36:33</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.thevault.bz/signup.php" target="_blank">thevault.bz</a></td>
+					<td><a href="index.php?action=showHistory&id=68" target="_self">view history</a></td>
+                    <td>2010-04-15 18:14:45</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://titaniumtorrents.net/account.php" target="_blank">titaniumtorrents.net</a></td>
+					<td><a href="index.php?action=showHistory&id=162" target="_self">view history</a></td>
+                    <td>2010-04-15 17:45:48</td>
+                    <td><span style='color:red'>Offline</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.tmtorrents.org/signup.php" target="_blank">tmtorrents.org</a></td>
+					<td><a href="index.php?action=showHistory&id=188" target="_self">view history</a></td>
+                    <td>2010-04-15 18:00:21</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://topbytes.net/login.php?returnto=%2F" target="_blank">topbytes.net</a></td>
+					<td><a href="index.php?action=showHistory&id=339" target="_self">view history</a></td>
+                    <td>2010-04-15 17:37:17</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://topbytes.net/login.php?returnto=%2F" target="_blank">topbytes.net</a></td>
+					<td><a href="index.php?action=showHistory&id=340" target="_self">view history</a></td>
+                    <td>2010-04-15 18:14:15</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.tophos.org/signup.php" target="_blank">tophos.org</a></td>
+					<td><a href="index.php?action=showHistory&id=121" target="_self">view history</a></td>
+                    <td>2010-04-15 18:24:22</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.torrent-damage.net/signup.php" target="_blank">torrent-damage.net</a></td>
+					<td><a href="index.php?action=showHistory&id=39" target="_self">view history</a></td>
+                    <td>2010-04-15 18:22:22</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.torrent.lt/v2/account-signup.php?returnto=%2Fv2%2F" target="_blank">torrent.it</a></td>
+					<td><a href="index.php?action=showHistory&id=198" target="_self">view history</a></td>
+                    <td>2010-04-15 18:24:16</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.torrent411.com/account-signup.php" target="_blank">torrent411.com</a></td>
+					<td><a href="index.php?action=showHistory&id=305" target="_self">view history</a></td>
+                    <td>2010-04-15 17:45:12</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.torrentbits.ro/signup.php" target="_blank">torrentbits.ro</a></td>
+					<td><a href="index.php?action=showHistory&id=155" target="_self">view history</a></td>
+                    <td>2010-04-15 17:37:20</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://torrentbully.com/account-signup.php" target="_blank">torrentbully.com</a></td>
+					<td><a href="index.php?action=showHistory&id=170" target="_self">view history</a></td>
+                    <td>2010-04-15 18:17:15</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://torrentdownloads.net/register/" target="_blank">torrentdownloads.net</a></td>
+					<td><a href="index.php?action=showHistory&id=276" target="_self">view history</a></td>
+                    <td>2010-04-15 18:05:55</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://torrentgaming.net/signup.php" target="_blank">torrentgaming.net</a></td>
+					<td><a href="index.php?action=showHistory&id=252" target="_self">view history</a></td>
+                    <td>2010-04-15 18:24:19</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.torrentgeeks.com/signup.php" target="_blank">torrentgeeks.com</a></td>
+					<td><a href="index.php?action=showHistory&id=217" target="_self">view history</a></td>
+                    <td>2010-04-15 18:17:20</td>
+                    <td><span style='color:red'>Offline</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.torrenthr.org/signup.php" target="_blank">torrenthr.org</a></td>
+					<td><a href="index.php?action=showHistory&id=250" target="_self">view history</a></td>
+                    <td>2010-04-15 18:24:16</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://torrentkings.org/signup.php" target="_blank">torrentkings.org</a></td>
+					<td><a href="index.php?action=showHistory&id=300" target="_self">view history</a></td>
+                    <td>2010-04-15 17:53:09</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.torrentleech.org/signup.php" target="_blank">torrentleech.org</a></td>
+					<td><a href="index.php?action=showHistory&id=15" target="_self">view history</a></td>
+                    <td>2010-04-15 18:22:46</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.torrentseed.org/signup.php" target="_blank">torrentseed.org</a></td>
+					<td><a href="index.php?action=showHistory&id=271" target="_self">view history</a></td>
+                    <td>2010-04-15 17:35:15</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.torrentsforall.net/signup.php" target="_blank">torrentsforall.net</a></td>
+					<td><a href="index.php?action=showHistory&id=46" target="_self">view history</a></td>
+                    <td>2010-04-15 17:45:47</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.torrentsmd.com/signup.php" target="_blank">torrentsmd.com</a></td>
+					<td><a href="index.php?action=showHistory&id=329" target="_self">view history</a></td>
+                    <td>2010-04-15 18:00:20</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.torrentvault.org/signup.php" target="_blank">torrentvault.org</a></td>
+					<td><a href="index.php?action=showHistory&id=221" target="_self">view history</a></td>
+                    <td>2010-04-15 17:40:51</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://torrentzilla.org/signup.php" target="_blank">torrentzilla.org</a></td>
+					<td><a href="index.php?action=showHistory&id=166" target="_self">view history</a></td>
+                    <td>2010-04-15 18:24:11</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://torrentzone.net/signup.php?agree=yes&invitehash=" target="_blank">torrentzone.net</a></td>
+					<td><a href="index.php?action=showHistory&id=328" target="_self">view history</a></td>
+                    <td>2010-04-15 17:45:04</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.totaltorrents.com/signup.php" target="_blank">totaltorrents.com</a></td>
+					<td><a href="index.php?action=showHistory&id=49" target="_self">view history</a></td>
+                    <td>2010-04-15 17:37:31</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.trancebits.com/signup.php" target="_blank">trancebits.com</a></td>
+					<td><a href="index.php?action=showHistory&id=164" target="_self">view history</a></td>
+                    <td>2010-04-15 18:05:34</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://trancebooster.net/signup.php" target="_blank">trancebooster.net</a></td>
+					<td><a href="index.php?action=showHistory&id=240" target="_self">view history</a></td>
+                    <td>2010-04-15 17:56:11</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.trancetraffic.com/signup.php" target="_blank">trancetraffic.com</a></td>
+					<td><a href="index.php?action=showHistory&id=40" target="_self">view history</a></td>
+                    <td>2010-04-15 17:37:18</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.tri-tavern.com/signup.php" target="_blank">tri-tavern.com</a></td>
+					<td><a href="index.php?action=showHistory&id=53" target="_self">view history</a></td>
+                    <td>2010-04-15 18:23:19</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://tribalmixes.com/signup.php" target="_blank">tribalmixes.com</a></td>
+					<td><a href="index.php?action=showHistory&id=12" target="_self">view history</a></td>
+                    <td>2010-04-15 18:20:39</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.tugaleech.com/signup.php" target="_blank">tugaleech.com</a></td>
+					<td><a href="index.php?action=showHistory&id=187" target="_self">view history</a></td>
+                    <td>2010-04-15 18:24:25</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://tunebully.com/account-signup.php" target="_blank">tunebully.com</a></td>
+					<td><a href="index.php?action=showHistory&id=171" target="_self">view history</a></td>
+                    <td>2010-04-15 17:49:08</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://tv.torrents.ro/signup.php" target="_blank">tv.torrents.ro</a></td>
+					<td><a href="index.php?action=showHistory&id=47" target="_self">view history</a></td>
+                    <td>2010-04-15 17:35:11</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://tvtorrents.com/signup.do" target="_blank">tvtorrents.com</a></td>
+					<td><a href="index.php?action=showHistory&id=95" target="_self">view history</a></td>
+                    <td>2010-04-15 17:38:02</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.ugstorrents.com/account-signup.php" target="_blank">ugstorrents.com</a></td>
+					<td><a href="index.php?action=showHistory&id=147" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:15</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.uknova.com/wsgi/signup" target="_blank">uknova.com</a></td>
+					<td><a href="index.php?action=showHistory&id=41" target="_self">view history</a></td>
+                    <td>2010-04-15 18:14:15</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.underground-gamer.com/signup.php" target="_blank">underground-gamer.com</a></td>
+					<td><a href="index.php?action=showHistory&id=42" target="_self">view history</a></td>
+                    <td>2010-04-15 17:49:06</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.victorrent.net/signup.php" target="_blank">victorrent.net</a></td>
+					<td><a href="index.php?action=showHistory&id=165" target="_self">view history</a></td>
+                    <td>2010-04-15 17:45:14</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.vortexnetwork.org/register.php" target="_blank">vortexnetwork.org</a></td>
+					<td><a href="index.php?action=showHistory&id=266" target="_self">view history</a></td>
+                    <td>2010-04-15 17:53:16</td>
+                    <td><span style='color:red'>Offline</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="https://www.waffles.fm/signup.php" target="_blank">waffles.fm</a></td>
+					<td><a href="index.php?action=showHistory&id=122" target="_self">view history</a></td>
+                    <td>2010-04-15 17:53:12</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://wantedfiles.ro/signup.php" target="_blank">wantedfiles.ro</a></td>
+					<td><a href="index.php?action=showHistory&id=169" target="_self">view history</a></td>
+                    <td>2010-04-15 17:49:07</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.warezbros.org/signup.php" target="_blank">warezbros.org</a></td>
+					<td><a href="index.php?action=showHistory&id=246" target="_self">view history</a></td>
+                    <td>2010-04-15 18:03:20</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://what.cd/register.php" target="_blank">what.cd</a></td>
+					<td><a href="index.php?action=showHistory&id=123" target="_self">view history</a></td>
+                    <td>2010-04-15 17:53:12</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.wild-bytes.org/signup1.php" target="_blank">wild-bytes.org</a></td>
+					<td><a href="index.php?action=showHistory&id=94" target="_self">view history</a></td>
+                    <td>2010-04-15 18:00:27</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.wolfbits.org/signup.php" target="_blank">wolfbits.org</a></td>
+					<td><a href="index.php?action=showHistory&id=93" target="_self">view history</a></td>
+                    <td>2010-04-15 18:14:09</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://worldboxingvideoarchive.com/signup.php" target="_blank">worldboxingvideoarchive.com</a></td>
+					<td><a href="index.php?action=showHistory&id=92" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:10</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.bt-pt.net/signup.php" target="_blank">www.bt-pt.net</a></td>
+					<td><a href="index.php?action=showHistory&id=332" target="_self">view history</a></td>
+                    <td>2010-04-15 18:09:45</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.llywot.com/signup.oho" target="_blank">www.llywot.com</a></td>
+					<td><a href="index.php?action=showHistory&id=330" target="_self">view history</a></td>
+                    <td>2010-04-15 17:53:13</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://www.xbitz.org/signup.php" target="_blank">xbitz.org</a></td>
+					<td><a href="index.php?action=showHistory&id=91" target="_self">view history</a></td>
+                    <td>2010-04-15 18:21:21</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.xider.hu/signup.php" target="_blank">xider.hu</a></td>
+					<td><a href="index.php?action=showHistory&id=181" target="_self">view history</a></td>
+                    <td>2010-04-15 18:05:34</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://xtremespeeds.net/signup.php?agree=yes&invitehash=" target="_blank">xtremespeeds.net</a></td>
+					<td><a href="index.php?action=showHistory&id=310" target="_self">view history</a></td>
+                    <td>2010-04-15 18:04:33</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.xtremewrestlingtorrents.net/signup.php" target="_blank">xtremewrestlingtorrents.net</a></td>
+					<td><a href="index.php?action=showHistory&id=89" target="_self">view history</a></td>
+                    <td>2010-04-15 18:00:27</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://xtremezone.ro/signup.php" target="_blank">xtremezone.ro</a></td>
+					<td><a href="index.php?action=showHistory&id=88" target="_self">view history</a></td>
+                    <td>2010-04-15 18:14:43</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.yuwabits.net/signup.php" target="_blank">yuwabits.net</a></td>
+					<td><a href="index.php?action=showHistory&id=87" target="_self">view history</a></td>
+                    <td>2010-04-15 17:45:17</td>
+                    <td><span style='color:green'>Open</span></td>                    
+                </tr> 
+				
+                <tr class="oddRow">
+                    <td></td>
+                    <td><a href="http://zanettetorrent.com/signup.php" target="_blank">zanettetorrent.com</a></td>
+					<td><a href="index.php?action=showHistory&id=327" target="_self">view history</a></td>
+                    <td>2010-04-15 18:17:12</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+                <tr class="evenRow">
+                    <td></td>
+                    <td><a href="http://www.zinebytes.org/signup.php" target="_blank">zinebytes.org</a></td>
+					<td><a href="index.php?action=showHistory&id=86" target="_self">view history</a></td>
+                    <td>2010-04-15 17:34:18</td>
+                    <td><span style='color:blue'>Closed</span></td>                    
+                </tr> 
+				
+            </table>
+            <br />
+        </div> <br><br>
+   <script type="text/javascript"><!--
+google_ad_client = "pub-5012981259786626";
+google_ad_width = 468;
+google_ad_height = 60;
+google_ad_format = "468x60_as";
+google_ad_type = "text_image";
+google_ad_channel ="";
+google_color_border = "e86100";
+google_color_bg = "FFFFFF";
+google_color_link = "e86100";
+google_color_url = "e86100";
+google_color_text = "015581";
+//--></script>
+    <script type="text/javascript"
+  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
+</script>
+ </div>
+ <script type="text/javascript">
+var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
+document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
+</script>
+
+
+<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+_uacct = "UA-5986905-12";
+urchinTracker();
+</script>
+</body>
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/01-basic.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/01-basic.js
new file mode 100644
index 0000000..7846898
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/01-basic.js
@@ -0,0 +1,61 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Basic test";
+exports.options = {
+	  handler: {}
+	, parser: {}
+};
+exports.html = "<html><title>The Title</title><body>Hello world</body></html>";
+exports.expected =
+	[ { raw: 'html'
+		  , data: 'html'
+		  , type: 'tag'
+		  , name: 'html'
+		  , children: 
+		     [ { raw: 'title'
+		       , data: 'title'
+		       , type: 'tag'
+		       , name: 'title'
+		       , children: [ { raw: 'The Title', data: 'The Title', type: 'text' } ]
+		       }
+		     , { raw: 'body'
+		       , data: 'body'
+		       , type: 'tag'
+		       , name: 'body'
+		       , children: 
+		          [ { raw: 'Hello world'
+		            , data: 'Hello world'
+		            , type: 'text'
+		            }
+		          ]
+		       }
+		     ]
+		  }
+		];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/02-single_tag_1.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/02-single_tag_1.js
new file mode 100644
index 0000000..1735b5e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/02-single_tag_1.js
@@ -0,0 +1,39 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Single Tag 1";
+exports.options = {
+	  handler: {}
+	, parser: {}
+};
+exports.html = "<br>text</br>";
+exports.expected =
+	[ { raw: 'br', data: 'br', type: 'tag', name: 'br' }
+	, { raw: 'text', data: 'text', type: 'text' }
+	];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/03-single_tag_2.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/03-single_tag_2.js
new file mode 100644
index 0000000..2e6e92c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/03-single_tag_2.js
@@ -0,0 +1,40 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Single Tag 2";
+exports.options = {
+	  handler: {}
+	, parser: {}
+};
+exports.html = "<br>text<br>";
+exports.expected =
+	[ { raw: 'br', data: 'br', type: 'tag', name: 'br' }
+	, { raw: 'text', data: 'text', type: 'text' }
+	, { raw: 'br', data: 'br', type: 'tag', name: 'br' }
+	];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/04-unescaped_in_script.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/04-unescaped_in_script.js
new file mode 100644
index 0000000..fb2cc3a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/04-unescaped_in_script.js
@@ -0,0 +1,56 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Unescaped chars in script";
+exports.options = {
+	  handler: {}
+	, parser: {}
+};
+exports.html = "<head><script language=\"Javascript\">var foo = \"<bar>\"; alert(2 > foo); var baz = 10 << 2; var zip = 10 >> 1; var yap = \"<<>>>><<\";</script></head>";
+exports.expected =
+[ { raw: 'head'
+  , data: 'head'
+  , type: 'tag'
+  , name: 'head'
+  , children: 
+     [ { raw: 'script language="Javascript"'
+       , data: 'script language="Javascript"'
+       , type: 'script'
+       , name: 'script'
+       , attribs: { language: 'Javascript' }
+       , children: 
+          [ { raw: 'var foo = "<bar>"; alert(2 > foo); var baz = 10 << 2; var zip = 10 >> 1; var yap = \"<<>>>><<\";'
+            , data: 'var foo = "<bar>"; alert(2 > foo); var baz = 10 << 2; var zip = 10 >> 1; var yap = \"<<>>>><<\";'
+            , type: 'text'
+            }
+          ]
+       }
+     ]
+  }
+];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/05-tags_in_comment.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/05-tags_in_comment.js
new file mode 100644
index 0000000..68a0779
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/05-tags_in_comment.js
@@ -0,0 +1,48 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Special char in comment";
+exports.options = {
+	  handler: {}
+	, parser: {}
+};
+exports.html = "<head><!-- commented out tags <title>Test</title>--></head>";
+exports.expected =
+[ { raw: 'head'
+  , data: 'head'
+  , type: 'tag'
+  , name: 'head'
+  , children: 
+     [ { raw: ' commented out tags <title>Test</title>'
+       , data: ' commented out tags <title>Test</title>'
+       , type: 'comment'
+       }
+     ]
+  }
+];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/06-comment_in_script.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/06-comment_in_script.js
new file mode 100644
index 0000000..2d04ec0
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/06-comment_in_script.js
@@ -0,0 +1,48 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Script source in comment";
+exports.options = {
+	  handler: {}
+	, parser: {}
+};
+exports.html = "<script><!--var foo = 1;--></script>";
+exports.expected =
+[ { raw: 'script'
+  , data: 'script'
+  , type: 'script'
+  , name: 'script'
+  , children: 
+     [ { raw: 'var foo = 1;'
+       , data: 'var foo = 1;'
+       , type: 'comment'
+       }
+     ]
+  }
+];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/07-unescaped_in_style.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/07-unescaped_in_style.js
new file mode 100644
index 0000000..563a64a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/07-unescaped_in_style.js
@@ -0,0 +1,49 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Unescaped chars in style";
+exports.options = {
+	  handler: {}
+	, parser: {}
+};
+exports.html = "<style type=\"text/css\">\n body > p\n	{ font-weight: bold; }</style>";
+exports.expected =
+[ { raw: 'style type="text/css"'
+  , data: 'style type="text/css"'
+  , type: 'style'
+  , name: 'style'
+  , attribs: { type: 'text/css' }
+  , children:
+     [ { raw: '\n body > p\n	{ font-weight: bold; }'
+       , data: '\n body > p\n	{ font-weight: bold; }'
+       , type: 'text'
+       }
+     ]
+  }
+];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/08-extra_spaces_in_tag.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/08-extra_spaces_in_tag.js
new file mode 100644
index 0000000..1767565
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/08-extra_spaces_in_tag.js
@@ -0,0 +1,49 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Extra spaces in tag";
+exports.options = {
+	  handler: {}
+	, parser: {}
+};
+exports.html = "<\n font	\n size='14' \n>the text<\n /	\nfont	 \n>";
+exports.expected =
+[ { raw: '\n font	\n size=\'14\' \n'
+  , data: 'font	\n size=\'14\''
+  , type: 'tag'
+  , name: 'font'
+  , attribs: { size: '14' }
+  , children:
+     [ { raw: 'the text'
+       , data: 'the text'
+       , type: 'text'
+       }
+     ]
+  }
+];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/09-unquoted_attrib.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/09-unquoted_attrib.js
new file mode 100644
index 0000000..da6bac7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/09-unquoted_attrib.js
@@ -0,0 +1,49 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Unquoted attributes";
+exports.options = {
+	  handler: {}
+	, parser: {}
+};
+exports.html = "<font size= 14>the text</font>";
+exports.expected =
+[ { raw: 'font size= 14'
+  , data: 'font size= 14'
+  , type: 'tag'
+  , name: 'font'
+  , attribs: { size: '14' }
+  , children:
+     [ { raw: 'the text'
+       , data: 'the text'
+       , type: 'text'
+       }
+     ]
+  }
+];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/10-singular_attribute.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/10-singular_attribute.js
new file mode 100644
index 0000000..6c22e1a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/10-singular_attribute.js
@@ -0,0 +1,43 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Singular attribute";
+exports.options = {
+	  handler: {}
+	, parser: {}
+};
+exports.html = "<option value='foo' selected>";
+exports.expected =
+[ { raw: 'option value=\'foo\' selected'
+  , data: 'option value=\'foo\' selected'
+  , type: 'tag'
+  , name: 'option'
+  , attribs: { value: 'foo', selected: 'selected' }
+  }
+];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/11-text_outside_tags.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/11-text_outside_tags.js
new file mode 100644
index 0000000..ae63136
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/11-text_outside_tags.js
@@ -0,0 +1,50 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Text outside tags";
+exports.options = {
+	  handler: {}
+	, parser: {}
+};
+exports.html = "Line one\n<br>\nline two";
+exports.expected =
+[ { raw: 'Line one\n'
+  , data: 'Line one\n'
+  , type: 'text'
+  }
+  , { raw: 'br'
+  , data: 'br'
+  , type: 'tag'
+  , name: 'br'
+  }
+  , { raw: '\nline two'
+  , data: '\nline two'
+  , type: 'text'
+  }
+];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/12-text_only.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/12-text_only.js
new file mode 100644
index 0000000..64fab9e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/12-text_only.js
@@ -0,0 +1,41 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Only text";
+exports.options = {
+	  handler: {}
+	, parser: {}
+};
+exports.html = "this is the text";
+exports.expected =
+[ { raw: 'this is the text'
+  , data: 'this is the text'
+  , type: 'text'
+  }
+];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/13-comment_in_text.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/13-comment_in_text.js
new file mode 100644
index 0000000..e201ef6
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/13-comment_in_text.js
@@ -0,0 +1,49 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Comment within text";
+exports.options = {
+	  handler: {}
+	, parser: {}
+};
+exports.html = "this is <!-- the comment --> the text";
+exports.expected =
+[ { raw: 'this is '
+  , data: 'this is '
+  , type: 'text'
+  }
+, { raw: ' the comment '
+  , data: ' the comment '
+  , type: 'comment'
+  }
+, { raw: ' the text'
+  , data: ' the text'
+  , type: 'text'
+  }
+];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/14-comment_in_text_in_script.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/14-comment_in_text_in_script.js
new file mode 100644
index 0000000..215a02e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/14-comment_in_text_in_script.js
@@ -0,0 +1,57 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Comment within text within script";
+exports.options = {
+	  handler: {}
+	, parser: {}
+};
+exports.html = "<script>this is <!-- the comment --> the text</script>";
+exports.expected =
+[ { raw: 'script'
+  , data: 'script'
+  , type: 'script'
+  , name: 'script'
+  , children:
+     [ { raw: 'this is '
+       , data: 'this is '
+       , type: 'text'
+       }
+       , { raw: ' the comment '
+       , data: ' the comment '
+       , type: 'comment'
+       }
+       , { raw: ' the text'
+       , data: ' the text'
+       , type: 'text'
+       }
+
+     ]
+  }
+];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/15-non-verbose.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/15-non-verbose.js
new file mode 100644
index 0000000..829fce4
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/15-non-verbose.js
@@ -0,0 +1,46 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Option 'verbose' set to 'false'";
+exports.options = {
+	  handler: { verbose: false }
+	, parser: {}
+};
+exports.html = "<\n font	\n size='14' \n>the text<\n /	\nfont	 \n>";
+exports.expected =
+[ { type: 'tag'
+  , name: 'font'
+  , attribs: { size: '14' }
+  , children:
+     [ { data: 'the text'
+       , type: 'text'
+       }
+     ]
+  }
+];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/16-ignore_whitespace.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/16-ignore_whitespace.js
new file mode 100644
index 0000000..68f4439
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/16-ignore_whitespace.js
@@ -0,0 +1,71 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Options 'ignoreWhitespace' set to 'true'";
+exports.options = {
+	  handler: { ignoreWhitespace: true }
+	, parser: {}
+};
+exports.html = "Line one\n<br> \t\n<br>\nline two<font>\n <br> x </font>";
+exports.expected =
+[ { raw: 'Line one\n'
+  , data: 'Line one\n'
+  , type: 'text'
+  }
+  , { raw: 'br'
+  , data: 'br'
+  , type: 'tag'
+  , name: 'br'
+  }
+  , { raw: 'br'
+  , data: 'br'
+  , type: 'tag'
+  , name: 'br'
+  }
+  , { raw: '\nline two'
+  , data: '\nline two'
+  , type: 'text'
+  }
+  , { raw: 'font'
+  , data: 'font'
+  , type: 'tag'
+  , name: 'font'
+  , children: 
+	[ { raw: 'br'
+  , data: 'br'
+  , type: 'tag'
+  , name: 'br'
+  }
+  , { raw: ' x '
+  , data: ' x '
+  , type: 'text'
+  }
+	  ]
+	}
+];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/17-xml_namespace.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/17-xml_namespace.js
new file mode 100644
index 0000000..562f26b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/17-xml_namespace.js
@@ -0,0 +1,38 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "XML Namespace";
+exports.options = {
+	  handler: {}
+	, parser: {}
+};
+exports.html = "<ns:tag>text</ns:tag>";
+exports.expected =
+	[ { raw: 'ns:tag', data: 'ns:tag', type: 'tag', name: 'ns:tag', children: [ { raw: 'text', data: 'text', type: 'text' } ] }
+	];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/18-enforce_empty_tags.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/18-enforce_empty_tags.js
new file mode 100644
index 0000000..3ea3757
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/18-enforce_empty_tags.js
@@ -0,0 +1,40 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Enforce empty tags";
+exports.options = {
+	  handler: {}
+	, parser: {}
+};
+exports.html = "<link>text</link>";
+exports.expected =
+	[
+		  { raw: 'link', data: 'link', type: 'tag', name: 'link' }
+		, { raw: 'text', data: 'text', type: 'text' }
+	];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/19-ignore_empty_tags.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/19-ignore_empty_tags.js
new file mode 100644
index 0000000..4f47a59
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/19-ignore_empty_tags.js
@@ -0,0 +1,41 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Ignore empty tags";
+exports.options = {
+	  handler: { enforceEmptyTags: false }
+	, parser: {}
+};
+exports.html = "<link>text</link>";
+exports.expected =
+	[
+		  { raw: 'link', data: 'link', type: 'tag', name: 'link', children: [
+		  	{ raw: 'text', data: 'text', type: 'text' }
+		  ] }
+	];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/20-rss.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/20-rss.js
new file mode 100644
index 0000000..52442d6
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/20-rss.js
@@ -0,0 +1,120 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "RSS (2.0)";
+exports.options = {
+	  handler: {}
+	, parser: {}
+};
+exports.type = "rss";
+//http://cyber.law.harvard.edu/rss/examples/rss2sample.xml
+exports.html = '<?xml version="1.0"?>\
+<rss version="2.0">\
+   <channel>\
+      <title>Liftoff News</title>\
+      <link>http://liftoff.msfc.nasa.gov/</link>\
+      <description>Liftoff to Space Exploration.</description>\
+      <language>en-us</language>\
+      <pubDate>Tue, 10 Jun 2003 04:00:00 GMT</pubDate>\
+\
+      <lastBuildDate>Tue, 10 Jun 2003 09:41:01 GMT</lastBuildDate>\
+      <docs>http://blogs.law.harvard.edu/tech/rss</docs>\
+      <generator>Weblog Editor 2.0</generator>\
+      <managingEditor>editor at example.com</managingEditor>\
+      <webMaster>webmaster at example.com</webMaster>\
+      <item>\
+\
+         <title>Star City</title>\
+         <link>http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp</link>\
+         <description>How do Americans get ready to work with Russians aboard the International Space Station? They take a crash course in culture, language and protocol at Russia\'s <a href="http://howe.iki.rssi.ru/GCTC/gctc_e.htm">Star City</a>.</description>\
+         <pubDate>Tue, 03 Jun 2003 09:39:21 GMT</pubDate>\
+         <guid>http://liftoff.msfc.nasa.gov/2003/06/03.html#item573</guid>\
+\
+      </item>\
+      <item>\
+         <description>Sky watchers in Europe, Asia, and parts of Alaska and Canada will experience a <a href="http://science.nasa.gov/headlines/y2003/30may_solareclipse.htm">partial eclipse of the Sun</a> on Saturday, May 31st.</description>\
+         <pubDate>Fri, 30 May 2003 11:06:42 GMT</pubDate>\
+         <guid>http://liftoff.msfc.nasa.gov/2003/05/30.html#item572</guid>\
+\
+      </item>\
+      <item>\
+         <title>The Engine That Does More</title>\
+         <link>http://liftoff.msfc.nasa.gov/news/2003/news-VASIMR.asp</link>\
+         <description>Before man travels to Mars, NASA hopes to design new engines that will let us fly through the Solar System more quickly.  The proposed VASIMR engine would do that.</description>\
+         <pubDate>Tue, 27 May 2003 08:37:32 GMT</pubDate>\
+         <guid>http://liftoff.msfc.nasa.gov/2003/05/27.html#item571</guid>\
+\
+      </item>\
+      <item>\
+         <title>Astronauts\' Dirty Laundry</title>\
+         <link>http://liftoff.msfc.nasa.gov/news/2003/news-laundry.asp</link>\
+         <description>Compared to earlier spacecraft, the International Space Station has many luxuries, but laundry facilities are not one of them.  Instead, astronauts have other options.</description>\
+         <pubDate>Tue, 20 May 2003 08:56:02 GMT</pubDate>\
+         <guid>http://liftoff.msfc.nasa.gov/2003/05/20.html#item570</guid>\
+\
+      </item>\
+   </channel>\
+</rss>';
+exports.expected = {
+	  type: "rss"
+	, id: ""
+ 	, title: "Liftoff News"
+	, link: "http://liftoff.msfc.nasa.gov/"
+	, description: "Liftoff to Space Exploration."
+	, updated: new Date("Tue, 10 Jun 2003 09:41:01 GMT")
+	, author: "editor at example.com"
+	, items: [
+		  {
+			  id: "http://liftoff.msfc.nasa.gov/2003/06/03.html#item573"
+			, title: "Star City"
+			, link: "http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp"
+			, description: "How do Americans get ready to work with Russians aboard the International Space Station? They take a crash course in culture, language and protocol at Russia's <a href=\"http://howe.iki.rssi.ru/GCTC/gctc_e.htm\">Star City</a>."
+			, pubDate: new Date("Tue, 03 Jun 2003 09:39:21 GMT")
+			}
+		, {
+			  id: "http://liftoff.msfc.nasa.gov/2003/05/30.html#item572"
+			, description: "Sky watchers in Europe, Asia, and parts of Alaska and Canada will experience a <a href=\"http://science.nasa.gov/headlines/y2003/30may_solareclipse.htm\">partial eclipse of the Sun</a> on Saturday, May 31st."
+			, pubDate: new Date("Fri, 30 May 2003 11:06:42 GMT")
+			}
+		, {
+			  id: "http://liftoff.msfc.nasa.gov/2003/05/27.html#item571"
+			, title: "The Engine That Does More"
+			, link: "http://liftoff.msfc.nasa.gov/news/2003/news-VASIMR.asp"
+			, description: "Before man travels to Mars, NASA hopes to design new engines that will let us fly through the Solar System more quickly.  The proposed VASIMR engine would do that."
+			, pubDate: new Date("Tue, 27 May 2003 08:37:32 GMT")
+			}
+		, {
+			 id: "http://liftoff.msfc.nasa.gov/2003/05/20.html#item570"
+			, title: "Astronauts' Dirty Laundry"
+			, link: "http://liftoff.msfc.nasa.gov/news/2003/news-laundry.asp"
+			, description: "Compared to earlier spacecraft, the International Space Station has many luxuries, but laundry facilities are not one of them.  Instead, astronauts have other options."
+			, pubDate: new Date("Tue, 20 May 2003 08:56:02 GMT")
+			}
+		]
+	};
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/21-atom.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/21-atom.js
new file mode 100644
index 0000000..4d8c279
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/21-atom.js
@@ -0,0 +1,80 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Atom (1.0)";
+exports.options = {
+	  handler: {}
+	, parser: {}
+};
+exports.type = "rss";
+//http://en.wikipedia.org/wiki/Atom_%28standard%29
+exports.html = '<?xml version="1.0" encoding="utf-8"?>\
+\
+<feed xmlns="http://www.w3.org/2005/Atom">\
+\
+	<title>Example Feed</title>\
+	<subtitle>A subtitle.</subtitle>\
+	<link href="http://example.org/feed/" rel="self" />\
+	<link href="http://example.org/" />\
+	<id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id>\
+	<updated>2003-12-13T18:30:02Z</updated>\
+	<author>\
+		<name>John Doe</name>\
+		<email>johndoe at example.com</email>\
+	</author>\
+\
+	<entry>\
+		<title>Atom-Powered Robots Run Amok</title>\
+		<link href="http://example.org/2003/12/13/atom03" />\
+		<link rel="alternate" type="text/html" href="http://example.org/2003/12/13/atom03.html"/>\
+		<link rel="edit" href="http://example.org/2003/12/13/atom03/edit"/>\
+		<id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>\
+		<updated>2003-12-13T18:30:02Z</updated>\
+		<summary>Some text.</summary>\
+	</entry>\
+\
+</feed>';
+exports.expected = {
+	  type: "atom"
+	, id: "urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6"
+ 	, title: "Example Feed"
+	, link: "http://example.org/feed/"
+	, description: "A subtitle."
+	, updated: new Date("2003-12-13T18:30:02Z")
+	, author: "johndoe at example.com"
+	, items: [
+		  {
+			  id: "urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a"
+			, title: "Atom-Powered Robots Run Amok"
+			, link: "http://example.org/2003/12/13/atom03"
+			, description: "Some text."
+			, pubDate: new Date("2003-12-13T18:30:02Z")
+			}
+		]
+	};
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/22-position_data.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/22-position_data.js
new file mode 100644
index 0000000..fcd7c90
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tests/22-position_data.js
@@ -0,0 +1,100 @@
+(function () {
+
+function RunningInNode () {
+	return(
+		(typeof require) == "function"
+		&&
+		(typeof exports) == "object"
+		&&
+		(typeof module) == "object"
+		&&
+		(typeof __filename) == "string"
+		&&
+		(typeof __dirname) == "string"
+		);
+}
+
+if (!RunningInNode()) {
+	if (!this.Tautologistics)
+		this.Tautologistics = {};
+	if (!this.Tautologistics.NodeHtmlParser)
+		this.Tautologistics.NodeHtmlParser = {};
+	if (!this.Tautologistics.NodeHtmlParser.Tests)
+		this.Tautologistics.NodeHtmlParser.Tests = [];
+	exports = {};
+	this.Tautologistics.NodeHtmlParser.Tests.push(exports);
+}
+
+exports.name = "Postion data";
+exports.options = {
+	  handler: {}
+	, parser: { includeLocation: true }
+};
+exports.html = "<html>\r\n\n\t<title>The Title</title><body>\nHello world\r\n\n</body>\n\n</html>";
+exports.expected = [
+	{
+		raw: 'html',
+		data: 'html',
+		type: 'tag',
+		name: 'html',
+		location: {
+			line: 1,
+			col: 1
+		},
+		children: [{
+			raw: '\r\n\n\t',
+			data: '\r\n\n\t',
+			type: 'text',
+			location: {
+				line: 1,
+				col: 7
+			}
+		}, {
+			raw: 'title',
+			data: 'title',
+			type: 'tag',
+			name: 'title',
+			location: {
+				line: 3,
+				col: 2
+			},
+			children: [{
+				raw: 'The Title',
+				data: 'The Title',
+				type: 'text',
+				location: {
+					line: 3,
+					col: 9
+				}
+			}]
+		}, {
+			raw: 'body',
+			data: 'body',
+			type: 'tag',
+			name: 'body',
+			location: {
+				line: 3,
+				col: 26
+			},
+			children: [{
+				raw: '\nHello world\r\n\n',
+				data: '\nHello world\r\n\n',
+				type: 'text',
+				location: {
+					line: 3,
+					col: 32
+				}
+			}]
+		}, {
+			raw: '\n\n',
+			data: '\n\n',
+			type: 'text',
+			location: {
+				line: 6,
+				col: 8
+			}
+		}]
+	}
+	];
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tmp/snippet.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tmp/snippet.js
new file mode 100644
index 0000000..be9ca16
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/tmp/snippet.js
@@ -0,0 +1,13 @@
+var sys = require("sys");
+var htmlparser = require("htmlparser");
+
+var html = "<html><body><p>foo</p></body></html>";
+
+var handler = new htmlparser.DefaultHandler(function(err, dom) {
+	if (err)
+		sys.debug("Error: " + err);
+	else
+		sys.debug(sys.inspect(dom, false, null));
+}, { enforceEmptyTags: true });
+var parser = new htmlparser.Parser(handler);
+parser.parseComplete(html);
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/utils_example.js b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/utils_example.js
new file mode 100644
index 0000000..d219de5
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/utils_example.js
@@ -0,0 +1,35 @@
+//node --prof --prof_auto profile.js
+//deps/v8/tools/mac-tick-processor v8.log
+var sys = require("sys");
+var htmlparser = require("./lib/htmlparser");
+
+var html = "<a>text a</a><b id='x'>text b</b><c class='y'>text c</c><d id='z' class='w'><e>text e</e></d><g class='g h i'>hhh</g><yy>hellow</yy><yy id='secondyy'>world</yy>";
+
+var handler = new htmlparser.DefaultHandler(function(err, dom) {
+	if (err) {
+		sys.debug("Error: " + err);
+	}
+	else {
+		sys.debug(sys.inspect(dom, false, null));
+		var id = htmlparser.DomUtils.getElementById("x", dom);
+		sys.debug("id: " + sys.inspect(id, false, null));
+		var class = htmlparser.DomUtils.getElements({ class: "y" }, dom);
+		sys.debug("class: " + sys.inspect(class, false, null));
+		var multiclass = htmlparser.DomUtils.getElements({ class: function (value) { return(value && value.indexOf("h") > -1); } }, dom);
+		sys.debug("multiclass: " + sys.inspect(multiclass, false, null));
+		var name = htmlparser.DomUtils.getElementsByTagName("a", dom);
+		sys.debug("name: " + sys.inspect(name, false, null));
+		var text = htmlparser.DomUtils.getElementsByTagType("text", dom);
+		sys.debug("text: " + sys.inspect(text, false, null));
+		var nested = htmlparser.DomUtils.getElements({ tag_name: "d", id: "z", class: "w" }, dom);
+		nested = htmlparser.DomUtils.getElementsByTagName("e", nested);
+		nested = htmlparser.DomUtils.getElementsByTagType("text", nested);
+		sys.debug("nested: " + sys.inspect(nested, false, null));
+		var double = htmlparser.DomUtils.getElementsByTagName("yy", dom);
+		sys.debug("double: " + sys.inspect(double, false, null));
+		var single = htmlparser.DomUtils.getElements( { tag_name: "yy", id: "secondyy" }, dom);
+		sys.debug("single: " + sys.inspect(single, false, null));
+	}
+}, { verbose: false });
+var parser = new htmlparser.Parser(handler);
+parser.parseComplete(html);
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/v8.log b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/v8.log
new file mode 100644
index 0000000..0650bfa
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/htmlparser/v8.log
@@ -0,0 +1,1956 @@
+shared-library,"/usr/local/bin/node",0x00002550,0x0020c7b6
+shared-library,"/usr/lib/libssl.0.9.7.dylib",0x90b7d8c0,0x90b9df42
+shared-library,"/usr/lib/libcrypto.0.9.7.dylib",0x9640e600,0x964a8c92
+shared-library,"/usr/lib/libSystem.B.dylib",0x9728e0a0,0x973c26d0
+shared-library,"/usr/lib/libstdc++.6.dylib",0x951b0fb4,0x951f8005
+shared-library,"/usr/lib/libgcc_s.1.dylib",0x901b5780,0x901bc71e
+shared-library,"/usr/lib/system/libmathCommon.A.dylib",0x976062b0,0x976071e7
+profiler,"begin",1
+tick,0x972e5c17,0xbfffed30,0x0,4
+tick,0xffff07c2,0xbfffea70,0x0,4
+tick,0x1ee853,0xbfffe690,0x0,4
+code-creation,Builtin,0x599f20,91,"CpuFeatures::Probe"
+code-creation,Stub,0x582100,126,"FastNewClosure"
+code-creation,Stub,0x5821a0,516,"CEntry"
+code-creation,Stub,0x582400,173,"NumberToString"
+code-creation,Stub,0x5824c0,186,"GenericBinaryOp"
+code-creation,Stub,0x5825a0,129,"FastNewContext"
+code-creation,Stub,0x582640,364,"GenericBinaryOp"
+code-creation,Stub,0x5827c0,1056,"StringAdd"
+code-creation,Stub,0x582c20,175,"JSEntry"
+code-creation,Stub,0x582d00,175,"JSEntry"
+code-creation,Stub,0x582de0,429,"Compare"
+code-creation,Stub,0x582fa0,69,"RecordWrite"
+code-creation,Stub,0x583000,186,"GenericBinaryOp"
+code-creation,Stub,0x5830e0,121,"GenericBinaryOp"
+code-creation,Stub,0x583160,399,"Compare"
+code-creation,Stub,0x583300,396,"Compare"
+code-creation,Stub,0x5834a0,522,"Compare"
+code-creation,Stub,0x5836c0,131,"CallFunction"
+code-creation,Builtin,0x583760,140,"A builtin from the snapshot"
+code-creation,Stub,0x583800,396,"Compare"
+code-creation,Stub,0x5839a0,152,"ToBoolean"
+code-creation,Stub,0x583a40,153,"FastCloneShallowArray"
+code-creation,Stub,0x583b00,395,"GenericBinaryOp"
+code-creation,Stub,0x583ca0,396,"GenericBinaryOp"
+code-creation,Stub,0x583e40,128,"CallFunction"
+code-creation,Stub,0x583ee0,131,"CallFunction"
+code-creation,Stub,0x584100,131,"CallFunction"
+code-creation,Stub,0x5841a0,454,"GenericBinaryOp"
+code-creation,Stub,0x584380,147,"FastCloneShallowArray"
+code-creation,Stub,0x584420,207,"StringCompare"
+code-creation,Stub,0x584500,396,"Compare"
+code-creation,Stub,0x5846a0,372,"GenericBinaryOp"
+code-creation,Stub,0x584840,720,"CEntry"
+code-creation,Stub,0x584b80,114,"ArgumentsAccess"
+code-creation,Stub,0x584c00,186,"GenericBinaryOp"
+code-creation,Stub,0x584ce0,529,"GenericBinaryOp"
+code-creation,Stub,0x584f00,396,"Compare"
+code-creation,Stub,0x5850a0,1099,"StringAdd"
+code-creation,Stub,0x585520,51,"StackCheck"
+code-creation,Stub,0x585560,126,"FastCloneShallowArray"
+code-creation,Stub,0x585600,325,"GenericBinaryOp"
+code-creation,Stub,0x585760,222,"ArgumentsAccess"
+code-creation,Stub,0x585860,492,"Compare"
+code-creation,Stub,0x585a60,138,"FastNewContext"
+code-creation,Stub,0x585b00,67,"CallFunction"
+code-creation,Stub,0x585b60,67,"CallFunction"
+code-creation,CallIC,0x585bc0,163,"A call IC from the snapshot"
+code-creation,CallIC,0x585c80,154,"A call IC from the snapshot"
+code-creation,CallIC,0x585d40,154,"A call IC from the snapshot"
+code-creation,Stub,0x585e00,67,"CallFunction"
+code-creation,Stub,0x585e60,67,"CallFunction"
+code-creation,CallIC,0x585ec0,163,"A call IC from the snapshot"
+code-creation,Stub,0x586100,154,"CallFunction"
+code-creation,CallIC,0x5861c0,154,"A call IC from the snapshot"
+code-creation,CallIC,0x586280,154,"A call IC from the snapshot"
+code-creation,CallIC,0x586340,154,"A call IC from the snapshot"
+code-creation,CallIC,0x586400,154,"A call IC from the snapshot"
+code-creation,CallIC,0x5864c0,154,"A call IC from the snapshot"
+code-creation,Stub,0x586580,67,"CallFunction"
+code-creation,CallIC,0x5865e0,154,"A call IC from the snapshot"
+code-creation,CallIC,0x5866a0,154,"A call IC from the snapshot"
+code-creation,CallIC,0x586760,154,"A call IC from the snapshot"
+code-creation,CallIC,0x586820,154,"A call IC from the snapshot"
+code-creation,Stub,0x5868e0,154,"CallFunction"
+code-creation,CallIC,0x5869a0,154,"A call IC from the snapshot"
+code-creation,CallIC,0x586a60,163,"A call IC from the snapshot"
+code-creation,CallIC,0x586b20,154,"A call IC from the snapshot"
+code-creation,CallIC,0x586be0,154,"A call IC from the snapshot"
+code-creation,CallIC,0x586ca0,163,"A call IC from the snapshot"
+code-creation,CallIC,0x586d60,163,"A call IC from the snapshot"
+code-creation,CallIC,0x586e20,154,"A call IC from the snapshot"
+code-creation,CallIC,0x586ee0,154,"A call IC from the snapshot"
+code-creation,Stub,0x586fa0,67,"CallFunction"
+code-creation,CallIC,0x587000,163,"A call IC from the snapshot"
+code-creation,CallIC,0x5870c0,154,"A call IC from the snapshot"
+code-creation,Stub,0x587180,154,"CallFunction"
+code-creation,CallIC,0x587240,154,"A call IC from the snapshot"
+code-creation,CallIC,0x587300,154,"A call IC from the snapshot"
+code-creation,CallIC,0x5873c0,154,"A call IC from the snapshot"
+code-creation,CallIC,0x587480,154,"A call IC from the snapshot"
+code-creation,Stub,0x587540,67,"CallFunction"
+code-creation,CallIC,0x5875a0,154,"A call IC from the snapshot"
+code-creation,CallIC,0x587660,163,"A call IC from the snapshot"
+code-creation,Stub,0x587720,67,"CallFunction"
+code-creation,CallIC,0x587780,163,"A call IC from the snapshot"
+code-creation,CallIC,0x587840,154,"A call IC from the snapshot"
+code-creation,Builtin,0x587900,135,"A builtin from the snapshot"
+code-creation,Builtin,0x587b00,386,"A builtin from the snapshot"
+code-creation,LoadIC,0x587da0,51,"A load IC from the snapshot"
+code-creation,Builtin,0x588ae0,97,"A builtin from the snapshot"
+code-creation,StoreIC,0x588b60,52,"A store IC from the snapshot"
+code-creation,Stub,0x589020,206,"CallFunction"
+code-creation,KeyedLoadIC,0x5896a0,51,"A keyed load IC from the snapshot"
+code-creation,KeyedStoreIC,0x58ad20,52,"A keyed store IC from the snapshot"
+code-creation,Builtin,0x590ea0,313,"A builtin from the snapshot"
+code-creation,Builtin,0x5976c0,45,"A builtin from the snapshot"
+code-creation,Builtin,0x597700,45,"A builtin from the snapshot"
+code-creation,Builtin,0x597740,45,"A builtin from the snapshot"
+code-creation,Builtin,0x597780,45,"A builtin from the snapshot"
+code-creation,Builtin,0x5977c0,45,"A builtin from the snapshot"
+code-creation,Builtin,0x597800,45,"A builtin from the snapshot"
+code-creation,Builtin,0x597840,45,"A builtin from the snapshot"
+code-creation,Builtin,0x597880,45,"A builtin from the snapshot"
+code-creation,Builtin,0x5978c0,45,"A builtin from the snapshot"
+code-creation,Builtin,0x597900,45,"A builtin from the snapshot"
+code-creation,Builtin,0x597940,48,"A builtin from the snapshot"
+code-creation,Builtin,0x597980,45,"A builtin from the snapshot"
+code-creation,Builtin,0x5979c0,48,"A builtin from the snapshot"
+code-creation,Builtin,0x597a00,45,"A builtin from the snapshot"
+code-creation,Builtin,0x597a40,45,"A builtin from the snapshot"
+code-creation,Builtin,0x597a80,359,"A builtin from the snapshot"
+code-creation,Builtin,0x597c00,125,"A builtin from the snapshot"
+code-creation,Builtin,0x597ca0,95,"A builtin from the snapshot"
+code-creation,Builtin,0x597d20,51,"A builtin from the snapshot"
+code-creation,Builtin,0x597d60,51,"A builtin from the snapshot"
+code-creation,Builtin,0x597da0,52,"A builtin from the snapshot"
+code-creation,Builtin,0x597de0,52,"A builtin from the snapshot"
+code-creation,LoadIC,0x597e20,51,"A load IC from the snapshot"
+code-creation,LoadIC,0x597e60,335,"A load IC from the snapshot"
+code-creation,LoadIC,0x597fc0,62,"A load IC from the snapshot"
+code-creation,LoadIC,0x598100,109,"A load IC from the snapshot"
+code-creation,LoadIC,0x598180,113,"A load IC from the snapshot"
+code-creation,LoadIC,0x598200,201,"A load IC from the snapshot"
+code-creation,KeyedLoadIC,0x5982e0,51,"A keyed load IC from the snapshot"
+code-creation,KeyedLoadIC,0x598320,643,"A keyed load IC from the snapshot"
+code-creation,KeyedLoadIC,0x5985c0,285,"A keyed load IC from the snapshot"
+code-creation,KeyedLoadIC,0x598700,139,"A keyed load IC from the snapshot"
+code-creation,KeyedLoadIC,0x5987a0,139,"A keyed load IC from the snapshot"
+code-creation,KeyedLoadIC,0x598840,139,"A keyed load IC from the snapshot"
+code-creation,KeyedLoadIC,0x5988e0,139,"A keyed load IC from the snapshot"
+code-creation,KeyedLoadIC,0x598980,196,"A keyed load IC from the snapshot"
+code-creation,KeyedLoadIC,0x598a60,199,"A keyed load IC from the snapshot"
+code-creation,KeyedLoadIC,0x598b40,174,"A keyed load IC from the snapshot"
+code-creation,KeyedLoadIC,0x598c00,109,"A keyed load IC from the snapshot"
+code-creation,StoreIC,0x598c80,117,"A store IC from the snapshot"
+code-creation,StoreIC,0x598d00,223,"A store IC from the snapshot"
+code-creation,KeyedStoreIC,0x598e00,267,"A keyed store IC from the snapshot"
+code-creation,KeyedStoreIC,0x598f20,189,"A keyed store IC from the snapshot"
+code-creation,KeyedStoreIC,0x599000,189,"A keyed store IC from the snapshot"
+code-creation,KeyedStoreIC,0x5990e0,193,"A keyed store IC from the snapshot"
+code-creation,KeyedStoreIC,0x5991c0,193,"A keyed store IC from the snapshot"
+code-creation,KeyedStoreIC,0x5992a0,219,"A keyed store IC from the snapshot"
+code-creation,KeyedStoreIC,0x5993a0,224,"A keyed store IC from the snapshot"
+code-creation,KeyedStoreIC,0x5994a0,172,"A keyed store IC from the snapshot"
+code-creation,Builtin,0x599560,291,"A builtin from the snapshot"
+code-creation,Builtin,0x5996a0,394,"A builtin from the snapshot"
+code-creation,Builtin,0x599860,401,"A builtin from the snapshot"
+code-creation,Builtin,0x599a20,122,"A builtin from the snapshot"
+code-creation,Builtin,0x599ac0,122,"A builtin from the snapshot"
+code-creation,LoadIC,0x599b60,146,"A load IC from the snapshot"
+code-creation,KeyedLoadIC,0x599c20,146,"A keyed load IC from the snapshot"
+code-creation,StoreIC,0x599ce0,158,"A store IC from the snapshot"
+code-creation,KeyedStoreIC,0x599dc0,158,"A keyed store IC from the snapshot"
+code-creation,Builtin,0x599ea0,33,"A builtin from the snapshot"
+code-creation,Builtin,0x599ee0,52,"A builtin from the snapshot"
+code-creation,Stub,0x599f20,91,"CallFunction"
+code-creation,Script,0x5879c0,214,"native json.js"
+code-creation,LazyCompile,0x587ca0,162,"SetupJSON native json.js:261"
+code-creation,Script,0x588100,632,"native string.js"
+code-creation,LazyCompile,0x588460,991,"SetupString native string.js:959"
+code-creation,LazyCompile,0x588940,312," native string.js:36"
+code-creation,Script,0x588ba0,349,"native regexp.js"
+code-creation,LazyCompile,0x588d80,247,"RegExpConstructor native regexp.js:84"
+code-creation,LazyCompile,0x588ee0,198,"RegExpCache native regexp.js:124"
+code-creation,LazyCompile,0x589100,136,"RegExpMakeCaptureGetter native regexp.js:409"
+code-creation,LazyCompile,0x5891e0,1017," native regexp.js:410"
+code-creation,LazyCompile,0x58a100,2059,"SetupRegExp native regexp.js:447"
+code-creation,LazyCompile,0x58ab20,164,"RegExpGetInput native regexp.js:466"
+code-creation,LazyCompile,0x58ac20,156,"RegExpSetInput native regexp.js:470"
+code-creation,LazyCompile,0x58ad60,71,"RegExpGetMultiline native regexp.js:491"
+code-creation,LazyCompile,0x58ade0,215,"RegExpSetMultiline native regexp.js:492"
+code-creation,LazyCompile,0x58af00,70,"NoOpSetter native regexp.js:500"
+code-creation,Script,0x58af80,1806,"native v8natives.js"
+code-creation,LazyCompile,0x58b8e0,903,"InstallFunctions native v8natives.js:49"
+code-creation,LazyCompile,0x58bd20,158,"InstallFunctionsOnHiddenPrototype native v8natives.js:67"
+code-creation,LazyCompile,0x58be20,254,"isFinite native v8natives.js:85"
+code-creation,LazyCompile,0x58c100,381,"SetupGlobal native v8natives.js:157"
+code-creation,LazyCompile,0x58c300,124,"hasOwnProperty native v8natives.js:221"
+code-creation,LazyCompile,0x58c3c0,338,"__defineGetter__ native v8natives.js:242"
+code-creation,LazyCompile,0x58c580,338,"__defineSetter__ native v8natives.js:261"
+code-creation,LazyCompile,0x58c740,528,"SetupObject native v8natives.js:724"
+code-creation,LazyCompile,0x58ca00,196,"SetupBoolean native v8natives.js:781"
+code-creation,LazyCompile,0x58cb20,664,"SetupNumber native v8natives.js:899"
+code-creation,LazyCompile,0x58cea0,1289,"NewFunction native v8natives.js:977"
+code-creation,LazyCompile,0x58d480,153,"SetupFunction native v8natives.js:1006"
+code-creation,LazyCompile,0x58d580,234," native v8natives.js:185"
+code-creation,LazyCompile,0x58d6c0,275," native v8natives.js:710"
+code-creation,LazyCompile,0x58d840,259," native v8natives.js:795"
+code-creation,Script,0x58d9a0,161,"native uri.js"
+code-creation,LazyCompile,0x58daa0,245,"SetupURI native uri.js:401"
+code-creation,Script,0x58dc00,179,"native apinatives.js"
+code-creation,Script,0x58dd20,469,"native runtime.js"
+code-creation,LazyCompile,0x58e100,1302,"EQUALS native runtime.js:54"
+code-creation,LazyCompile,0x58e6e0,290,"STRICT_EQUALS native runtime.js:96"
+code-creation,LazyCompile,0x58e860,825,"COMPARE native runtime.js:116"
+code-creation,LazyCompile,0x58ec40,513,"ADD native runtime.js:155"
+code-creation,LazyCompile,0x58eec0,381,"STRING_ADD_LEFT native runtime.js:175"
+code-creation,LazyCompile,0x58f0a0,398,"STRING_ADD_RIGHT native runtime.js:190"
+code-creation,LazyCompile,0x58f2a0,228,"SUB native runtime.js:206"
+code-creation,LazyCompile,0x58f3e0,228,"MUL native runtime.js:214"
+code-creation,LazyCompile,0x58f520,228,"DIV native runtime.js:222"
+code-creation,LazyCompile,0x58f660,228,"MOD native runtime.js:230"
+code-creation,LazyCompile,0x58f7a0,228,"BIT_OR native runtime.js:244"
+code-creation,LazyCompile,0x58f8e0,380,"BIT_AND native runtime.js:252"
+code-creation,LazyCompile,0x58fac0,228,"BIT_XOR native runtime.js:274"
+code-creation,LazyCompile,0x58fc00,154,"UNARY_MINUS native runtime.js:282"
+code-creation,LazyCompile,0x58fce0,154,"BIT_NOT native runtime.js:289"
+code-creation,LazyCompile,0x58fdc0,228,"SHL native runtime.js:296"
+code-creation,LazyCompile,0x590100,380,"SAR native runtime.js:304"
+code-creation,LazyCompile,0x5902e0,228,"SHR native runtime.js:326"
+code-creation,LazyCompile,0x590420,130,"DELETE native runtime.js:340"
+code-creation,LazyCompile,0x5904e0,458,"IN native runtime.js:346"
+code-creation,LazyCompile,0x590700,681,"INSTANCE_OF native runtime.js:358"
+code-creation,LazyCompile,0x590a40,84,"GET_KEYS native runtime.js:382"
+code-creation,LazyCompile,0x590ae0,193,"FILTER_KEY native runtime.js:390"
+code-creation,LazyCompile,0x590c00,566,"CALL_NON_FUNCTION native runtime.js:397"
+code-creation,LazyCompile,0x591000,566,"CALL_NON_FUNCTION_AS_CONSTRUCTOR native runtime.js:406"
+code-creation,LazyCompile,0x5912a0,1230,"APPLY_PREPARE native runtime.js:415"
+code-creation,LazyCompile,0x591820,189,"APPLY_OVERFLOW native runtime.js:451"
+code-creation,LazyCompile,0x591920,89,"TO_OBJECT native runtime.js:457"
+code-creation,LazyCompile,0x5919c0,89,"TO_NUMBER native runtime.js:463"
+code-creation,LazyCompile,0x591a60,89,"TO_STRING native runtime.js:469"
+code-creation,LazyCompile,0x591b00,500,"ToBoolean native runtime.js:493"
+code-creation,LazyCompile,0x591d60,384,"ToNumber native runtime.js:503"
+code-creation,LazyCompile,0x592100,374,"ToString native runtime.js:513"
+code-creation,LazyCompile,0x5922e0,412,"ToObject native runtime.js:530"
+code-creation,Script,0x5924e0,169,"native array.js"
+code-creation,LazyCompile,0x5925e0,1487,"SetupArray native array.js:1072"
+code-creation,LazyCompile,0x592d00,262,"getFunction native array.js:1084"
+code-creation,Script,0x592e60,424,"native math.js"
+code-creation,LazyCompile,0x5930a0,70,"MathConstructor native math.js:38"
+code-creation,LazyCompile,0x593120,883,"SetupMath native math.js:198"
+code-creation,Script,0x594100,2611,"native messages.js"
+code-creation,LazyCompile,0x594e80,219,"MakeGenericError native messages.js:106"
+code-creation,LazyCompile,0x594fc0,105,"MakeRangeError native messages.js:231"
+code-creation,LazyCompile,0x595080,316,"DefineOneShotAccessor native messages.js:626"
+code-creation,LazyCompile,0x595260,298," native messages.js:632"
+code-creation,LazyCompile,0x5953e0,185," native messages.js:640"
+code-creation,LazyCompile,0x5954e0,627,"DefineError native messages.js:896"
+code-creation,LazyCompile,0x595820,70,"ErrorPrototype native messages.js:912"
+code-creation,LazyCompile,0x5958a0,347," native messages.js:922"
+code-creation,LazyCompile,0x595a60,184," native messages.js:925"
+code-creation,LazyCompile,0x595b60,635,"captureStackTrace native messages.js:938"
+code-creation,LazyCompile,0x595e60,93," native messages.js:945"
+code-creation,LazyCompile,0x595f00,124," native messages.js:122"
+code-creation,LazyCompile,0x5958a0,347,"Error"
+code-creation,LazyCompile,0x5958a0,347,"TypeError"
+code-creation,LazyCompile,0x5958a0,347,"RangeError"
+code-creation,LazyCompile,0x5958a0,347,"SyntaxError"
+code-creation,LazyCompile,0x5958a0,347,"ReferenceError"
+code-creation,LazyCompile,0x5958a0,347,"EvalError"
+tick,0x972c429a,0xbfffeb7c,0x0,4
+code-creation,LazyCompile,0x5958a0,347,"URIError"
+code-creation,Script,0x596100,1054,"native date.js"
+code-creation,LazyCompile,0x596640,267,"TimeClip native date.js:365"
+code-creation,LazyCompile,0x5967c0,1231,"SetupDate native date.js:1065"
+code-creation,LazyCompile,0x596dc0,1946," native date.js:385"
+code-creation,LazyCompile,0x5976c0,45,""
+code-creation,LazyCompile,0x5976c0,45,""
+code-creation,LazyCompile,0x595f00,124,"Script"
+code-creation,LazyCompile,0x597900,45,"concat"
+code-creation,LazyCompile,0x5978c0,45,"splice"
+code-creation,LazyCompile,0x597800,45,"shift"
+code-creation,LazyCompile,0x597840,45,"unshift"
+code-creation,LazyCompile,0x5977c0,45,"pop"
+code-creation,LazyCompile,0x597780,45,"push"
+code-creation,LazyCompile,0x597880,45,"slice"
+code-creation,LazyCompile,0x5996a0,394,"Array"
+code-creation,LazyCompile,0x588d80,247,"RegExp"
+code-creation,LazyCompile,0x596dc0,1946,"Date"
+code-creation,LazyCompile,0x5976c0,45,"JSON"
+code-creation,LazyCompile,0x58d840,259,"Number"
+code-creation,LazyCompile,0x5976c0,45,"OpaqueReference"
+code-creation,LazyCompile,0x5976c0,45,""
+code-creation,LazyCompile,0x58d580,234,"Boolean"
+code-creation,LazyCompile,0x588940,312,"String"
+code-creation,LazyCompile,0x58cea0,1289,"Function"
+code-creation,LazyCompile,0x5976c0,45,""
+code-creation,LazyCompile,0x58d6c0,275,"Object"
+code-creation,LazyCompile,0x599560,291,"call"
+code-creation,LazyCompile,0x590ea0,313,"apply"
+code-creation,LazyCompile,0x597700,45,"Empty"
+code-creation,LazyCompile,0x5976c0,45,"Arguments"
+code-creation,LazyCompile,0x597a00,45,""
+code-creation,LazyCompile,0x597a40,45,""
+code-creation,LazyCompile,0x5976c0,45,""
+code-creation,LazyCompile,0x59a100,755,"Instantiate native apinatives.js:44"
+function-creation,0x560424,0x59a100
+code-creation,CallPreMonomorphic,0x59a480,154,"args_count: 2"
+tick,0x132fb0,0xbfffe8cc,0x0,0,0x59a2ad
+code-creation,Stub,0x59a520,153,"FastNewContextStub"
+code-creation,LazyCompile,0x59a5c0,2759,"InstantiateFunction native apinatives.js:62"
+function-creation,0x560a0c,0x59a5c0
+code-creation,Stub,0x59b200,396,"GenericBinaryOpStub_ADD_Alloc_NoSmiInStub_RegArgs_R_UnknownType_Default"
+code-creation,LazyCompile,0x59b3a0,1258,"ConfigureTemplateInstance native apinatives.js:93"
+function-creation,0x55e3b4,0x59b3a0
+code-creation,CallIC,0x59b960,89,"InstantiateFunction"
+code-creation,LoadIC,0x59b9c0,61,"kApiFunctionCache"
+code-creation,CallIC,0x59ba00,89,"ConfigureTemplateInstance"
+code-creation,CallIC,0x59ba60,112,"Instantiate"
+code-creation,CallIC,0x59bae0,89,"Instantiate"
+tick,0x17d255,0xbfffe790,0x0,2
+code-creation,Script,0x59bb40,99,"node.js"
+code-creation,Stub,0x59bbe0,147,"FastNewContextStub"
+code-creation,Function,0x59bc80,126," node.js:10"
+code-creation,Function,0x59bd40,135,"removed node.js:9"
+code-creation,Stub,0x59be20,135,"FastNewContextStub"
+code-creation,Function,0x59bec0,114,"timer.callback node.js:117"
+code-creation,Function,0x59c100,499,"addTimerListener node.js:112"
+code-creation,Stub,0x59c380,131,"CallFunction"
+code-creation,Function,0x59c420,316,"process.assert node.js:28"
+code-creation,Function,0x59c5c0,627,"process.evalcx node.js:33"
+code-creation,CallInitialize,0x59c8c0,154,"args_count: 0"
+code-creation,Stub,0x59c960,128,"CallFunction"
+code-creation,Stub,0x59ca00,294,"GenericBinaryOpStub_SUB_Alloc_RegArgs_NumberType_Default"
+code-creation,Function,0x59cb40,342,"process._tickCallback node.js:46"
+code-creation,Function,0x59cd00,114,"process.nextTick node.js:52"
+code-creation,Stub,0x59cdc0,132,"FastNewContextStub"
+code-creation,Function,0x59ce60,156,"isSignal node.js:73"
+tick,0x1b48fb,0xbfffd110,0x0,2
+code-creation,Function,0x59cf40,119,"w.callback node.js:84"
+code-creation,Function,0x59d000,812,"process.addListener node.js:78"
+code-creation,Function,0x59d400,1035,"process.removeListener node.js:97"
+code-creation,Function,0x59d8a0,380," node.js:68"
+code-creation,Function,0x59daa0,547,"global.setTimeout node.js:123"
+code-creation,Function,0x59e100,632,"global.setInterval node.js:130"
+code-creation,Stub,0x59e400,356,"Instanceof"
+code-creation,Function,0x59e580,124,"global.clearTimeout node.js:137"
+code-creation,Function,0x59e640,611," node.js:146"
+code-creation,Function,0x59e940,632,"process.openStdin node.js:169"
+code-creation,Function,0x59ec60,119,"process.exit node.js:190"
+code-creation,LazyCompile,0x59ed20,1934," node.js:1"
+function-creation,0x547e68,0x59ed20
+tick,0x97296f34,0xbfffea4c,0x0,3,0x4930,0x59f221
+tick,0xc0635,0xbfffe990,0x0,3,0x4930,0x59f221
+tick,0x1e1239,0xbfffd820,0x32b747,2,0x59f274
+code-creation,Script,0x59f720,99,"module"
+tick,0x208fa0,0xbfffda6c,0x0,2,0x59f28b
+code-creation,Stub,0x59f7c0,171,"FastNewContextStub"
+code-creation,Function,0x59f880,442,"Module module:8"
+code-creation,Function,0x59fae0,187,"createInternalModule module:26"
+code-creation,Function,0x59fc00,283,"loadNative module:39"
+code-creation,Function,0x59fd80,389,"requireNative module:48"
+code-creation,Function,0x5a0100,242,"debug module:67"
+code-creation,Function,0x5a0240,487,"existsSync module:78"
+code-creation,Stub,0x5a04a0,141,"FastNewContextStub"
+code-creation,Function,0x5a0540,215," module:156"
+code-creation,Function,0x5a0660,594,"searchLocations module:148"
+code-creation,Stub,0x5a0940,165,"FastCloneShallowArrayStub"
+code-creation,Stub,0x5a0a00,484,"GenericBinaryOpStub_ADD_Alloc_RegArgs_UnknownType_Default"
+code-creation,CallInitialize,0x5a0c00,154,"args_count: 3"
+code-creation,Stub,0x5a0ca0,454,"GenericBinaryOpStub_ADD_Alloc_RegArgs_R_NumberType_Default"
+code-creation,Function,0x5a0e80,2514,"findModulePath module:101"
+tick,0x20b613,0xbfffda94,0x0,2,0x59f28b
+code-creation,Function,0x5896e0,1533,"resolveModulePath module:178"
+code-creation,Function,0x5a1a00,335," module:247"
+code-creation,Function,0x5935a0,1423,"loadModule module:205"
+code-creation,Function,0x5a1bc0,401,"registerExtension module:274"
+code-creation,Function,0x5a1de0,273," module:334"
+code-creation,Function,0x59dd40,475,"cat module:332"
+code-creation,Stub,0x5a1f40,131,"CallFunction"
+code-creation,Function,0x587de0,406,"Module.loadSync module:287"
+code-creation,Function,0x593c40,414,"Module.load module:301"
+code-creation,Function,0x58ff00,139,"Module._loadObjectSync module:316"
+code-creation,Function,0x593e60,260,"Module._loadObject module:322"
+code-creation,Function,0x591f40,116,"requireAsync module:359"
+code-creation,Function,0x58bf60,107,"require module:363"
+code-creation,Stub,0x589e00,193,"CallFunction"
+code-creation,Stub,0x589ee0,171,"FastCloneShallowArrayStub"
+code-creation,Function,0x640100,1221,"Module._compile module:348"
+code-creation,Function,0x6406e0,271,"Module._loadScriptSync module:391"
+code-creation,Function,0x640860,315," module:413"
+code-creation,Function,0x640a00,516," module:404"
+code-creation,Function,0x640c80,287,"Module._loadScript module:402"
+code-creation,Function,0x640e00,375,"child.onload module:432"
+code-creation,Function,0x640fe0,1229,"Module._waitChildrenLoad module:424"
+code-creation,Function,0x641580,921,"exports.runMain module:445"
+tick,0x1e6941,0xbfffe828,0x322a0b,2,0x59f28b
+code-creation,LazyCompile,0x642100,3368," module:1"
+function-creation,0x54df30,0x642100
+code-creation,Script,0x643160,99,"events"
+code-creation,LazyCompile,0x643200,970," events:1"
+function-creation,0x558a04,0x643200
+code-creation,StoreIC,0x6436e0,118,"loaded"
+code-creation,KeyedStoreIC,0x643760,95,"events"
+code-creation,Stub,0x6437e0,273,"CompareStub_LT_NO_NUMBER"
+code-creation,Stub,0x643900,305,"GenericBinaryOpStub_SAR_Alloc_NoSmiInStub_StackArgs_UnknownType_Default"
+code-creation,Stub,0x643a40,305,"GenericBinaryOpStub_BIT_OR_Alloc_NoSmiInStub_StackArgs_UnknownType_Default"
+code-creation,LazyCompile,0x643b80,1005,"parseInt native v8natives.js:94"
+function-creation,0x55aca4,0x643b80
+tick,0xc32c0,0xbfffe4e0,0x0,1
+code-creation,Script,0x644100,99,"path"
+code-creation,StoreIC,0x6441a0,125,"id"
+code-creation,StoreIC,0x644240,125,"exports"
+code-creation,StoreIC,0x6442e0,125,"parent"
+code-creation,StoreIC,0x644380,125,"moduleCache"
+code-creation,LoadIC,0x644420,62,"moduleCache"
+code-creation,LoadIC,0x644460,62,"id"
+code-creation,StoreIC,0x6444a0,125,"filename"
+code-creation,StoreIC,0x644540,125,"loaded"
+code-creation,StoreIC,0x6445e0,125,"exited"
+code-creation,StoreIC,0x644680,125,"children"
+code-creation,LoadIC,0x644720,62,"exports"
+code-creation,Function,0x644760,183,"exports.join path:2"
+tick,0xffff07c7,0xbfffd9e0,0x2dc02,2,0x59fb53,0x6426b2,0x59f28b
+code-creation,Stub,0x644860,186,"GenericBinaryOpStub_SUB_Alloc_NoSmiInStub_RegArgs_UnknownType_Default"
+code-creation,Function,0x644920,2440,"exports.normalizeArray path:6"
+code-creation,Function,0x6453e0,131,"exports.normalize path:36"
+code-creation,Function,0x6454c0,382,"exports.dirname path:40"
+code-creation,Function,0x6456a0,124,"exports.filename path:57"
+code-creation,Stub,0x645760,325,"GenericBinaryOpStub_SUB_Alloc_RegArgs_UnknownType_Default"
+code-creation,Stub,0x6458c0,186,"GenericBinaryOpStub_MUL_Alloc_NoSmiInStub_RegArgs_UnknownType_Default"
+code-creation,Function,0x645980,705,"exports.basename path:60"
+code-creation,Function,0x645cc0,236,"exports.extname path:68"
+code-creation,Function,0x645e00,278," path:74"
+code-creation,Function,0x646100,192,"exports.exists path:73"
+code-creation,LazyCompile,0x646220,384," path:1"
+function-creation,0x558d50,0x646220
+code-creation,CallPreMonomorphic,0x646460,154,"args_count: 3"
+code-creation,CallInitialize,0x646500,154,"args_count: 4"
+code-creation,Stub,0x6465a0,256,"GenericBinaryOpStub_SHR_Alloc_NoSmiInStub_StackArgs_UnknownType_Default"
+code-creation,LazyCompile,0x6466c0,341,"join native array.js:361"
+function-creation,0x55ad68,0x6466c0
+code-creation,CallPreMonomorphic,0x646880,154,"args_count: 4"
+code-creation,Stub,0x646920,305,"GenericBinaryOpStub_SHL_Alloc_NoSmiInStub_StackArgs_UnknownType_Default"
+code-creation,LazyCompile,0x646a60,3789,"Join native array.js:100"
+function-creation,0x55e294,0x646a60
+code-creation,LazyCompile,0x647ae0,566,"UseSparseVariant native array.js:92"
+function-creation,0x55d98c,0x647ae0
+tick,0x85847,0xbfffe820,0x0,2,0x64542b,0x644804,0x642769,0x59f28b
+code-creation,Stub,0x647d80,403,"GenericBinaryOpStub_ADD_OverwriteRight_NoSmiInStub_RegArgs_UnknownType_Default"
+code-creation,Stub,0x648100,395,"GenericBinaryOpStub_ADD_Alloc_NoSmiInStub_RegArgs_UnknownType_Default"
+code-creation,LazyCompile,0x6482a0,3958,"split native string.js:587"
+function-creation,0x55f4c4,0x6482a0
+code-creation,LazyCompile,0x649440,332,"NonStringToString native runtime.js:521"
+function-creation,0x55e22c,0x649440
+code-creation,LazyCompile,0x6495e0,435,"DefaultString native runtime.js:617"
+function-creation,0x55e334,0x6495e0
+code-creation,LazyCompile,0x649820,329,"toString native string.js:48"
+function-creation,0x55e450,0x649820
+code-creation,LazyCompile,0x6499c0,198,"IsPrimitive native runtime.js:589"
+function-creation,0x55b560,0x6499c0
+code-creation,Stub,0x649ae0,69,"RecordWrite"
+code-creation,CallIC,0x649b40,276,"push"
+code-creation,LoadIC,0x649c80,61,"ConvertToString"
+code-creation,CallMiss,0x649cc0,154,"args_count: 4"
+code-creation,CallIC,0x649d60,89,"Join"
+code-creation,CallIC,0x649dc0,89,"UseSparseVariant"
+code-creation,LoadIC,0x649e20,61,"$Array"
+code-creation,CallPreMonomorphic,0x649e60,154,"args_count: 0"
+code-creation,LoadIC,0x649f00,73,"Array"
+code-creation,LoadIC,0x649f60,82,"join"
+code-creation,CallIC,0x64a100,99,"call"
+code-creation,LoadIC,0x64a180,62,"length"
+code-creation,CallIC,0x64a1c0,130,"normalize"
+code-creation,CallIC,0x64a260,150,"split"
+code-creation,CallIC,0x64a300,89,"NonStringToString"
+code-creation,CallIC,0x64a360,89,"DefaultString"
+code-creation,LoadIC,0x64a3c0,100,"toString"
+code-creation,CallMiss,0x64a440,154,"args_count: 0"
+code-creation,CallIC,0x64a4e0,112,"toString"
+code-creation,CallIC,0x64a560,89,"IsPrimitive"
+code-creation,CallIC,0x64a5c0,89,"ToString"
+code-creation,CallIC,0x64a620,130,"normalizeArray"
+code-creation,CallIC,0x64a6c0,112,"join"
+code-creation,LoadIC,0x64a740,61,"visited_arrays"
+code-creation,CallIC,0x64a780,179,"pop"
+code-creation,LazyCompile,0x64a840,696,"indexOf native string.js:109"
+function-creation,0x55e6f8,0x64a840
+tick,0x18153d,0xbfffe170,0x0,2,0x6416f7,0x59f3f9
+code-creation,LazyCompile,0x64aba0,595,"charAt native string.js:64"
+function-creation,0x55ac18,0x64aba0
+code-creation,LazyCompile,0x64ae60,2018,"DoConstructRegExp native regexp.js:35"
+function-creation,0x55fe70,0x64ae60
+code-creation,Stub,0x64b760,681,"RegExpExecStub"
+code-creation,LazyCompile,0x64c100,1848,"exec native regexp.js:186"
+function-creation,0x55c318,0x64c100
+code-creation,RegExp,0x64c9c0,670,"^http:\\/\\/"
+code-creation,StoreIC,0x64cc80,118,"lastIndex"
+code-creation,StoreIC,0x64cd00,118,"regExp"
+code-creation,StoreIC,0x64cd80,118,"subject"
+code-creation,StoreIC,0x64ce00,118,"answer"
+code-creation,StoreIC,0x64ce80,118,"answerSaved"
+code-creation,StoreIC,0x64cf00,118,"type"
+code-creation,StoreIC,0x64cf80,118,"filename"
+code-creation,CallIC,0x64d000,89,"DoConstructRegExp"
+code-creation,LazyCompile,0x64d060,803,"match native string.js:176"
+function-creation,0x55f5d0,0x64d060
+code-creation,LoadIC,0x64d460,61,"regExpCache"
+code-creation,LoadIC,0x64d4a0,62,"type"
+code-creation,LoadIC,0x64d4e0,62,"lastIndex"
+code-creation,LoadIC,0x64d520,62,"global"
+code-creation,LoadIC,0x64d560,61,"lastMatchInfo"
+code-creation,RegExp,0x64d5a0,580,"\\.node$"
+tick,0x1e11b0,0xbfffe49c,0x32b72f,2,0x6401c1,0x59fc90,0x59fee2,0x640730,0x587f35,0x6418db,0x59f3f9
+code-creation,LazyCompile,0x64d800,910,"replace native string.js:236"
+function-creation,0x55c464,0x64d800
+code-creation,LazyCompile,0x64dc60,425,"StringReplaceRegExp native string.js:278"
+function-creation,0x55e1d8,0x64dc60
+code-creation,RegExp,0x64e100,734,"^\\#\\!.*"
+code-creation,StoreIC,0x64e400,118,"replaceString"
+code-creation,LazyCompile,0x64e480,792,"lastIndexOf native string.js:127"
+function-creation,0x55cc9c,0x64e480
+tick,0x1e522c,0xbfffd3f0,0x32b747,2,0x64035f,0x59fc90,0x59fee2,0x640730,0x587f35,0x6418db,0x59f3f9
+code-creation,Script,0x64e840,99,"fs"
+tick,0x1e1bf9,0xbfffd850,0x32b72f,2,0x64055a,0x59fc90,0x59fee2,0x640730,0x587f35,0x6418db,0x59f3f9
+code-creation,Stub,0x64e8e0,322,"GenericBinaryOpStub_BIT_OR_Alloc_StackArgs_UnknownType_Default"
+code-creation,Stub,0x64ea40,334,"GenericBinaryOpStub_BIT_OR_OverwriteLeft_StackArgs_UnknownType_Default"
+code-creation,Function,0x64eba0,1116,"stringToFlags fs:107"
+code-creation,Function,0x64f0e0,70,"noop fs:123"
+code-creation,Function,0x64f160,186," fs:352"
+tick,0x12d43e,0xbfffd260,0x0,2,0x64055a,0x59fc90,0x59fee2,0x640730,0x587f35,0x6418db,0x59f3f9
+code-creation,Stub,0x64f260,131,"CallFunction"
+code-creation,Function,0x64f300,500," fs:350"
+code-creation,CallInitialize,0x64f580,154,"args_count: 5"
+code-creation,Function,0x64f620,352,"writeAll fs:349"
+code-creation,Stub,0x64f800,323,"GenericBinaryOpStub_BIT_AND_Alloc_StackArgs_UnknownType_Default"
+code-creation,Function,0x64f960,163,"fs.Stats._checkModeProperty fs:10"
+code-creation,Function,0x64fa40,110,"fs.Stats.isDirectory fs:14"
+code-creation,Function,0x64fb00,110,"fs.Stats.isFile fs:18"
+code-creation,Function,0x64fbc0,110,"fs.Stats.isBlockDevice fs:22"
+code-creation,Function,0x64fc80,110,"fs.Stats.isCharacterDevice fs:26"
+code-creation,Function,0x64fd40,110,"fs.Stats.isSymbolicLink fs:30"
+code-creation,Function,0x64fe00,110,"fs.Stats.isFIFO fs:34"
+code-creation,Function,0x64fec0,110,"fs.Stats.isSocket fs:38"
+code-creation,Stub,0x650100,193,"CallFunction"
+code-creation,Function,0x6501e0,1221," fs:59"
+code-creation,Function,0x650760,436,"doRead fs:53"
+code-creation,Function,0x650980,589," fs:48"
+code-creation,Function,0x650c60,351," fs:46"
+code-creation,Function,0x650e40,508,"fs.readFile fs:42"
+code-creation,Function,0x6510e0,1158,"fs.readFileSync fs:87"
+code-creation,Function,0x651640,232,"fs.close fs:128"
+code-creation,Function,0x651780,89,"fs.closeSync fs:132"
+code-creation,Function,0x651820,345,"fs.open fs:136"
+code-creation,Function,0x6519e0,199,"fs.openSync fs:141"
+code-creation,Function,0x651b00,336," fs:156"
+code-creation,Function,0x652100,802,"fs.read fs:146"
+code-creation,Function,0x6524e0,1791,"fs.readSync fs:170"
+tick,0xc7e67,0xbfffd800,0x0,2,0x64055a,0x59fc90,0x59fee2,0x640730,0x587f35,0x6418db,0x59f3f9
+code-creation,Function,0x652cc0,1692,"fs.write fs:194"
+code-creation,Function,0x653440,1349,"fs.writeSync fs:208"
+code-creation,Function,0x653a40,249,"fs.rename fs:221"
+code-creation,Function,0x653ba0,93,"fs.renameSync fs:225"
+code-creation,Function,0x653c40,249,"fs.truncate fs:229"
+code-creation,Function,0x653da0,93,"fs.truncateSync fs:233"
+code-creation,Function,0x653e40,232,"fs.rmdir fs:237"
+code-creation,Function,0x654100,89,"fs.rmdirSync fs:241"
+code-creation,Function,0x6541a0,232,"fs.fdatasync fs:245"
+code-creation,Function,0x6542e0,89,"fs.fdatasyncSync fs:249"
+code-creation,Function,0x654380,232,"fs.fsync fs:253"
+code-creation,Function,0x6544c0,89,"fs.fsyncSync fs:257"
+code-creation,Function,0x654560,249,"fs.mkdir fs:261"
+code-creation,Function,0x6546c0,93,"fs.mkdirSync fs:265"
+code-creation,Function,0x654760,270,"fs.sendfile fs:269"
+code-creation,Function,0x6548c0,101,"fs.sendfileSync fs:273"
+code-creation,Function,0x654980,232,"fs.readdir fs:277"
+code-creation,Function,0x654ac0,89,"fs.readdirSync fs:281"
+code-creation,Function,0x654b60,232,"fs.fstat fs:285"
+code-creation,Function,0x654ca0,232,"fs.lstat fs:289"
+code-creation,Function,0x654de0,232,"fs.stat fs:293"
+code-creation,Function,0x654f20,89,"fs.fstatSync fs:297"
+code-creation,Function,0x654fc0,89,"fs.lstatSync fs:301"
+code-creation,Function,0x655060,89,"fs.statSync fs:305"
+code-creation,Function,0x655100,232,"fs.readlink fs:309"
+code-creation,Function,0x655240,89,"fs.readlinkSync fs:313"
+code-creation,Function,0x6552e0,249,"fs.symlink fs:317"
+code-creation,Function,0x655440,93,"fs.symlinkSync fs:321"
+code-creation,Function,0x6554e0,249,"fs.link fs:325"
+code-creation,Function,0x655640,93,"fs.linkSync fs:329"
+code-creation,Function,0x6556e0,232,"fs.unlink fs:333"
+code-creation,Function,0x655820,89,"fs.unlinkSync fs:337"
+code-creation,Function,0x6558c0,249,"fs.chmod fs:341"
+code-creation,Function,0x655a20,93,"fs.chmodSync fs:345"
+code-creation,Function,0x655ac0,348," fs:369"
+code-creation,Function,0x655c80,513,"fs.writeFile fs:365"
+tick,0x148db9,0xbfffd7c0,0x0,2,0x64055a,0x59fc90,0x59fee2,0x640730,0x587f35,0x6418db,0x59f3f9
+code-creation,Function,0x656100,852,"fs.writeFileSync fs:378"
+code-creation,Function,0x656500,124,"fs.cat fs:389"
+code-creation,Function,0x6565c0,124,"fs.catSync fs:394"
+code-creation,Function,0x656680,1329,"fs.watchFile fs:402"
+code-creation,Function,0x656ca0,257,"fs.unwatchFile fs:429"
+code-creation,Stub,0x656e00,155,"GenericBinaryOpStub_SUB_Alloc_NoSmiInStub_RegArgs_NumberType_Default"
+code-creation,Function,0x658100,4474,"fs.realpathSync fs:443"
+code-creation,Stub,0x6594e0,156,"FastNewContextStub"
+code-creation,Function,0x659580,297,"done fs:511"
+code-creation,Function,0x65a100,2423," fs:532"
+code-creation,Function,0x65aba0,823," fs:525"
+code-creation,Function,0x65af80,770,"next fs:517"
+code-creation,Function,0x65b300,1321,"fs.realpath fs:499"
+code-creation,Function,0x65b940,99,"fs.createReadStream fs:570"
+code-creation,Function,0x65b9e0,270," fs:601"
+code-creation,Function,0x65c100,1143,"ReadStream.fs.ReadStream fs:574"
+tick,0x1481b2,0xbfffe3a0,0x0,2,0x64055a,0x59fc90,0x59fee2,0x640730,0x587f35,0x6418db,0x59f3f9
+code-creation,Function,0x65c6a0,88,"ReadStream.setEncoding fs:617"
+code-creation,Function,0x65c740,594," fs:629"
+code-creation,Function,0x65ca40,412,"ReadStream._read fs:621"
+code-creation,Function,0x65cc60,241,"ReadStream.forceClose fs:661"
+code-creation,Function,0x65cda0,400," fs:675"
+code-creation,Function,0x65cfa0,127,"close fs:674"
+code-creation,Function,0x65d080,364,"ReadStream.destroy fs:670"
+code-creation,Function,0x65d260,90,"ReadStream.pause fs:699"
+code-creation,Function,0x65d300,241,"ReadStream.resume fs:704"
+code-creation,Function,0x65d460,99,"fs.createWriteStream fs:717"
+code-creation,Function,0x65d500,1401,"WriteStream.fs.WriteStream fs:721"
+code-creation,Function,0x65e100,1204," fs:768"
+code-creation,Function,0x65e680,746,"WriteStream.flush fs:754"
+code-creation,Stub,0x65ea20,177,"FastCloneShallowArrayStub"
+code-creation,Function,0x65eae0,1843,"WriteStream.write fs:810"
+code-creation,Function,0x65f300,241,"WriteStream.close fs:837"
+code-creation,Function,0x65f440,288,"WriteStream.end fs:846"
+code-creation,Function,0x65f5c0,241,"WriteStream.forceClose fs:855"
+code-creation,Function,0x65f700,416," fs:866"
+code-creation,Function,0x65f920,213,"WriteStream.forceClose fs:864"
+code-creation,LazyCompile,0x724100,5226," fs:1"
+function-creation,0x559270,0x724100
+code-creation,CallIC,0x725bc0,147,"_compile"
+code-creation,CallIC,0x725c60,127,"replace"
+code-creation,CallIC,0x725d00,89,"StringReplaceRegExp"
+code-creation,LoadIC,0x725d60,62,"regExp"
+code-creation,CallIC,0x725da0,130,"extname"
+code-creation,CallIC,0x725e40,127,"lastIndexOf"
+code-creation,StoreIC,0x725ee0,88,"paths"
+code-creation,StoreIC,0x725f40,128,"async"
+code-creation,LoadIC,0x726100,73,"process"
+code-creation,StoreIC,0x726160,128,"main"
+code-creation,StoreIC,0x726200,88,"registerExtension"
+code-creation,CallNormal,0x726260,789,"args_count: 2"
+tick,0x17d3c8,0xbfffe1f0,0x0,0,0x64035f,0x59fc90,0x59385b,0x58bfb5,0x724219,0x64055a,0x59fc90,0x59fee2,0x640730,0x587f35,0x6418db,0x59f3f9
+code-creation,Script,0x7265a0,99,"sys"
+code-creation,CallIC,0x726640,130,"dirname"
+code-creation,CallIC,0x7266e0,94,"apply"
+code-creation,Stub,0x726760,150,"FastNewContextStub"
+code-creation,Function,0x726800,236,"pad sys:197"
+code-creation,Stub,0x726940,159,"FastCloneShallowArrayStub"
+code-creation,Function,0x726a00,686,"timestamp sys:204"
+code-creation,Function,0x726d40,644,"exports.print sys:3"
+code-creation,Function,0x727060,673,"exports.puts sys:9"
+code-creation,Function,0x7273a0,158,"exports.debug sys:15"
+code-creation,Function,0x7274a0,645,"error.exports.error sys:19"
+tick,0x20b60e,0xbfffd8d4,0x0,2,0x64055a,0x59fc90,0x59385b,0x58bfb5,0x724219,0x64055a,0x59fc90,0x59fee2,0x640730,0x587f35,0x6418db,0x59f3f9
+code-creation,Function,0x7277c0,94," sys:49"
+code-creation,Function,0x727860,94," sys:134"
+code-creation,Function,0x727900,94,"str.
+.str.split.
+.map.join.
+ sys:139"
+code-creation,Function,0x728100,2210," sys:106"
+code-creation,Stub,0x728b20,404,"GenericBinaryOpStub_ADD_OverwriteLeft_NoSmiInStub_RegArgs_R_UnknownType_Default"
+code-creation,Function,0x728cc0,470," sys:165"
+code-creation,Function,0x728f00,3033,"format sys:34"
+code-creation,Function,0x729ce0,369,"exports.inspect sys:32"
+code-creation,Function,0x72a100,798,"exports.p sys:187"
+code-creation,Function,0x72a4c0,189,"exports.log sys:212"
+code-creation,Function,0x72a5c0,607,"exports.exec sys:217"
+code-creation,Function,0x72a8a0,70,"tempCtor sys:239"
+code-creation,Function,0x72a920,206,"exports.inherits sys:238"
+code-creation,LazyCompile,0x72aa60,786," sys:1"
+function-creation,0x7051d8,0x72aa60
+code-creation,CallIC,0x72aea0,127,"charAt"
+code-creation,KeyedLoadIC,0x72af40,77,"events"
+code-creation,LoadIC,0x72afa0,62,"moduleCache"
+code-creation,LoadIC,0x72afe0,62,"replaceString"
+code-creation,LoadIC,0x72b020,62,"subject"
+code-creation,Script,0x72b060,99,"buffer"
+code-creation,Function,0x72b100,228,"toHex buffer:5"
+code-creation,Function,0x72b240,870,"Buffer.inspect buffer:10"
+tick,0x11ae55,0xbfffdb00,0x0,2,0x64055a,0x59fc90,0x59385b,0x58bfb5,0x7242bb,0x64055a,0x59fc90,0x59fee2,0x640730,0x587f35,0x6418db,0x59f3f9
+code-creation,Function,0x72b640,735,"Buffer.toString buffer:20"
+code-creation,Function,0x72b9c0,505,"Buffer.write buffer:41"
+code-creation,LazyCompile,0x72bc40,485," buffer:1"
+function-creation,0x7058d4,0x72bc40
+code-creation,LazyCompile,0x72c100,669,"ToPrimitive native runtime.js:481"
+function-creation,0x55d5f8,0x72c100
+code-creation,LazyCompile,0x72c400,516,"DefaultNumber native runtime.js:601"
+function-creation,0x55fca0,0x72c400
+code-creation,LazyCompile,0x72c680,86,"valueOf native v8natives.js:215"
+function-creation,0x5602a4,0x72c680
+code-creation,LazyCompile,0x72c720,86,"toString native v8natives.js:972"
+function-creation,0x55fe54,0x72c720
+code-creation,LazyCompile,0x72c7c0,516,"FunctionSourceString native v8natives.js:951"
+function-creation,0x55ac34,0x72c7c0
+code-creation,KeyedLoadIC,0x72ca40,77,"path"
+code-creation,StoreIC,0x72caa0,121,"forceClose"
+code-creation,CallPreMonomorphic,0x72cb20,154,"args_count: 5"
+code-creation,LazyCompile,0x72cbc0,152,"toLowerCase native string.js:776"
+function-creation,0x55dfc8,0x72cbc0
+code-creation,Stub,0x72cca0,217,"GenericBinaryOpStub_ADD_Alloc_RegArgs_UnknownType_Strings"
+code-creation,Stub,0x72cd80,436,"GenericBinaryOpStub_ADD_Alloc_RegArgs_UnknownType_Generic"
+code-creation,LoadIC,0x72cf40,59,"encoding"
+code-creation,CallMiss,0x72cf80,154,"args_count: 5"
+code-creation,CallIC,0x72d020,124,"read"
+tick,0x72b04f,0xbfffeb7c,0x55e1d8,0,0x64d90c,0x6401c1,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,LazyCompile,0x72d0c0,873,"substring native string.js:707"
+function-creation,0x55a570,0x72d0c0
+code-creation,Stub,0x72d4c0,889,"SubString"
+code-creation,LazyCompile,0x72d860,408,"SubString native string.js:214"
+function-creation,0x55ff60,0x72d860
+code-creation,Script,0x72da60,99,"/Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.getelement.js"
+code-creation,CallIC,0x72db00,89,"SubString"
+code-creation,Function,0x72db60,109,"getMillisecs /Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.getelement.js:10"
+code-creation,Function,0x72dc20,432,"timeExecutions /Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.getelement.js:14"
+code-creation,Function,0x72de20,189,"handler.htmlparser.DefaultHandler /Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.getelement.js:24"
+code-creation,Function,0x72e100,233," /Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.getelement.js:33"
+code-creation,LazyCompile,0x72e260,834," /Users/chris/Documents/workspace_3.5/NodeHtmlParser/profile.getelement.js:1"
+function-creation,0x707594,0x72e260
+code-creation,LazyCompile,0x72e6c0,302,"keys native v8natives.js:281"
+function-creation,0x55ccf0,0x72e6c0
+code-creation,LazyCompile,0x72e840,890,"substr native string.js:738"
+function-creation,0x55f50c,0x72e840
+code-creation,CallIC,0x72ec60,94,"exec"
+code-creation,RegExp,0x72ece0,932,"^index\\.(js|node)$"
+code-creation,LoadIC,0x72f0a0,61,"undefined"
+code-creation,CallIC,0x72f0e0,127,"substring"
+code-creation,LoadIC,0x72f180,62,"lastIndex"
+code-creation,RegExp,0x72f1c0,811,"^https?:\\/\\/"
+code-creation,RegExp,0x72f500,781,"\\.(js|node)$"
+tick,0xbc77a,0xbfffe080,0x0,3,0x18920,0x5a03f1,0x5a082a,0x5a179f,0x5939cc,0x58bfb5,0x72e378,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,LazyCompile,0x72f820,125,"CreateDate native apinatives.js:33"
+function-creation,0x55fd20,0x72f820
+code-creation,LazyCompile,0x72f8e0,343,"setTime native date.js:837"
+function-creation,0x55cb00,0x72f8e0
+code-creation,Stub,0x72faa0,165,"GenericUnaryOpStub_SUB_Alloc"
+code-creation,LazyCompile,0x72fb60,474,"abs native math.js:45"
+function-creation,0x55b418,0x72fb60
+code-creation,LazyCompile,0x72fda0,112,"ToInteger native runtime.js:542"
+function-creation,0x55fc30,0x72fda0
+code-creation,LoadIC,0x72fe60,61,"$Date"
+code-creation,CallIC,0x72fea0,112,"setTime"
+code-creation,CallIC,0x72ff20,89,"ToNumber"
+code-creation,CallIC,0x72ff80,89,"TimeClip"
+code-creation,CallIC,0x730100,89,"$isFinite"
+code-creation,CallIC,0x730160,89,"$abs"
+code-creation,CallIC,0x7301c0,89,"ToInteger"
+code-creation,CallIC,0x730220,89,"ToNumber"
+code-creation,LoadIC,0x730280,62,"loaded"
+code-creation,CallNormal,0x7302c0,789,"args_count: 1"
+code-creation,CallIC,0x730600,127,"match"
+code-creation,CallIC,0x7306a0,147,"_loadScriptSync"
+code-creation,CallIC,0x730740,124,"open"
+code-creation,CallNormal,0x7307e0,789,"args_count: 4"
+code-creation,LoadIC,0x730b20,73,"encoding"
+code-creation,CallIC,0x730b80,147,"toString"
+code-creation,CallIC,0x730c20,127,"toLowerCase"
+code-creation,CallIC,0x730cc0,141,"utf8Slice"
+code-creation,CallIC,0x730d60,89,"ToPrimitive"
+code-creation,CallIC,0x730dc0,124,"close"
+code-creation,CallIC,0x730e60,150,"substring"
+code-creation,Script,0x730f00,99,"/Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js"
+tick,0x1e2788,0xbfffc840,0x32b747,2,0x64035f,0x64075d,0x587f35,0x593ac5,0x58bfb5,0x72e378,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x1e1be0,0xbfffd2f0,0x32b72f,2,0x64055a,0x64075d,0x587f35,0x593ac5,0x58bfb5,0x72e378,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x1e1c00,0xbfffd1b0,0x32b72f,2,0x64055a,0x64075d,0x587f35,0x593ac5,0x58bfb5,0x72e378,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,Function,0x730fa0,405,"runningInNode /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:26"
+code-creation,Function,0x731180,126,"Parser /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:59"
+code-creation,Function,0x731260,141,"RssHandler /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:414"
+code-creation,Function,0x731340,609,"DefaultHandler /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:516"
+code-creation,Function,0x731660,70,"tempCtor /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:746"
+code-creation,Function,0x7316e0,206,"inherits /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:745"
+code-creation,Function,0x731820,169,"Parser$parseComplete /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:80"
+code-creation,Function,0x731920,310,"Parser$parseChunk /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:87"
+code-creation,Function,0x731ac0,975,"Parser$done /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:95"
+code-creation,Function,0x732100,356,"Parser$reset /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:120"
+code-creation,Function,0x732300,1097,"Parser$parseTagAttribs /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:150"
+code-creation,Function,0x7327e0,3615,"Parser$parseAttribs /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:164"
+code-creation,Function,0x7337e0,459,"Parser$parseTagName /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:193"
+tick,0x97298811,0xbfffd9fc,0xffffffff,2,0x64055a,0x64075d,0x587f35,0x593ac5,0x58bfb5,0x72e378,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x148336,0xbfffcc10,0x0,2,0x64055a,0x64075d,0x587f35,0x593ac5,0x58bfb5,0x72e378,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,Stub,0x733a20,495,"GenericBinaryOpStub_ADD_OverwriteLeft_RegArgs_UnknownType_Default"
+code-creation,Function,0x63a100,16845,"Parser$parseTags /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:204"
+code-creation,Function,0x734100,844,"Parser$validateHandler /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:365"
+code-creation,Function,0x734500,1733,"Parser$writeHandler /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:383"
+code-creation,Function,0x734d00,229,"Parser$handleError /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:406"
+code-creation,Stub,0x734e40,144,"FastNewContextStub"
+code-creation,Function,0x734ee0,151," /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:423"
+tick,0x161f3b,0xbfffd0f0,0x0,2,0x64055a,0x64075d,0x587f35,0x593ac5,0x58bfb5,0x72e378,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,Function,0x734fc0,1876," /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:448"
+code-creation,Function,0x736100,1866," /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:488"
+code-creation,Function,0x7369e0,4524,"RssHandler$done /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:419"
+code-creation,Function,0x738100,262,"DefaultHandler$_tagStack$last /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:559"
+code-creation,Function,0x738260,243,"DefaultHandler$reset /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:555"
+code-creation,Function,0x7383c0,156,"DefaultHandler$done /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:564"
+code-creation,Function,0x7384a0,135,"DefaultHandler$writeTag /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:568"
+code-creation,Function,0x738580,344,"DefaultHandler$writeText /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:571"
+code-creation,Function,0x738740,135,"DefaultHandler$writeComment /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:577"
+code-creation,Function,0x738820,135,"DefaultHandler$writeDirective /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:580"
+code-creation,Function,0x738900,135,"DefaultHandler$error /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:583"
+code-creation,Function,0x7389e0,292,"DefaultHandler$handleCallback /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:594"
+code-creation,Function,0x738b60,4255,"DefaultHandler$handleElement /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:602"
+tick,0xd8438,0xbfffca80,0x6e36e3,2,0x64055a,0x64075d,0x587f35,0x593ac5,0x58bfb5,0x72e378,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,Function,0x73a100,1239,"DomUtils$testElement /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:658"
+code-creation,Function,0x73a6c0,135," /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:697"
+code-creation,Function,0x73a780,135,"getTest /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:695"
+tick,0x103504,0xbfffccd0,0xffffffff,2,0x64055a,0x64075d,0x587f35,0x593ac5,0x58bfb5,0x72e378,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,Stub,0x73a860,273,"CompareStub_GE_NO_NUMBER"
+code-creation,Function,0x73a980,2470,"DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:684"
+code-creation,Function,0x73b4a0,293,"DomUtils$getElementById /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:731"
+code-creation,Function,0x73b620,193,"DomUtils$getElementsByTagName /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:736"
+code-creation,Function,0x73b740,193,"DomUtils$getElementsByTagType /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:740"
+code-creation,Function,0x73c100,3411," /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:24"
+code-creation,LazyCompile,0x73d220,424," /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.js:1"
+function-creation,0x7077f0,0x73d220
+code-creation,LoadIC,0x73d460,61,"StringCharAt"
+code-creation,CallIC,0x73d4a0,99,"call"
+code-creation,CallIC,0x73d520,89,"ToObject"
+code-creation,LoadIC,0x73d580,61,"$String"
+code-creation,StoreIC,0x73d5c0,88,"super_"
+code-creation,StoreIC,0x73d620,118,"testElement"
+code-creation,StoreIC,0x73d6a0,118,"getElements"
+code-creation,StoreIC,0x73d720,118,"getElementById"
+code-creation,StoreIC,0x73d7a0,118,"getElementsByTagName"
+code-creation,StoreIC,0x73d820,118,"getElementsByTagType"
+code-creation,LoadIC,0x73d8a0,73,"Object"
+code-creation,CallIC,0x73d900,76,"keys"
+code-creation,LoadIC,0x73d960,62,"id"
+code-creation,LoadIC,0x73d9a0,62,"filename"
+code-creation,CallIC,0x73d9e0,130,"basename"
+code-creation,CallIC,0x73da80,150,"substr"
+code-creation,LoadIC,0x73db20,73,"RegExp"
+code-creation,CallIC,0x73db80,130,"join"
+code-creation,LoadIC,0x73dc20,82,"constructor"
+code-creation,CallIC,0x73dc80,117,"slice"
+code-creation,CallIC,0x73dd00,130,"join"
+code-creation,CallIC,0x73dda0,117,"shift"
+code-creation,CallIC,0x73de20,124,"stat"
+code-creation,CallIC,0x73dec0,147,"loadSync"
+code-creation,KeyedLoadIC,0x73df60,77,"fs"
+tick,0x972d01fa,0xbfffe8cc,0x320ac7,3,0x17450,0x6529f6,0x6513c1,0x640744,0x587f35,0x593ac5,0x58bfb5,0x72e3c9,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x1e1bf0,0xbfffd9c0,0x32b72f,2,0x64035f,0x64075d,0x587f35,0x593ac5,0x58bfb5,0x72e3c9,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,Script,0x73e100,99,"/Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js"
+tick,0x1e1c17,0xbfffc460,0x32b72f,2,0x64055a,0x64075d,0x587f35,0x593ac5,0x58bfb5,0x72e3c9,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,Function,0x73e1a0,405,"runningInNode /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:25"
+code-creation,Function,0x73e380,126,"Parser /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:58"
+code-creation,Function,0x73e460,141,"RssHandler /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:413"
+code-creation,Function,0x73e540,609,"DefaultHandler /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:517"
+code-creation,Function,0x73e860,70,"tempCtor /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:737"
+code-creation,Function,0x73e8e0,206,"inherits /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:736"
+code-creation,Function,0x73ea20,169,"Parser$parseComplete /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:79"
+tick,0xffff07e3,0xbfffcfec,0x15,2,0x64055a,0x64075d,0x587f35,0x593ac5,0x58bfb5,0x72e3c9,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,Function,0x73eb20,310,"Parser$parseChunk /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:86"
+code-creation,Function,0x73ecc0,975,"Parser$done /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:94"
+code-creation,Function,0x73f180,356,"Parser$reset /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:119"
+code-creation,Function,0x73f380,1097,"Parser$parseTagAttribs /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:149"
+code-creation,Function,0x740100,3615,"Parser$parseAttribs /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:163"
+code-creation,Function,0x741100,459,"Parser$parseTagName /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:192"
+tick,0x161c14,0xbfffd2b0,0x0,2,0x64055a,0x64075d,0x587f35,0x593ac5,0x58bfb5,0x72e3c9,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,Function,0x750100,16845,"Parser$parseTags /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:203"
+code-creation,Function,0x741340,844,"Parser$validateHandler /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:364"
+code-creation,Function,0x741740,1733,"Parser$writeHandler /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:382"
+code-creation,Function,0x742100,229,"Parser$handleError /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:405"
+code-creation,Function,0x742240,151," /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:422"
+code-creation,Function,0x742320,1876," /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:449"
+code-creation,Function,0x742c00,1866," /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:489"
+tick,0xc55c2,0xbfffce40,0x6e2c5b,2,0x64055a,0x64075d,0x587f35,0x593ac5,0x58bfb5,0x72e3c9,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,Function,0x756100,4524,"RssHandler$done /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:418"
+code-creation,Function,0x757640,262,"DefaultHandler$_tagStack$last /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:560"
+code-creation,Function,0x7577a0,243,"DefaultHandler$reset /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:556"
+code-creation,Function,0x757900,156,"DefaultHandler$done /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:565"
+code-creation,Function,0x7579e0,135,"DefaultHandler$writeTag /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:569"
+code-creation,Function,0x757ac0,344,"DefaultHandler$writeText /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:572"
+code-creation,Function,0x757c80,135,"DefaultHandler$writeComment /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:578"
+code-creation,Function,0x757d60,135,"DefaultHandler$writeDirective /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:581"
+code-creation,Function,0x757e40,135,"DefaultHandler$error /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:584"
+code-creation,Function,0x758100,292,"DefaultHandler$handleCallback /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:595"
+code-creation,Function,0x758280,4255,"DefaultHandler$handleElement /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:603"
+code-creation,Function,0x7595c0,1239,"DomUtils$testElement /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:659"
+code-creation,Function,0x759b80,135," /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:696"
+code-creation,Function,0x759c40,211,"getTest /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:695"
+tick,0xffff07c7,0xbfffcdd0,0x6f3fff,2,0x64055a,0x64075d,0x587f35,0x593ac5,0x58bfb5,0x72e3c9,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,Function,0x75a100,1918,"DomUtils$getElements /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:685"
+code-creation,Function,0x75a9a0,449,"DomUtils$getElementById /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:719"
+code-creation,Function,0x75abe0,347,"DomUtils$getElementsByTagName /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:725"
+code-creation,Function,0x75ada0,347,"DomUtils$getElementsByTagType /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:730"
+code-creation,Function,0x75c100,3411," /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:23"
+code-creation,LazyCompile,0x75d220,386," /Users/chris/Documents/workspace_3.5/NodeHtmlParser/node-htmlparser.old.js:1"
+function-creation,0x70875c,0x75d220
+code-creation,StoreIC,0x75d440,88,"_reTrim"
+code-creation,StoreIC,0x75d4a0,128,"_reTrimComment"
+code-creation,StoreIC,0x75d540,128,"_reWhitespace"
+code-creation,StoreIC,0x75d5e0,88,"_reTagName"
+code-creation,StoreIC,0x75d640,128,"_reAttrib"
+code-creation,StoreIC,0x75d6e0,128,"_reTags"
+code-creation,StoreIC,0x75d780,128,"parseComplete"
+code-creation,StoreIC,0x75d820,128,"parseChunk"
+code-creation,StoreIC,0x75d8c0,128,"done"
+code-creation,StoreIC,0x75d960,88,"reset"
+code-creation,StoreIC,0x75d9c0,128,"_handler"
+code-creation,StoreIC,0x75da60,128,"_buffer"
+code-creation,StoreIC,0x75db00,88,"_done"
+code-creation,StoreIC,0x75db60,128,"_elements"
+code-creation,StoreIC,0x75dc00,128,"_elementsCurrent"
+code-creation,StoreIC,0x75dca0,88,"_emptyTags"
+code-creation,StoreIC,0x75dd00,128,"reWhitespace"
+code-creation,StoreIC,0x75dda0,128,"dom"
+code-creation,StoreIC,0x75de40,128,"reset"
+code-creation,StoreIC,0x75dee0,128,"done"
+code-creation,StoreIC,0x75df80,88,"writeTag"
+code-creation,StoreIC,0x75e100,128,"writeText"
+code-creation,StoreIC,0x75e1a0,128,"writeComment"
+code-creation,StoreIC,0x75e240,88,"writeDirective"
+code-creation,StoreIC,0x75e2a0,128,"error"
+code-creation,StoreIC,0x75e340,128,"_options"
+code-creation,StoreIC,0x75e3e0,88,"Parser"
+code-creation,StoreIC,0x75e440,128,"DefaultHandler"
+code-creation,StoreIC,0x75e4e0,128,"RssHandler"
+code-creation,StoreIC,0x75e580,88,"ElementType"
+code-creation,StoreIC,0x75e5e0,128,"DomUtils"
+tick,0xc1739,0xbfffe880,0x0,3,0x8fa0,0x72b890,0x652b27,0x6513c1,0x72e3ec,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xc18c3,0xbfffe880,0x0,3,0x8fa0,0x72b890,0x652b27,0x6513c1,0x72e3ec,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x972d01fa,0xbfffe96c,0x320ac7,3,0x17450,0x6529f6,0x6513c1,0x72e3ec,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,StoreIC,0x75e680,118,"dom"
+code-creation,StoreIC,0x75e700,118,"_done"
+code-creation,StoreIC,0x75e780,118,"_tagStack"
+code-creation,LoadIC,0x75e800,62,"_tagStack"
+code-creation,StoreIC,0x75e840,88,"last"
+code-creation,StoreIC,0x75e8a0,118,"_buffer"
+code-creation,StoreIC,0x75e920,118,"_done"
+code-creation,StoreIC,0x75e9a0,121,"_elements"
+code-creation,StoreIC,0x75ea20,121,"_elementsCurrent"
+code-creation,StoreIC,0x75eaa0,121,"_current"
+code-creation,StoreIC,0x75eb20,121,"_next"
+code-creation,LoadIC,0x75eba0,62,"Text"
+code-creation,StoreIC,0x75ebe0,121,"_parseState"
+code-creation,StoreIC,0x75ec60,121,"_prevTagSep"
+code-creation,StoreIC,0x75ece0,121,"_tagStack"
+code-creation,LoadIC,0x75ed60,62,"_handler"
+code-creation,LazyCompile,0x75eda0,2336,"test native regexp.js:264"
+function-creation,0x55a80c,0x75eda0
+tick,0x196e15,0xbfffe8f0,0x0,0,0x75f35e,0x63a1df,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,RegExp,0x75f860,572,"[\\<\\>]"
+code-creation,LoadIC,0x75fac0,59,"lastMatchInfoOverride"
+code-creation,StoreIC,0x75fb00,118,"lastIndex"
+code-creation,StoreIC,0x75fb80,118,"raw"
+code-creation,StoreIC,0x75fc00,118,"data"
+code-creation,StoreIC,0x75fc80,118,"type"
+code-creation,RegExp,0x760100,1727,"^\\s*(\\/?)\\s*([^\\s\\/]+)"
+code-creation,LoadIC,0x7607e0,65,"_reTags"
+code-creation,LoadIC,0x760840,65,"_next"
+code-creation,CallIC,0x7608a0,127,"charAt"
+code-creation,LoadIC,0x760940,65,"_current"
+code-creation,CallIC,0x7609a0,127,"substring"
+code-creation,LoadIC,0x760a40,65,"_parseState"
+code-creation,RegExp,0x760aa0,1791,"(^\\s+|\\s+$)"
+code-creation,LoadIC,0x7611c0,65,"_reTagName"
+code-creation,Stub,0x761220,372,"GenericBinaryOpStub_ADD_OverwriteRight_NoSmiInStub_RegArgs_NumberType_Default"
+code-creation,Stub,0x7613a0,373,"GenericBinaryOpStub_ADD_OverwriteLeft_NoSmiInStub_RegArgs_R_Integer32Type_Default"
+code-creation,Stub,0x761520,372,"GenericBinaryOpStub_ADD_OverwriteRight_NoSmiInStub_RegArgs_Integer32Type_Default"
+code-creation,LazyCompile,0x7616a0,1601,"BuildResultFromMatchInfo native regexp.js:151"
+function-creation,0x55a690,0x7616a0
+code-creation,CallIC,0x761dc0,89,"SubString"
+code-creation,LoadIC,0x761e20,65,"_tagStack"
+code-creation,StoreIC,0x761e80,118,"type"
+code-creation,LoadIC,0x761f00,62,"type"
+code-creation,LoadIC,0x761f40,62,"Script"
+code-creation,LoadIC,0x761f80,62,"Style"
+code-creation,LoadIC,0x761fc0,62,"Tag"
+code-creation,LoadIC,0x762100,65,"_elements"
+code-creation,CallIC,0x762160,94,"test"
+code-creation,RegExp,0x7621e0,1213,"^\\s*(\\/?)\\s*([^\\s\\/]+)"
+code-creation,LoadIC,0x7626c0,62,"raw"
+code-creation,LoadIC,0x762700,62,"type"
+code-creation,LoadIC,0x762740,65,"_reTrim"
+code-creation,CallIC,0x7627a0,127,"replace"
+code-creation,CallIC,0x762840,89,"BuildResultFromMatchInfo"
+code-creation,StoreIC,0x7628a0,88,"name"
+code-creation,CallIC,0x762900,127,"indexOf"
+code-creation,LoadIC,0x7629a0,65,"name"
+code-creation,LazyCompile,0x762a00,396,"splitMatch native string.js:696"
+function-creation,0x55fa5c,0x762a00
+code-creation,LazyCompile,0x762c00,142,"DoRegExpExec native regexp.js:117"
+function-creation,0x55d588,0x762c00
+code-creation,RegExp,0x762ce0,704,"\\s"
+code-creation,LazyCompile,0x762fc0,2415,"slice native string.js:552"
+function-creation,0x55ab28,0x762fc0
+code-creation,LoadIC,0x763a00,62,"data"
+code-creation,LoadIC,0x763a40,65,"_reWhitespace"
+code-creation,CallIC,0x763aa0,127,"split"
+code-creation,CallIC,0x763b40,89,"splitMatch"
+code-creation,CallIC,0x763ba0,89,"DoRegExpExec"
+code-creation,CallIC,0x763c00,127,"slice"
+code-creation,CallIC,0x763ca0,89,"NonStringToString"
+code-creation,StoreIC,0x763d00,118,"data"
+tick,0x1366a0,0xbfffdc7c,0xbfffddaf,0,0x64c5a9,0x732a60,0x63c86d,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,RegExp,0x764100,5682,"([^=<>\\"\\'\\s]+)\\s*=\\s*"([^"]*)"|([^=<>\\"\\'\\s]+)\\s*=\\s*'([^']*)'|([^=<>\\"\\'\\s]+)\\s*=\\s*([^'"\\s]+)|([^=<>\\"\\'\\s\\/]+)"
+code-creation,LoadIC,0x765780,65,"attribs"
+code-creation,LoadIC,0x7657e0,65,"_reAttrib"
+code-creation,CallIC,0x765840,94,"exec"
+code-creation,LoadIC,0x7658c0,62,"type"
+code-creation,LoadIC,0x765900,62,"data"
+code-creation,LoadIC,0x765940,82,""
+code-creation,StoreIC,0x7659a0,128,"attribs"
+code-creation,RegExp,0x765a40,1183,"(^\\s+|\\s+$)"
+code-creation,RegExp,0x766100,568,"\\s"
+tick,0x732855,0xbfffeac4,0x1033f38,0,0x63c86d,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x765d61,0xbfffe7f4,0xbfffe83e,0,0x64dd93,0x64d90c,0x63a439,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x760f70,0xbfffe7e4,0xbfffe83e,0,0x64dd93,0x64d90c,0x63a439,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x585143,0xbfffeaa8,0x55a700,0,0x733999,0x63a4be,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x63c0b6,0xbfffeaf0,0x1033ec8,0,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,CallIC,0x766360,127,"toString"
+tick,0x182e47,0xbfffe960,0x0,0,0x732d11,0x63c86d,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x63bcda,0xbfffeaf0,0x1033ec8,0,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x173b0f,0xbfffe720,0x0,1
+tick,0x173bcd,0xbfffe540,0x0,1
+function-delete,0x547e4c
+function-delete,0x54df14
+function-delete,0x5589e8
+function-delete,0x558a04
+function-delete,0x558d34
+function-delete,0x559254
+function-delete,0x55eacc
+function-delete,0x55f9e4
+function-delete,0x7051bc
+function-delete,0x7058b8
+function-delete,0x707578
+function-delete,0x7077d4
+function-delete,0x708740
+code-delete,0x599f20
+code-delete,0x59b960
+code-delete,0x59b9c0
+code-delete,0x59ba00
+code-delete,0x59ba60
+code-delete,0x59bae0
+code-delete,0x6436e0
+code-delete,0x6441a0
+code-delete,0x644240
+code-delete,0x6442e0
+code-delete,0x644380
+code-delete,0x644420
+code-delete,0x644460
+code-delete,0x6444a0
+code-delete,0x644540
+code-delete,0x6445e0
+code-delete,0x644680
+code-delete,0x644720
+code-delete,0x649b40
+code-delete,0x649c80
+code-delete,0x649d60
+code-delete,0x649dc0
+code-delete,0x649e20
+code-delete,0x649f00
+code-delete,0x649f60
+code-delete,0x64a100
+code-delete,0x64a180
+code-delete,0x64a1c0
+code-delete,0x64a260
+code-delete,0x64a300
+code-delete,0x64a360
+code-delete,0x64a3c0
+code-delete,0x64a4e0
+code-delete,0x64a560
+code-delete,0x64a5c0
+code-delete,0x64a620
+code-delete,0x64a6c0
+code-delete,0x64a740
+code-delete,0x64a780
+code-delete,0x64cc80
+code-delete,0x64cd00
+code-delete,0x64cd80
+code-delete,0x64ce00
+code-delete,0x64ce80
+code-delete,0x64cf00
+code-delete,0x64cf80
+code-delete,0x64d000
+code-delete,0x64d460
+code-delete,0x64d4a0
+code-delete,0x64d4e0
+code-delete,0x64d520
+code-delete,0x64d560
+code-delete,0x64e400
+code-delete,0x725bc0
+code-delete,0x725c60
+code-delete,0x725d00
+code-delete,0x725d60
+code-delete,0x725da0
+code-delete,0x725e40
+code-delete,0x725ee0
+code-delete,0x725f40
+code-delete,0x726100
+code-delete,0x726160
+code-delete,0x726200
+code-delete,0x726640
+code-delete,0x7266e0
+code-delete,0x72aea0
+code-delete,0x72af40
+code-delete,0x72afa0
+code-delete,0x72afe0
+code-delete,0x72b020
+code-delete,0x72ca40
+code-delete,0x72caa0
+code-delete,0x72cf40
+code-delete,0x72d020
+code-delete,0x72db00
+code-delete,0x72ec60
+code-delete,0x72f0a0
+code-delete,0x72f0e0
+code-delete,0x72f180
+code-delete,0x72fe60
+code-delete,0x72fea0
+code-delete,0x72ff20
+code-delete,0x72ff80
+code-delete,0x730100
+code-delete,0x730160
+code-delete,0x7301c0
+code-delete,0x730220
+code-delete,0x730280
+code-delete,0x730600
+code-delete,0x7306a0
+code-delete,0x730740
+code-delete,0x730b20
+code-delete,0x730b80
+code-delete,0x730c20
+code-delete,0x730cc0
+code-delete,0x730d60
+code-delete,0x730dc0
+code-delete,0x730e60
+code-delete,0x73d460
+code-delete,0x73d4a0
+code-delete,0x73d520
+code-delete,0x73d580
+code-delete,0x73d5c0
+code-delete,0x73d620
+code-delete,0x73d6a0
+code-delete,0x73d720
+code-delete,0x73d7a0
+code-delete,0x73d820
+code-delete,0x73d8a0
+code-delete,0x73d900
+code-delete,0x73d960
+code-delete,0x73d9a0
+code-delete,0x73d9e0
+code-delete,0x73da80
+code-delete,0x73db20
+code-delete,0x73db80
+code-delete,0x73dc20
+code-delete,0x73dc80
+code-delete,0x73dd00
+code-delete,0x73dda0
+code-delete,0x73de20
+code-delete,0x73dec0
+code-delete,0x73df60
+code-delete,0x75d440
+code-delete,0x75d4a0
+code-delete,0x75d540
+code-delete,0x75d5e0
+code-delete,0x75d640
+code-delete,0x75d6e0
+code-delete,0x75d780
+code-delete,0x75d820
+code-delete,0x75d8c0
+code-delete,0x75d960
+code-delete,0x75d9c0
+code-delete,0x75da60
+code-delete,0x75db00
+code-delete,0x75db60
+code-delete,0x75dc00
+code-delete,0x75dca0
+code-delete,0x75dd00
+code-delete,0x75dda0
+code-delete,0x75de40
+code-delete,0x75dee0
+code-delete,0x75df80
+code-delete,0x75e100
+code-delete,0x75e1a0
+code-delete,0x75e240
+code-delete,0x75e2a0
+code-delete,0x75e340
+code-delete,0x75e440
+code-delete,0x75e4e0
+code-delete,0x75e580
+code-delete,0x75e5e0
+code-delete,0x75e680
+code-delete,0x75e700
+code-delete,0x75e780
+code-delete,0x75e800
+code-delete,0x75e840
+code-delete,0x75e8a0
+code-delete,0x75e920
+code-delete,0x75e9a0
+code-delete,0x75ea20
+code-delete,0x75eaa0
+code-delete,0x75eb20
+code-delete,0x75eba0
+code-delete,0x75ebe0
+code-delete,0x75ec60
+code-delete,0x75ece0
+code-delete,0x75ed60
+code-delete,0x75fac0
+code-delete,0x75fb00
+code-delete,0x75fb80
+code-delete,0x75fc00
+code-delete,0x75fc80
+code-delete,0x7607e0
+code-delete,0x760840
+code-delete,0x7608a0
+code-delete,0x760940
+code-delete,0x7609a0
+code-delete,0x760a40
+code-delete,0x7611c0
+code-delete,0x761dc0
+code-delete,0x761e20
+code-delete,0x761e80
+code-delete,0x761f00
+code-delete,0x761f40
+code-delete,0x761f80
+code-delete,0x761fc0
+code-delete,0x762100
+code-delete,0x762160
+code-delete,0x7626c0
+code-delete,0x762700
+code-delete,0x762740
+code-delete,0x7627a0
+code-delete,0x762840
+code-delete,0x7628a0
+code-delete,0x762900
+code-delete,0x7629a0
+code-delete,0x763a00
+code-delete,0x763a40
+code-delete,0x763aa0
+code-delete,0x763b40
+code-delete,0x763ba0
+code-delete,0x763c00
+code-delete,0x763ca0
+code-delete,0x763d00
+code-delete,0x765780
+code-delete,0x7657e0
+code-delete,0x765840
+code-delete,0x7658c0
+code-delete,0x765900
+code-delete,0x765940
+code-delete,0x7659a0
+code-delete,0x766360
+tick,0x171f1d,0xbfffe6c0,0x0,1
+code-creation,StoreIC,0x766360,118,"answerSaved"
+code-creation,CallIC,0x7663e0,89,"DefaultString"
+code-creation,LoadIC,0x766440,100,"toString"
+code-creation,CallIC,0x7664c0,112,"toString"
+code-creation,CallIC,0x766540,89,"IsPrimitive"
+code-creation,CallIC,0x7665a0,89,"ToString"
+code-creation,StoreIC,0x766600,121,"_parseState"
+code-creation,StoreIC,0x766680,121,"_current"
+code-creation,StoreIC,0x766700,121,"_prevTagSep"
+code-creation,StoreIC,0x766780,118,"type"
+code-creation,StoreIC,0x766800,118,"regExp"
+code-creation,StoreIC,0x766880,118,"subject"
+code-creation,StoreIC,0x766900,118,"lastIndex"
+code-creation,LoadIC,0x766980,59,"lastMatchInfoOverride"
+code-creation,StoreIC,0x7669c0,118,"lastIndex"
+code-creation,StoreIC,0x766a40,118,"answer"
+code-creation,StoreIC,0x766ac0,121,"_next"
+code-creation,CallIC,0x766b40,89,"NonStringToString"
+code-creation,CallIC,0x766ba0,89,"SubString"
+code-creation,StoreIC,0x766c00,118,"raw"
+tick,0x182385,0xbfffe8f4,0x0,0,0x63a370,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,StoreIC,0x766c80,118,"data"
+code-creation,StoreIC,0x766d00,118,"type"
+code-creation,LoadIC,0x766d80,65,"_elements"
+code-creation,CallIC,0x766de0,276,"push"
+code-creation,LoadIC,0x766f20,65,"_next"
+code-creation,LoadIC,0x766f80,65,"_reTags"
+code-creation,CallIC,0x766fe0,94,"test"
+code-creation,LoadIC,0x767060,61,"regExpCache"
+code-creation,LoadIC,0x7670a0,61,"lastMatchInfo"
+code-creation,CallIC,0x7670e0,127,"charAt"
+code-creation,LoadIC,0x767180,65,"_current"
+code-creation,CallIC,0x7671e0,127,"substring"
+code-creation,LoadIC,0x767280,65,"_parseState"
+code-creation,StoreIC,0x7672e0,118,"replaceString"
+code-creation,LoadIC,0x767360,65,"_reTagName"
+code-creation,CallIC,0x7673c0,94,"exec"
+code-creation,LoadIC,0x767440,62,"type"
+code-creation,LoadIC,0x767480,62,"lastIndex"
+code-creation,LoadIC,0x7674c0,62,"global"
+code-creation,CallIC,0x767500,89,"SubString"
+code-creation,LoadIC,0x767560,65,"_tagStack"
+code-creation,StoreIC,0x7675c0,88,"name"
+code-creation,StoreIC,0x767620,118,"data"
+code-creation,LoadIC,0x7676a0,62,"type"
+code-creation,LoadIC,0x7676e0,62,"Script"
+code-creation,LoadIC,0x767720,62,"Style"
+code-creation,LoadIC,0x767760,62,"Tag"
+code-creation,LoadIC,0x7677a0,62,"data"
+code-creation,CallIC,0x7677e0,150,"substring"
+code-creation,LoadIC,0x767880,62,"raw"
+code-creation,LoadIC,0x7678c0,62,"type"
+code-creation,LoadIC,0x767900,65,"_reTrim"
+code-creation,CallIC,0x767960,127,"replace"
+code-creation,CallIC,0x767a00,89,"StringReplaceRegExp"
+code-creation,LoadIC,0x767a60,62,"regExp"
+code-creation,CallIC,0x767aa0,89,"BuildResultFromMatchInfo"
+code-creation,CallIC,0x767b00,127,"indexOf"
+code-creation,LoadIC,0x767ba0,65,"name"
+code-creation,LoadIC,0x767c00,65,"_reWhitespace"
+code-creation,CallIC,0x767c60,127,"split"
+code-creation,CallIC,0x767d00,89,"splitMatch"
+code-creation,CallIC,0x767d60,89,"DoRegExpExec"
+code-creation,StoreIC,0x767dc0,128,"attribs"
+code-creation,LoadIC,0x767e60,62,"type"
+code-creation,LoadIC,0x767ea0,62,"data"
+code-creation,CallIC,0x767ee0,127,"slice"
+code-creation,CallIC,0x767f80,89,"NonStringToString"
+code-creation,LoadIC,0x768100,65,"_reAttrib"
+code-creation,CallIC,0x768160,94,"exec"
+code-creation,LoadIC,0x7681e0,82,""
+code-creation,LoadIC,0x768240,61,"undefined"
+code-creation,LoadIC,0x768280,65,"attribs"
+tick,0x64c125,0xbfffeab4,0x55c318,0,0x7338b9,0x63a4be,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x64c121,0xbfffeabc,0x71cdc4,0,0x63a4be,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x18213a,0xbfffe8d0,0x0,0,0x732d11,0x63c86d,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x76069a,0xbfffea2c,0x13d,0
+tick,0x767d24,0xbfffea58,0x55f4c4,0,0x73295f,0x63c86d,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x767bdb,0xbfffeaec,0x71cd00,0,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x182e7d,0xbfffe940,0x0,0,0x63c86d,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x760f58,0xbfffe7e4,0xbfffe83e,0,0x64dd93,0x64d90c,0x63a439,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xc1b87,0xbfffe9b0,0x0,0,0x72d9d4,0x72d413,0x73299b,0x63c86d,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbc713,0xbfffea10,0x5821a0,0,0x63bcec,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x17defb,0xbfffe93c,0x5821a0,0,0x58e198,0x733886,0x63a4be,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xb0534,0xbfffe980,0x18e3c50,0,0x648b33,0x73295f,0x63c86d,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbc4ea,0xbfffe880,0x0,0,0x648b33,0x73295f,0x63c86d,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x1f680c,0xbfffe7b8,0x0,1
+tick,0x64ade4,0xbfffeacc,0x55ac18,0,0x63c6a2,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,CallIC,0x7682e0,127,"toString"
+tick,0x598340,0xbfffeac4,0x71cdc4,0,0x63a4be,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x763553,0xbfffea38,0x55ab28,0,0x648989,0x73295f,0x63c86d,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x1d814d,0xbfffea40,0x0,0,0x64aae9,0x63c0e1,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x72d109,0xbfffeac0,0x55a570,0,0x63a339,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x762d43,0xbfffe9cc,0x7,0,0x64b919,0x762a50,0x648941,0x73295f,0x63c86d,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x63c1f5,0xbfffeaf0,0x71cd00,0,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x766850,0xbfffeab8,0x55a80c,0,0x63cd92,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xc03c3,0xbfffe9c0,0x0,0,0x72d9d4,0x72d413,0x63a339,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x178ef0,0xbfffe8e0,0x0,1
+tick,0x17921e,0xbfffe8f0,0x0,1
+tick,0x72d890,0xbfffea30,0x55ff60,0,0x761a21,0x64c6dd,0x732a60,0x63c86d,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x732a01,0xbfffeac4,0x71cd70,0,0x63c86d,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x63bc66,0xbfffeaf0,0x71cd00,0,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x648868,0xbfffea70,0x55f4c4,0,0x73295f,0x63c86d,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x75f8f4,0xbfffea5c,0x63cd7,0
+tick,0x7668eb,0xbfffea90,0x55e1d8,0,0x64d90c,0x63a439,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x72d6ff,0xbfffea8c,0x55ff60,0,0x72d413,0x63a339,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x5832d6,0xbfffeac4,0x71cdc4,0,0x63a4be,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,StoreIC,0x768380,118,"type"
+code-creation,Stub,0x768400,217,"GenericBinaryOpStub_ADD_OverwriteLeft_RegArgs_UnknownType_Strings"
+code-creation,LoadIC,0x7684e0,65,"_prevTagSep"
+tick,0x178a34,0xbfffe97c,0x14b7e9,0,0x63a4be,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,CallIC,0x768540,179,"pop"
+tick,0x72d7d0,0xbfffea8c,0x55ff60,0,0x72d413,0x63a339,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbc4ea,0xbfffe880,0x0,0,0x64899c,0x73295f,0x63c86d,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x76452d,0xbfffe9f4,0xcd,0
+tick,0x1835c1,0xbfffe9d8,0xbfffeadf,0,0x63a4be,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x1d5038,0xbfffe960,0x0,0,0x64dd93,0x64d90c,0x63a439,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,StoreIC,0x768600,118,"_buffer"
+code-creation,CallIC,0x768680,117,"shift"
+code-creation,LoadIC,0x768700,62,"_done"
+code-creation,LoadIC,0x768740,62,"_options"
+code-creation,LoadIC,0x768780,65,"verbose"
+code-creation,LoadIC,0x7687e0,62,"_tagStack"
+code-creation,CallIC,0x768820,130,"last"
+code-creation,LoadIC,0x7688c0,62,"Text"
+code-creation,LoadIC,0x768900,62,"dom"
+code-creation,CallIC,0x768940,276,"push"
+code-creation,LoadIC,0x768a80,65,"ignoreWhitespace"
+code-creation,LoadIC,0x768ae0,62,"Comment"
+code-creation,LoadIC,0x768b20,62,"Directive"
+code-creation,StoreIC,0x768b60,128,"children"
+code-creation,LoadIC,0x768c00,65,"children"
+code-creation,CallIC,0x768c60,127,"charAt"
+code-creation,LoadIC,0x768d00,65,"enforceEmptyTags"
+code-creation,LoadIC,0x768d60,65,"_emptyTags"
+code-creation,CallIC,0x768dc0,276,"push"
+code-creation,LoadIC,0x768f00,65,"name"
+code-creation,CallIC,0x768f60,179,"pop"
+code-creation,LoadIC,0x769020,82,""
+code-creation,LoadIC,0x769080,65,"children"
+code-creation,LoadIC,0x7690e0,65,"name"
+code-creation,LoadIC,0x769140,65,"name"
+code-creation,StoreIC,0x7691a0,128,"children"
+tick,0x182f0c,0xbfffe990,0x0,0,0x73924c,0x73850f,0x7349a1,0x63ce78,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73815a,0xbfffea4c,0x71e1c4,0,0x739930,0x7386c1,0x73496b,0x63ce78,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x1983d8,0xbfffe8b0,0x0,0,0x73496b,0x63ce78,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x582ecf,0xbfffea60,0x71aa1c,0,0x73850f,0x7349a1,0x63ce78,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x768c94,0xbfffea60,0x71aa1c,0,0x73850f,0x7349a1,0x63ce78,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x738120,0xbfffea64,0x71aa1c,0,0x7386c1,0x73496b,0x63ce78,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x14c98c,0xbfffe9a0,0xbfffeaa3,0,0x7349a1,0x63ce78,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x72d7a5,0xbfffe9ec,0x55ff60,0,0x72d413,0x7391cf,0x73850f,0x7349a1,0x63ce78,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x734788,0xbfffeab4,0x71ccac,0,0x63ce78,0x731a3b,0x7318a0,0x72e482,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,StoreIC,0x769240,118,"_done"
+code-creation,StoreIC,0x7692c0,118,"_done"
+code-creation,LazyCompile,0x769340,262,"getTime native date.js:723"
+function-creation,0x55a71c,0x769340
+code-creation,StoreIC,0x769480,118,"tag_name"
+code-creation,LazyCompile,0x769500,179,"isNaN native v8natives.js:78"
+function-creation,0x55d520,0x769500
+code-creation,KeyedStoreIC,0x769600,125,"tag_name"
+code-creation,CallIC,0x7696a0,112,"parseInt"
+code-creation,CallIC,0x769720,89,"isNaN"
+code-creation,CallIC,0x769780,89,"ToNumber"
+code-creation,KeyedLoadIC,0x7697e0,74,"tag_name"
+code-creation,CallIC,0x769840,127,"testElement"
+code-creation,LoadIC,0x7698e0,82,""
+code-creation,LoadIC,0x769940,73,"Array"
+code-creation,CallIC,0x7699a0,127,"getElements"
+code-creation,CallIC,0x769a40,117,"concat"
+code-creation,LoadIC,0x769ac0,62,"type"
+code-creation,CallIC,0x769b00,127,"tag_name"
+code-creation,LoadIC,0x769ba0,62,"type"
+tick,0x97295b88,0xbfffe810,0xbfffe88f,2,0x73aab2,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbe3cd,0xbfffe700,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xc32dc,0xbfffe5c0,0x0,1
+tick,0x1f6402,0xbfffe4ac,0x0,1
+tick,0x5839da,0xbfffe79c,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x58321f,0xbfffe75c,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,CallIC,0x769be0,127,"getElements"
+code-creation,LoadIC,0x769c80,118,""
+code-creation,StoreIC,0x769d00,118,"id"
+tick,0x1864c3,0xbfffe360,0x0,0,0x73b525,0x72e1cb,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,KeyedLoadIC,0x769d80,74,"id"
+code-creation,KeyedStoreIC,0x769de0,125,"id"
+code-creation,LoadIC,0x769e80,82,""
+code-creation,LoadIC,0x769ee0,65,"attribs"
+code-creation,KeyedLoadIC,0x769f40,77,"id"
+code-creation,KeyedLoadIC,0x769fa0,77,"id"
+code-creation,LoadIC,0x76a100,65,"DomUtils"
+code-creation,CallIC,0x76a160,127,"getElementsByTagName"
+code-creation,CallIC,0x76a200,89,"ToString"
+tick,0x73b00b,0xbfffe7e0,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x7697ab,0xbfffe7c0,0x55d520,0,0x73aab2,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xffff063e,0xbfffe534,0x0,1
+tick,0xbe30f,0xbfffe810,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73ac23,0xbfffe86c,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,CallIC,0x76a260,127,"getElementsByTagName"
+code-creation,CallIC,0x76a300,127,"getElementById"
+tick,0x5837b8,0xbfffe790,0x0,0,0x73ab0b,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73a3ce,0xbfffe7ac,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73ac18,0xbfffe86c,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x7699f0,0xbfffe854,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73b1af,0xbfffe82c,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x598248,0xbfffe828,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x5839c0,0xbfffe824,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x7137d,0xbfffe780,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x6fd7b,0xbfffe760,0x5821a0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbc6bb,0xbfffe7b0,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x76958f,0xbfffe7cc,0x55d520,0,0x73aab2,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xffff0d50,0xbfffe910,0xffffffff,0,0x73b056,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73b011,0xbfffe7e0,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x712bd,0xbfffe7d0,0x5821a0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x769b4c,0xbfffe7c0,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x6fd74,0xbfffe7f0,0x5821a0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xffff0d48,0xbfffe800,0xffffffff,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73a23f,0xbfffe820,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x71433,0xbfffe780,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x582161,0xbfffe7e0,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbc480,0xbfffe75c,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x71460,0xbfffe7d0,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73a29f,0xbfffe7ac,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x7699e9,0xbfffe920,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b54b,0x72e1cb,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x71460,0xbfffe850,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73a70e,0xbfffe794,0x18001dc,0,0x73a3ce,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x5984c6,0xbfffe7d0,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b54b,0x72e1cb,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x7696c0,0xbfffe7d8,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x1bd910,0xbfffe770,0x5821a0,0,0x58e198,0x73a70e,0x73a3ce,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x71385,0xbfffe810,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b54b,0x72e1cb,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x769975,0xbfffe7e0,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x713a8,0xbfffe810,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x76988c,0xbfffe860,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b54b,0x72e1cb,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73ac06,0xbfffe7e4,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x6f082,0xbfffe790,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73ad0c,0xbfffe818,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x769aa6,0xbfffe864,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x7699ec,0xbfffe854,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x598241,0xbfffe7e8,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbc5f2,0xbfffe740,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x5837c6,0xbfffe80c,0x55aca4,0,0x73ab0b,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x76989f,0xbfffe81c,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73acf7,0xbfffe7d4,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73a342,0xbfffe768,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73a1f8,0xbfffe804,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x585584,0xbfffe8a4,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73a2b5,0xbfffe7ac,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x7136c,0xbfffe7d0,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b54b,0x72e1cb,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x70bd5,0xbfffe820,0x0,0,0x73add5,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x598251,0xbfffe764,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x78ce4,0xbfffe744,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b54b,0x72e1cb,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x71469,0xbfffe7d0,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbc480,0xbfffe6cc,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x58e245,0xbfffe774,0x5607a8,0,0x73a70e,0x73a590,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b54b,0x72e1cb,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x713ac,0xbfffe740,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x769a05,0xbfffe898,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbe301,0xbfffe7a0,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73aca8,0xbfffe790,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73b04b,0xbfffe828,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x712e6,0xbfffe7a0,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x71309,0xbfffe7d0,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73a2a5,0xbfffe878,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x7137d,0xbfffe7d0,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b54b,0x72e1cb,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73aa2a,0xbfffe82c,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x6f08b,0xbfffe790,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x6fd13,0xbfffe780,0x5821a0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x59825d,0xbfffe7e4,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xffff0a05,0xbfffe800,0xffffffff,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbc5da,0xbfffe730,0x0,0,0x73add5,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x7697a0,0xbfffe88c,0x55d520,0,0x73aab2,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x7699c0,0xbfffe898,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x5839d2,0xbfffe800,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbe439,0xbfffe700,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbdde7,0xbfffe710,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x582167,0xbfffe824,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b54b,0x72e1cb,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73ac99,0xbfffe8a0,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbe445,0xbfffe700,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x5837cc,0xbfffe7c4,0x55aca4,0,0x73ab0b,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbdb67,0xbfffe660,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x71294,0xbfffe7a0,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x76974b,0xbfffe7dc,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x643bb1,0xbfffe7ac,0x55aca4,0,0x73aaa4,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x5821ee,0xbfffe910,0x5821a0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbdb7b,0xbfffe760,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xba910,0xbfffe750,0x0,1
+tick,0xbe347,0xbfffe760,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbe3be,0xbfffe790,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x5855c9,0xbfffe81c,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73b1f2,0xbfffe82c,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b54b,0x72e1cb,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73a305,0xbfffe7f0,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x71376,0xbfffe780,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73a367,0xbfffe7ac,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x78d30,0xbfffe7ac,0x5821a0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x70bd7,0xbfffe790,0x0,0,0x73add5,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x6fd17,0xbfffe760,0x5821a0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x6fd7b,0xbfffe7b0,0x5821a0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x769a60,0xbfffe8a8,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x582167,0xbfffe824,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73a6e0,0xbfffe7a0,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73a32c,0xbfffe810,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbc6bb,0xbfffe760,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x598248,0xbfffe874,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x58320a,0xbfffe7c0,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x7697c5,0xbfffe7c0,0x55d520,0,0x73aab2,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x1bd917,0xbfffe770,0x5821a0,0,0x58e198,0x73a70e,0x73a3ce,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xffff0d43,0xbfffe910,0xffffffff,0,0x73b056,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x768974,0xbfffe864,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x7690bb,0xbfffe86c,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73aee4,0xbfffe808,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xb6f57,0xbfffe4f0,0x0,1
+tick,0x73ac88,0xbfffe790,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x71387,0xbfffe7d0,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b54b,0x72e1cb,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73afd3,0xbfffe870,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x598263,0xbfffe830,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73af16,0xbfffe7e4,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x70bd5,0xbfffe790,0x0,0,0x73add5,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x7697ab,0xbfffe77c,0x55d520,0,0x73aab2,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x5837c9,0xbfffe7c8,0x55aca4,0,0x73ab0b,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbe3cd,0xbfffe740,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x6fd03,0xbfffe7b0,0x5821a0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x7689a8,0xbfffe8a8,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x58321f,0xbfffe7e4,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbe359,0xbfffe7d0,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x769b4c,0xbfffe7a0,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x598248,0xbfffe764,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x643bb4,0xbfffe768,0x55aca4,0,0x73aaa4,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x583180,0xbfffe874,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73ac0c,0xbfffe7e4,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x585580,0xbfffe9d4,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x643bb4,0xbfffe87c,0x55aca4,0,0x73ab0b,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xffff0d48,0xbfffe800,0xffffffff,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x71433,0xbfffe7a0,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x6f082,0xbfffe790,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x643bb4,0xbfffe7ac,0x55aca4,0,0x73aaa4,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbe557,0xbfffe7b0,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x6f080,0xbfffe810,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x71460,0xbfffe7d0,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x769921,0xbfffe764,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b54b,0x72e1cb,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73aab5,0xbfffe7a4,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x70b95,0xbfffe790,0x0,0,0x73add5,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73ad0c,0xbfffe790,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x78cd6,0xbfffe714,0x5821a0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x6fd2c,0xbfffe7f0,0x5821a0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbdb50,0xbfffe73c,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x5984d7,0xbfffe89c,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x598257,0xbfffe82c,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x583180,0xbfffe7a8,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x6fd01,0xbfffe720,0x5821a0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73ad0c,0xbfffe85c,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x78cd0,0xbfffe7cc,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xffff0d50,0xbfffe800,0xffffffff,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xffff08c8,0xbfffe910,0xffffffff,0,0x73b056,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x769890,0xbfffe7d8,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x78ce4,0xbfffe734,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbc6b0,0xbfffe77c,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73b238,0xbfffe82c,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x582120,0xbfffe7e0,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x78d18,0xbfffe754,0x5821a0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x78cdf,0xbfffe754,0x5821a0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xffff08b1,0xbfffe800,0xffffffff,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x76959e,0xbfffe7cc,0x55d520,0,0x73aab2,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x7699ec,0xbfffe810,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x583a28,0xbfffe868,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x582f7f,0xbfffe7cc,0x1871d84,0,0x73a3ce,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x59e45b,0xbfffe7dc,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x7699f0,0xbfffe7cc,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbdb53,0xbfffe7a0,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbc6bb,0xbfffe730,0x0,0,0x73add5,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x78d29,0xbfffe7e4,0x5821a0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x5837e9,0xbfffe7e4,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbe404,0xbfffe740,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x5984e1,0xbfffe7d0,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbe2e0,0xbfffe79c,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73a6fc,0xbfffe7d8,0x10001e4,0,0x73a3ce,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x6f050,0xbfffe77c,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x5839e3,0xbfffe844,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73a2a5,0xbfffe7ac,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x7699f9,0xbfffe7cc,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x582f2b,0xbfffe7cc,0x114e47c,0,0x73a3ce,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbe2f4,0xbfffe70c,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b54b,0x72e1cb,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x58215e,0xbfffe7e0,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x582164,0xbfffe7e0,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xffff0d3f,0xbfffe800,0xffffffff,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x7137d,0xbfffe940,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x769860,0xbfffe8a4,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x6fd6c,0xbfffe760,0x5821a0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x582131,0xbfffe79c,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x598220,0xbfffe764,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x58558c,0xbfffe7d8,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x598251,0xbfffe86c,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b54b,0x72e1cb,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73a9d8,0xbfffe7e4,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x768964,0xbfffe820,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x70bd5,0xbfffe7e0,0x0,0,0x73add5,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x769102,0xbfffe82c,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x5837b3,0xbfffe7dc,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73a9d8,0xbfffe828,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x712bd,0xbfffe7d0,0x5821a0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x6f082,0xbfffe7d0,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x59824e,0xbfffe7a8,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x7678e2,0xbfffe830,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbc5cb,0xbfffe740,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbe2f4,0xbfffe73c,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbe359,0xbfffe760,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x769bc2,0xbfffe7a8,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x6f088,0xbfffe7d0,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x7696d1,0xbfffe860,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x769740,0xbfffe820,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xffff0d48,0xbfffe800,0xffffffff,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x6fd40,0xbfffe720,0x5821a0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73a9d8,0xbfffe7e4,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x7678f8,0xbfffe7ec,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xb6f55,0xbfffe6d0,0x0,1
+tick,0x58214c,0xbfffe7e0,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73aab2,0xbfffe7e8,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x598220,0xbfffe7a8,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x17df06,0xbfffe600,0x5821a0,0,0x58e198,0x73a70e,0x73a3ce,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x78d30,0xbfffe71c,0x5821a0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x7678ef,0xbfffe764,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x6fd60,0xbfffe7b0,0x5821a0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x598257,0xbfffe7ec,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73a21f,0xbfffe800,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73ac75,0xbfffe7fc,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x5984b1,0xbfffe78c,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73b022,0xbfffe824,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73a21f,0xbfffe864,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x6fd74,0xbfffe760,0x5821a0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73a172,0xbfffe7c0,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x70bec,0xbfffe800,0x0,0,0x73add5,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x7140c,0xbfffe780,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xffff08bc,0xbfffe800,0xffffffff,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xffff0d48,0xbfffe910,0xffffffff,0,0x73b056,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x769a02,0xbfffe854,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x5839c4,0xbfffe774,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x5837cc,0xbfffe934,0x55aca4,0,0x73aaa4,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73aa3d,0xbfffe7a4,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbdb77,0xbfffe710,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x5984d7,0xbfffe8bc,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x5839c0,0xbfffe840,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xffff0a4e,0xbfffe800,0xffffffff,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xffff0d3f,0xbfffe910,0xffffffff,0,0x73b056,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x78d18,0xbfffe7c4,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x5821ee,0xbfffe7c0,0x5821a0,0,0x73add5,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x769768,0xbfffe798,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xffff08b7,0xbfffe800,0xffffffff,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x6f082,0xbfffe740,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbc48c,0xbfffe79c,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73af0d,0xbfffe7e8,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbdb50,0xbfffe73c,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73a1f8,0xbfffe7c0,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x769744,0xbfffea84,0x71b258,0,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x769bc2,0xbfffe7a8,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xffff0d48,0xbfffe800,0xffffffff,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x583219,0xbfffe97c,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x712c8,0xbfffe780,0x5821a0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x7678f8,0xbfffe7a8,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x769a02,0xbfffe810,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b54b,0x72e1cb,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73ae28,0xbfffe8b4,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73a222,0xbfffe7bc,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x58318f,0xbfffe804,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbc4ad,0xbfffe6a0,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x598251,0xbfffe7e4,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x6fd2c,0xbfffe810,0x5821a0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x17df3c,0xbfffe690,0x5821a0,0,0x58e198,0x73a70e,0x73a3ce,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x7695a5,0xbfffe860,0x0,0,0x73aab2,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73ad0c,0xbfffe7f4,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x598220,0xbfffe764,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x5821ec,0xbfffe7c0,0x5821a0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x17e3c0,0xbfffe6b0,0x0,0,0x58e198,0x73a70e,0x73a3ce,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x768275,0xbfffe7e4,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xffff08a0,0xbfffe800,0xffffffff,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73a120,0xbfffe7b4,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x643bd6,0xbfffe7b0,0x55aca4,0,0x73ab0b,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73a124,0xbfffe7d0,0x0,0
+tick,0x7678e0,0xbfffe80c,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e19b,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x59849c,0xbfffe7d0,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xffff0a3c,0xbfffe800,0xffffffff,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x71490,0xbfffe890,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x76974b,0xbfffe754,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbe517,0xbfffe740,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x6f082,0xbfffe8a0,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x768275,0xbfffe828,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbc4ad,0xbfffe710,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x712b0,0xbfffe7bc,0x5821a0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x6f116,0xbfffe790,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x71490,0xbfffe850,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x59e492,0xbfffe864,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbdc86,0xbfffe760,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xffff08b1,0xbfffe800,0xffffffff,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xffff0a37,0xbfffe800,0xffffffff,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x5821f1,0xbfffe850,0x5821a0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x6f077,0xbfffe700,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x73a29f,0xbfffe834,0x71b23c,0,0x73ad81,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x6f09a,0xbfffe7d0,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x7690b8,0xbfffe828,0x71b258,0,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0xbe3db,0xbfffe760,0x0,0,0x73b056,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b048,0x73b6cb,0x72e161,0x72dccb,0x72e504,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,LoadIC,0x76a3a0,73,"Date"
+code-creation,CallIC,0x76a400,112,"getTime"
+code-creation,Stub,0x76a480,186,"GenericBinaryOpStub_SUB_Alloc_RegArgs_UnknownType_HeapNumbers"
+code-creation,CallIC,0x76a540,89,"InstantiateFunction"
+code-creation,LoadIC,0x76a5a0,61,"kApiFunctionCache"
+code-creation,CallIC,0x76a5e0,89,"ConfigureTemplateInstance"
+code-creation,StoreIC,0x76a640,125,"id"
+code-creation,StoreIC,0x76a6e0,125,"exports"
+code-creation,StoreIC,0x76a780,125,"parent"
+code-creation,StoreIC,0x76a820,125,"moduleCache"
+code-creation,StoreIC,0x76a8c0,125,"filename"
+code-creation,StoreIC,0x76a960,125,"loaded"
+code-creation,StoreIC,0x76aa00,125,"exited"
+code-creation,StoreIC,0x76aaa0,125,"children"
+code-creation,StoreIC,0x76ab40,88,"paths"
+code-creation,StoreIC,0x76aba0,128,"async"
+code-creation,StoreIC,0x76ac40,128,"main"
+code-creation,StoreIC,0x76ace0,88,"registerExtension"
+tick,0x17d40c,0xbfffdeb0,0x0,2,0x64035f,0x59fc90,0x59fee2,0x59e6fd,0x7272d8,0x72e52f,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,Script,0x76ad40,99,"net"
+tick,0x1e5651,0xbfffce90,0x32b72f,2,0x64055a,0x59fc90,0x59fee2,0x59e6fd,0x7272d8,0x72e52f,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+tick,0x1e4ec2,0xbfffde50,0x32b72f,2,0x64055a,0x59fc90,0x59fee2,0x59e6fd,0x7272d8,0x72e52f,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,Stub,0x76ade0,387,"FastNewContextStub"
+code-creation,Function,0x76af80,546,"debug net:11"
+code-creation,Function,0x76b200,869,"closeFD net:228"
+code-creation,Function,0x76b620,177,"allocNewPool net:247"
+code-creation,Function,0x76b720,155,"allocNewSecurePool net:253"
+code-creation,Function,0x76b800,207,"allocEmptyBuffer net:258"
+code-creation,Function,0x76b920,471,"_doFlush net:264"
+tick,0xf1d74,0xbfffd100,0x0,2,0x64055a,0x59fc90,0x59fee2,0x59e6fd,0x7272d8,0x72e52f,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,Function,0x76bb80,196," net:309"
+code-creation,Stub,0x76bca0,197,"GenericBinaryOpStub_SUB_OverwriteLeft_NoSmiInStub_RegArgs_UnknownType_Default"
+code-creation,Function,0x74c100,7125,"self._readWatcher.callback net:276"
+code-creation,Function,0x76bd80,479,"initStream net:274"
+code-creation,Function,0x76c100,273,"Stream net:394"
+code-creation,Function,0x76c280,1095,"_writeWatcher.callback net:738"
+code-creation,Function,0x76c7a0,811,"doConnect net:718"
+code-creation,Function,0x76cba0,192,"isPort net:758"
+code-creation,Function,0x76cca0,2027,"Server.self.watcher.callback net:940"
+code-creation,Function,0x76d600,396,"Server net:930"
+code-creation,Stub,0x76d820,193,"CallFunction"
+code-creation,Function,0x76d900,146,"peek net:75"
+code-creation,Function,0x76d9e0,116,"shift net:82"
+code-creation,Function,0x76daa0,158,"remove net:90"
+code-creation,Function,0x76dba0,198,"append net:97"
+tick,0xd26c3,0xbfffcd08,0x17,2,0x64055a,0x59fc90,0x59fee2,0x59e6fd,0x7272d8,0x72e52f,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,Stub,0x76dce0,333,"GenericBinaryOpStub_SUB_OverwriteRight_RegArgs_UnknownType_Default"
+code-creation,Stub,0x76de40,52,"GenericBinaryOpStub_MOD_Alloc_NoSmiInStub_StackArgs_UnknownType_Default"
+code-creation,Function,0x76e100,399,"normalize net:106"
+code-creation,Function,0x76e2e0,1014,"list.callback net:133"
+code-creation,Function,0x76e7a0,933,"insert net:116"
+code-creation,Function,0x76ec20,568,"unenroll.unenroll net:168"
+code-creation,Function,0x76eee0,227,"enroll net:185"
+code-creation,Function,0x76f020,519,"active net:197"
+code-creation,Function,0x76f2e0,588,"timeout net:68"
+code-creation,Function,0x76f5e0,88,"ioWatchers.FreeList.iowatcher net:217"
+code-creation,Function,0x76f680,890,"Stream.setSecure net:407"
+code-creation,Function,0x76fae0,255,"Stream.verifyPeer net:433"
+code-creation,Function,0x76fc40,200,"Stream._checkForSecureHandshake net:441"
+code-creation,Function,0x76fd60,227,"Stream.getPeerCertificate net:448"
+code-creation,Function,0x76fea0,227,"Stream.getCipher net:456"
+code-creation,Function,0x770100,218,"Stream.open net:464"
+code-creation,Function,0x770240,124,"createConnection net:476"
+code-creation,Function,0x770320,1107,"get net:484"
+code-creation,Function,0x770820,763,"Stream.write net:507"
+code-creation,Function,0x770c00,761,"Stream._shutdownSecure net:532"
+code-creation,Stub,0x770fa0,159,"FastNewContextStub"
+tick,0xffff08bc,0xbfffd350,0x80c9ff,2,0x64055a,0x59fc90,0x59fee2,0x59e6fd,0x7272d8,0x72e52f,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,Function,0x772100,5062,"Stream._writeOut net:550"
+code-creation,Function,0x7737c0,1272,"Stream.flush net:674"
+code-creation,Function,0x773da0,124,"Stream.send net:692"
+code-creation,Function,0x773e60,271,"Stream._writeQueueLast net:697"
+code-creation,Function,0x774100,99,"_decoder.onString net:709"
+code-creation,Function,0x7741a0,449,"Stream.setEncoding net:703"
+code-creation,Function,0x774400,449," net:778"
+code-creation,Function,0x774640,913,"Stream.connect net:765"
+code-creation,Function,0x774aa0,107,"Stream.address net:796"
+code-creation,Function,0x774b40,207,"Stream.setNoDelay net:801"
+code-creation,Stub,0x774c60,186,"GenericBinaryOpStub_DIV_Alloc_NoSmiInStub_RegArgs_UnknownType_Default"
+code-creation,Function,0x774d20,437,"Stream.setKeepAlive net:807"
+code-creation,Function,0x774f40,288,"Stream.setTimeout net:814"
+code-creation,Function,0x7750c0,98,"Stream.pause net:822"
+code-creation,Function,0x775160,235,"Stream.resume net:827"
+code-creation,Function,0x7752c0,256,"Stream.forceClose net:836"
+code-creation,Function,0x775420,311," net:877"
+code-creation,Function,0x7755c0,879,"Stream.destroy net:845"
+code-creation,Function,0x775a20,843,"Stream._shutdown net:885"
+code-creation,Function,0x775e20,248,"Stream.close net:911"
+code-creation,Function,0x730600,359,"Stream.end net:919"
+code-creation,Function,0x72d020,95,"createServer net:978"
+code-creation,Function,0x729ec0,244," net:1014"
+code-creation,Function,0x759d60,535," net:1002"
+code-creation,Function,0x645f60,90," net:1031"
+tick,0x12e50d,0xbfffd1c0,0x0,2,0x64055a,0x59fc90,0x59fee2,0x59e6fd,0x7272d8,0x72e52f,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,Function,0x765780,485," net:1037"
+code-creation,Function,0x75fac0,1054,"Server.listen net:991"
+code-creation,Function,0x64d460,225,"Server._doListen net:1050"
+code-creation,Function,0x741f40,107,"Server.address net:1059"
+code-creation,Function,0x762100,95," net:1074"
+code-creation,Function,0x7607e0,512,"Server.close net:1064"
+code-creation,LazyCompile,0x3194100,9434," net:1"
+function-creation,0x30f4694,0x3194100
+code-creation,KeyedLoadIC,0x775f80,77,"fs"
+code-creation,LoadIC,0x7621a0,62,"exports"
+code-creation,LoadIC,0x773fc0,62,"moduleCache"
+code-creation,LoadIC,0x72cf40,62,"id"
+code-creation,CallIC,0x757f20,148,"_compile"
+code-creation,CallIC,0x737f20,127,"replace"
+code-creation,CallIC,0x72df20,130,"extname"
+code-creation,CallIC,0x72ca40,127,"lastIndexOf"
+code-creation,LoadIC,0x7659e0,73,"process"
+code-creation,Script,0x655f20,99,"utf8decoder"
+code-creation,CallIC,0x647f20,130,"dirname"
+code-creation,CallIC,0x731f80,94,"apply"
+code-creation,Function,0x765f00,154,"Utf8Decoder.exports.Utf8Decoder utf8decoder:3"
+code-creation,Function,0x75d440,2521,"Utf8Decoder.write utf8decoder:9"
+code-creation,LazyCompile,0x59b960,321," utf8decoder:1"
+function-creation,0x30f5bc8,0x59b960
+code-creation,KeyedLoadIC,0x7611c0,77,"buffer"
+code-creation,StoreIC,0x72ec60,118,"loaded"
+code-creation,LoadIC,0x647fc0,62,"moduleCache"
+code-creation,LoadIC,0x655fc0,62,"replaceString"
+code-creation,LoadIC,0x72cae0,62,"subject"
+tick,0x1e1c0e,0xbfffcd60,0x32b747,2,0x64035f,0x59fc90,0x59385b,0x58bfb5,0x31947d8,0x64055a,0x59fc90,0x59fee2,0x59e6fd,0x7272d8,0x72e52f,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,Script,0x599f20,99,"dns"
+code-creation,Function,0x7626c0,616,"updateTimer dns:23"
+code-creation,Function,0x65fa60,1197,"timer.callback dns:10"
+code-creation,Function,0x761dc0,399,"watcher.callback dns:52"
+code-creation,Function,0x6441a0,1164,"channel.dns.Channel.SOCK_STATE_CB dns:40"
+code-creation,Function,0x64a4e0,709,"exports.resolve dns:76"
+code-creation,Function,0x72bf00,118,"exports.getHostByName dns:96"
+code-creation,Function,0x649f00,114," dns:104"
+code-creation,Function,0x730100,350," dns:112"
+code-creation,Function,0x75e100,382," dns:108"
+code-creation,Function,0x651cc0,458,"exports.lookup dns:101"
+code-creation,Function,0x651f20,118,"exports.resolve4 dns:125"
+code-creation,Function,0x75e2e0,118,"exports.resolve6 dns:126"
+code-creation,Function,0x649d60,118,"exports.resolveMx dns:127"
+code-creation,Function,0x72f0a0,118,"exports.resolveTxt dns:128"
+code-creation,Function,0x726640,118,"exports.resolveSrv dns:129"
+code-creation,Function,0x739ea0,118,"exports.reverse dns:130"
+code-creation,Function,0x726100,118,"exports.resolveNs dns:131"
+code-creation,LazyCompile,0x771060,2475," dns:1"
+function-creation,0x30f5d74,0x771060
+tick,0x26b60,0xbfffe3bc,0x805313,3,0x4930,0x7710f9,0x64055a,0x59fc90,0x59385b,0x58bfb5,0x31947d8,0x64055a,0x59fc90,0x59fee2,0x59e6fd,0x7272d8,0x72e52f,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,CallIC,0x726700,89,"Instantiate"
+code-creation,StoreIC,0x653f80,118,"SOCK_STATE_CB"
+tick,0x9728ec6e,0xbfffe23c,0xa08d4517,3,0x15000,0x7712ea,0x64055a,0x59fc90,0x59385b,0x58bfb5,0x31947d8,0x64055a,0x59fc90,0x59fee2,0x59e6fd,0x7272d8,0x72e52f,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,StoreIC,0x64ff80,118,"A"
+code-creation,StoreIC,0x64e400,118,"AAAA"
+code-creation,StoreIC,0x6436e0,118,"MX"
+code-creation,StoreIC,0x59ff80,118,"TXT"
+code-creation,StoreIC,0x59bf80,118,"SRV"
+code-creation,StoreIC,0x585f80,118,"PTR"
+code-creation,StoreIC,0x583f80,118,"NS"
+code-creation,Script,0x7261c0,99,"freelist"
+code-creation,LazyCompile,0x64a100,371," freelist:1"
+function-creation,0x30f795c,0x64a100
+tick,0x96426473,0xbfffe3c0,0xffffffff,3,0x4930,0x319538c,0x64055a,0x59fc90,0x59fee2,0x59e6fd,0x7272d8,0x72e52f,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,CallIC,0x739f60,112,"Instantiate"
+tick,0x20fff,0xbfffe480,0x805313,3,0x4930,0x319538c,0x64055a,0x59fc90,0x59fee2,0x59e6fd,0x7272d8,0x72e52f,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,LazyCompile,0x64a320,158,"exports.FreeList freelist:2"
+code-creation,StoreIC,0x72f160,88,"super_"
+code-creation,StoreIC,0x64dea0,118,"get"
+code-creation,LazyCompile,0x771c60,372,"defineProperty native v8natives.js:675"
+function-creation,0x55b360,0x771c60
+code-creation,LazyCompile,0x659700,1941,"ToPropertyDescriptor native v8natives.js:331"
+function-creation,0x55fdc8,0x659700
+code-creation,LazyCompile,0x72aea0,313,"PropertyDescriptor native v8natives.js:376"
+code-creation,LazyCompile,0x64df20,108,"PropertyDescriptor.setGet native v8natives.js:453"
+function-creation,0x55ea1c,0x64df20
+code-creation,StoreIC,0x76de80,118,"get_"
+code-creation,StoreIC,0x76df00,118,"hasGetter_"
+code-creation,LazyCompile,0x649b40,191,"IsInconsistentDescriptor native v8natives.js:309"
+function-creation,0x560288,0x649b40
+code-creation,LazyCompile,0x771e60,312,"IsAccessorDescriptor native v8natives.js:290"
+function-creation,0x55de4c,0x771e60
+code-creation,LazyCompile,0x72fe60,312,"IsDataDescriptor native v8natives.js:297"
+function-creation,0x55e434,0x72fe60
+tick,0x12e614,0xbfffd960,0x0,2,0x771dbb,0x319595c,0x64055a,0x59fc90,0x59fee2,0x59e6fd,0x7272d8,0x72e52f,0x64055a,0x64075d,0x587f35,0x6418db,0x59f3f9
+code-creation,Stub,0x733c20,177,"GenericBinaryOpStub_BIT_OR_Alloc_NoSmiInStub_StackArgs_SmiType_Default"
+code-creation,LazyCompile,0x313c100,4320,"DefineOwnProperty native v8natives.js:530"
+function-creation,0x55fb68,0x313c100
+code-creation,LazyCompile,0x313d440,1124,"GetOwnProperty native v8natives.js:487"
+function-creation,0x55ab0c,0x313d440
+code-creation,StoreIC,0x313d980,125,"value_"
+code-creation,StoreIC,0x313da20,125,"hasValue_"
+code-creation,StoreIC,0x313dac0,125,"writable_"
+code-creation,StoreIC,0x313db60,125,"hasWritable_"
+code-creation,StoreIC,0x313dc00,125,"enumerable_"
+code-creation,StoreIC,0x313dca0,125,"hasEnumerable_"
+code-creation,StoreIC,0x313dd40,125,"configurable_"
+code-creation,StoreIC,0x313dde0,125,"hasConfigurable_"
+code-creation,StoreIC,0x313de80,125,"get_"
+code-creation,StoreIC,0x313df20,125,"hasGetter_"
+code-creation,StoreIC,0x313e100,125,"set_"
+code-creation,StoreIC,0x313e1a0,125,"hasSetter_"
+code-creation,LazyCompile,0x313e240,122,"PropertyDescriptor.hasEnumerable native v8natives.js:421"
+function-creation,0x55e8e8,0x313e240
+code-creation,LazyCompile,0x313e300,122,"PropertyDescriptor.hasConfigurable native v8natives.js:443"
+function-creation,0x55e920,0x313e300
+code-creation,LazyCompile,0x313e3c0,274,"IsGenericDescriptor native v8natives.js:304"
+function-creation,0x560388,0x313e3c0
+code-creation,LazyCompile,0x313e520,122,"PropertyDescriptor.hasGetter native v8natives.js:464"
+function-creation,0x55ea00,0x313e520
+code-creation,LazyCompile,0x313e5e0,122,"PropertyDescriptor.getGet native v8natives.js:459"
+function-creation,0x55e958,0x313e5e0
+code-creation,LazyCompile,0x313e6a0,122,"PropertyDescriptor.hasSetter native v8natives.js:480"
+function-creation,0x55e8b0,0x313e6a0
+code-creation,LazyCompile,0x313e760,521,"exports.FreeList.alloc freelist:10"
+function-creation,0x19895ec,0x313e760
+code-creation,LoadIC,0x313e9e0,62,"list"
+code-creation,LoadIC,0x313ea20,62,"constructor"
+code-creation,LoadIC,0x313ea60,82,"apply"
+code-creation,StoreIC,0x313eac0,118,"fd"
+code-creation,StoreIC,0x313eb40,118,"readable"
+code-creation,StoreIC,0x313ebc0,121,"writable"
+code-creation,StoreIC,0x313ec40,121,"used"
+tick,0x12cfd1,0xbfffe730,0x0,2,0x59f426
+code-creation,LazyCompile,0x3140100,5338,"process.EventEmitter.emit events:4"
+function-creation,0x710904,0x3140100
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/LICENSE.txt b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/LICENSE.txt
new file mode 100644
index 0000000..0dbd429
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/LICENSE.txt
@@ -0,0 +1,22 @@
+Copyright (c) 2010 Elijah Insua
+
+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/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/README.md b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/README.md
new file mode 100644
index 0000000..d4cf18a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/README.md
@@ -0,0 +1,335 @@
+# jsdom
+
+A JavaScript implementation of the W3C DOM.
+
+## Install
+
+```bash
+$ npm install jsdom
+```
+
+If this gives you trouble with errors about installing Contextify, especially on Windows, see [below](#contextify).
+
+## Human contact
+
+see: [mailing list](http://groups.google.com/group/jsdom)
+
+## Easymode
+
+Bootstrapping a DOM is generally a difficult process involving many error prone steps. We didn't want jsdom to fall into the same trap and that is why a new method, `jsdom.env()`, has been added in jsdom 0.2.0 which should make everyone's lives easier.
+
+You can use it with a URL
+
+```js
+// Count all of the links from the Node.js build page
+var jsdom = require("jsdom");
+
+jsdom.env(
+  "http://nodejs.org/dist/",
+  ["http://code.jquery.com/jquery.js"],
+  function (errors, window) {
+    console.log("there have been", window.$("a").length, "nodejs releases!");
+  }
+);
+```
+
+or with raw HTML
+
+```js
+// Run some jQuery on a html fragment
+var jsdom = require("jsdom");
+
+jsdom.env(
+  '<p><a class="the-link" href="https://github.com/tmpvar/jsdom">jsdom\'s Homepage</a></p>',
+  ["http://code.jquery.com/jquery.js"],
+  function (errors, window) {
+    console.log("contents of a.the-link:", window.$("a.the-link").text());
+  }
+);
+```
+
+or with a configuration object
+
+```js
+// Print all of the news items on hackernews
+var jsdom = require("jsdom");
+
+jsdom.env({
+  url: "http://news.ycombinator.com/",
+  scripts: ["http://code.jquery.com/jquery.js"],
+  done: function (errors, window) {
+    var $ = window.$;
+    console.log("HN Links");
+    $("td.title:not(:last) a").each(function() {
+      console.log(" -", $(this).text());
+    });
+  }
+});
+```
+
+or with raw JavaScript source
+
+```js
+// Print all of the news items on hackernews
+var jsdom = require("jsdom");
+var fs = require("fs");
+var jquery = fs.readFileSync("./jquery.js", "utf-8");
+
+jsdom.env({
+  url: "http://news.ycombinator.com/",
+  src: [jquery],
+  done: function (errors, window) {
+    var $ = window.$;
+    console.log("HN Links");
+    $("td.title:not(:last) a").each(function () {
+      console.log(" -", $(this).text());
+    });
+  }
+});
+```
+
+### How it works
+`jsdom.env` is built for ease of use, which is rare in the world of the DOM! Since the web has some absolutely horrible JavaScript on it, as of jsdom 0.2.0 `jsdom.env` will not process external resources (scripts, images, etc).  If you want to process the JavaScript use one of the methods below (`jsdom.jsdom` or `jsdom.jQueryify`)
+
+```js
+jsdom.env(string, [scripts], [config], callback);
+```
+
+The arguments are:
+
+- `string`: may be a URL, file name, or HTML fragment
+- `scripts`: a string or array of strings, containing file names or URLs that will be inserted as `<script>` tags
+- `config`: see below
+- `callback`: takes two arguments
+  - `error`: either an `Error` object if something failed initializing the window, or an array of error messages from the DOM if there were script errors
+  - `window`: a brand new `window`
+
+_Example:_
+
+```js
+jsdom.env(html, function (errors, window) {
+  // free memory associated with the window
+  window.close();
+});
+```
+
+If you would like to specify a configuration object only:
+
+```js
+jsdom.env(config);
+```
+
+- `config.html`: a HTML fragment
+- `config.file`: a file which jsdom will load HTML from; the resulting window's `location.href` will be a `file://` URL.
+- `config.url`: sets the resulting window's `location.href`; if `config.html` and `config.file` are not provided, jsdom will load HTML from this URL.
+- `config.scripts`: see `scripts` above.
+- `config.src`: an array of JavaScript strings that will be evaluated against the resulting document. Similar to `scripts`, but it accepts JavaScript instead of paths/URLs.
+- `config.done`: see `callback` above.
+- `config.document`:
+  - `referer`: the new document will have this referer.
+  - `cookie`: manually set a cookie value, e.g. `'key=value; expires=Wed, Sep 21 2011 12:00:00 GMT; path=/'`.
+  - `cookieDomain`: a cookie domain for the manually set cookie; defaults to `127.0.0.1`.
+- `config.features` : see `Flexibility` section below. **Note**: the default feature set for jsdom.env does _not_ include fetching remote JavaScript and executing it. This is something that you will need to **carefully** enable yourself.
+
+Note that `config.done` is required, as is one of `config.html`, `config.file`, or `config.url`.
+
+## For the hardcore
+
+If you want to spawn a document/window and specify all sorts of options this is the section for you. This section covers the `jsdom.jsdom` method:
+
+```js
+var jsdom = require("jsdom").jsdom;
+var doc = jsdom(markup, level, options);
+var window = doc.parentWindow;
+```
+
+- `markup` is an HTML/XML document to be parsed. You can also pass `null` or an undefined value to get a basic document with empty `<head>` and `<body>` tags. Document fragments are also supported (including `""`), and will behave as sanely as possible (e.g. the resulting document will lack the `head`, `body` and `documentElement` properties if the corresponding elements aren't included).
+
+- `level` is `null` (which means level3) by default, but you can pass another level if you'd like.
+
+  ```js
+  var jsdom = require("jsdom");
+  var doc = jsdom.jsdom("<html><body></body></html>", jsdom.level(1, "core"));
+  ```
+
+- `options` see the **Flexibility** section below.
+
+### Flexibility
+
+One of the goals of jsdom is to be as minimal and light as possible. This section details how someone can change the behavior of `Document`s on the fly.  These features are baked into the `DOMImplementation` that every `Document` has, and may be tweaked in two ways:
+
+1. When you create a new `Document` using the jsdom builder (`require("jsdom").jsdom()`)
+
+  ```js
+  var jsdom = require("jsdom").jsdom;
+  var doc = jsdom("<html><body></body></html>", null, {
+      features: {
+        FetchExternalResources : ["img"]
+      }
+  });
+  ```
+
+  Do note, that this will only affect the document that is currently being created. All other documents will use the defaults specified below (see: Default Features).
+
+2. Before creating any documents, you can modify the defaults for all future documents:
+
+  ```js
+  require("jsdom").defaultDocumentFeatures = {
+      FetchExternalResources: ["script"],
+      ProcessExternalResources: false
+  };
+  ```
+
+#### Default Features
+
+Default features are extremely important for jsdom as they lower the configuration requirement and present developers a set of consistent default behaviors. The following sections detail the available features, their defaults, and the values that jsdom uses.
+
+
+`FetchExternalResources`
+
+- _Default_: `["script"]`
+- _Allowed_: `["script", "img", "css", "frame", "iframe", "link"]` or `false`
+
+Enables/disables fetching files over the file system/HTTP.
+
+`ProcessExternalResources`
+
+- _Default_: `["script"]`
+- _Allowed_: `["script"]` or `false`
+
+Disabling this will disable script execution (currently only JavaScript).
+
+`SkipExternalResources`
+
+- _Default_: `false`
+- _Allowed_: `/url to be skipped/` or `false`
+- _Example_: `/http:\/\/example.org/js/bad\.js/`
+
+Do not download and process resources with url matching a regular expression.
+
+### Canvas
+
+jsdom includes support for using the [canvas](https://npmjs.org/package/canvas) package to extend any `<canvas>` elements with the canvas API. To make this work, you need to include canvas as a dependency in your project, as a peer of jsdom. If jsdom can find the canvas package, it will use it, but if it's not present, then `<canvas>` elements will behave like `<div>`s.
+
+## More Examples
+
+### Creating a document
+
+```js
+var jsdom = require("jsdom");
+var doc = new (jsdom.level(1, "core").Document)();
+
+console.log(doc.nodeName); // outputs: #document
+```
+
+### Creating a browser-like BOM/DOM/Window
+
+```js
+var jsdom = require("jsdom").jsdom;
+var document = jsdom("<html><head></head><body>hello world</body></html>");
+var window = document.parentWindow;
+
+console.log(window.document.innerHTML);
+// output: "<html><head></head><body>hello world</body></html>"
+
+console.log(window.innerWidth);
+// output: 1024
+
+console.log(typeof window.document.getElementsByClassName);
+// outputs: function
+```
+
+### jQueryify
+
+```js
+var jsdom = require("jsdom");
+var window = jsdom.jsdom().parentWindow;
+
+jsdom.jQueryify(window, "http://code.jquery.com/jquery.js", function () {
+  window.$("body").append('<div class="testing">Hello World, It works</div>');
+
+  console.log(window.$(".testing").text());
+});
+```
+
+### Passing objects to scripts inside the page
+
+```js
+var jsdom = require("jsdom").jsdom;
+var window = jsdom().parentWindow;
+
+window.__myObject = { foo: "bar" };
+
+var scriptEl = window.document.createElement("script");
+scriptEl.src = "anotherScript.js";
+window.document.body.appendChild(scriptEl);
+
+// anotherScript.js will have the ability to read `window.__myObject`, even
+// though it originated in Node!
+```
+
+## Test Compliance:
+
+```
+ level1/core         535/535      100%
+ level1/html         238/238      100%
+ level1/svg          527/527      100%
+ level2/core         283/283      100%
+ level2/html         707/707      100%
+ level2/style          15/15      100%
+ level2/extra            4/4      100%
+ level2/events         24/24      100%
+ level3/xpath          93/93      100%
+ window/index            7/7      100%
+ window/history          5/5      100%
+ window/script         10/10      100%
+ window/console          2/2      100%
+ window/frame          16/16      100%
+ sizzle/index          14/14      100%
+ jsdom/index           76/76      100%
+ jsdom/parsing         11/11      100%
+ jsdom/env             25/25      100%
+ jsonp/jsonp             1/1      100%
+ browser/index         34/34      100%
+---------------------------------------
+TOTALS: 0/2627 failed; 100% success
+```
+
+### Running the tests
+
+First you'll want to `npm install`. To run all the tests, use `npm test`, which just calls `node test/runner`.
+
+Using `test/runner` directly, you can slice and dice which tests your want to run from different levels. Usage is as follows:
+
+```
+test/runner --help
+Run the jsdom test suite
+
+Options:
+-s, --suites     suites that you want to run. ie: -s level1/core,1/html,html [string]
+-f, --fail-fast  stop on the first failed test
+-h, --help       show the help
+-t, --tests      choose the test cases to run. ie: -t jquery
+```
+
+## Contextify
+
+[Contextify](https://npmjs.org/package/contextify) is a dependency of jsdom, used for running `<script>` tags within the
+page. In other words, it allows jsdom, which is run in Node.js, to run strings of JavaScript in an isolated environment
+that pretends to be a browser environment instead of a server. You can see how this is an important feature.
+
+Unfortunately, doing this kind of magic requires C++. And in Node.js, using C++ from JavaScript means using "native
+modules." Native modules are compiled at installation time so that they work precisely for your machine; that is, you
+don't download a contextify binary from npm, but instead build one locally after downloading the source from npm.
+
+For Mac and Linux users, this is usually fine. Their systems come preinstalled with the necessaries for compiling C++.
+For Windows users, however, things can be tricky. Thus, one of the most common problems with jsdom is trying to use it
+on Windows without the proper compilation tools installed. Here's what you need to compile Contextify, and thus to
+install jsdom, on Windows:
+
+* A recent copy of the *x86* version of [Node.js for Windows](http://nodejs.org/download/), *not* the x64 version.
+* A copy of [Visual C++ 2010 Express](http://www.microsoft.com/visualstudio/eng/downloads#d-2010-express).
+* A copy of [Python 2.7](http://www.python.org/download/), installed in the default location of `C:\Python27`.
+
+There are some slight modifications to this that can work; for example full versions of Visual Studio usually work, and
+sometimes you can even get an x64 version of Node.js working too. But it's tricky, so start with the basics!
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom.js
new file mode 100644
index 0000000..0751f7d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom.js
@@ -0,0 +1,364 @@
+var fs = require('fs');
+var path = require('path');
+var URL = require('url');
+var request = require('request');
+var pkg = require('../package.json');
+
+var toFileUrl = require('./jsdom/utils').toFileUrl;
+var style = require('./jsdom/level2/style');
+var features = require('./jsdom/browser/documentfeatures');
+var dom = exports.dom = require('./jsdom/level3/index').dom;
+var createWindow = exports.createWindow = require('./jsdom/browser/index').createWindow;
+
+exports.defaultLevel = dom.level3.html;
+exports.browserAugmentation = require('./jsdom/browser/index').browserAugmentation;
+exports.windowAugmentation = require('./jsdom/browser/index').windowAugmentation;
+
+// Proxy feature functions to features module.
+['availableDocumentFeatures',
+ 'defaultDocumentFeatures',
+ 'applyDocumentFeatures'].forEach(function (propName) {
+  exports.__defineGetter__(propName, function () {
+    return features[propName];
+  });
+  exports.__defineSetter__(propName, function (val) {
+    return features[propName] = val;
+  });
+});
+
+exports.debugMode = false;
+
+exports.__defineGetter__('version', function() {
+  return pkg.version;
+});
+
+exports.level = function (level, feature) {
+	if(!feature) {
+    feature = 'core';
+  }
+
+	return require('./jsdom/level' + level + '/' + feature).dom['level' + level][feature];
+};
+
+exports.jsdom = function (html, level, options) {
+
+  options = options || {};
+  if(typeof level == 'string') {
+    level = exports.level(level, 'html');
+  } else {
+    level   = level || exports.defaultLevel;
+  }
+
+  if (!options.url) {
+    options.url = (module.parent.id === 'jsdom') ?
+                  module.parent.parent.filename  :
+                  module.parent.filename;
+    options.url = options.url.replace(/\\/g, '/');
+    if (options.url[0] !== '/') {
+      options.url = '/' + options.url;
+    }
+    options.url = 'file://' + options.url;
+  }
+
+  var browser = exports.browserAugmentation(level, options),
+      doc     = (browser.HTMLDocument)             ?
+                 new browser.HTMLDocument(options) :
+                 new browser.Document(options);
+
+  require('./jsdom/selectors/index').applyQuerySelectorPrototype(level);
+
+  features.applyDocumentFeatures(doc, options.features);
+
+  if (typeof html === 'undefined' || html === null) {
+    doc.write('<html><head></head><body></body></html>');
+  } else {
+    doc.write(html + '');
+  }
+
+  if (doc.close && !options.deferClose) {
+    doc.close();
+  }
+
+  // Kept for backwards-compatibility. The window is lazily created when
+  // document.parentWindow or document.defaultView is accessed.
+  doc.createWindow = function() {
+    // Remove ourself
+    if (doc.createWindow) {
+      delete doc.createWindow;
+    }
+    return doc.parentWindow;
+  };
+
+  return doc;
+};
+
+exports.html = function(html, level, options) {
+  html += '';
+
+  // TODO: cache a regex and use it here instead
+  //       or make the parser handle it
+  var htmlLowered = html.toLowerCase();
+
+  // body
+  if (!~htmlLowered.indexOf('<body')) {
+    html = '<body>' + html + '</body>';
+  }
+
+  // html
+  if (!~htmlLowered.indexOf('<html')) {
+    html = '<html>' + html + '</html>';
+  }
+  return exports.jsdom(html, level, options);
+};
+
+exports.jQueryify = exports.jsdom.jQueryify = function (window /* path [optional], callback */) {
+
+  if (!window || !window.document) { return; }
+
+  var args = Array.prototype.slice.call(arguments),
+      callback = (typeof(args[args.length - 1]) === 'function') && args.pop(),
+      path,
+      jQueryTag = window.document.createElement('script');
+      jQueryTag.className = 'jsdom';
+
+  if (args.length > 1 && typeof(args[1] === 'string')) {
+    path = args[1];
+  }
+
+  var features = window.document.implementation._features;
+
+  window.document.implementation.addFeature('FetchExternalResources', ['script']);
+  window.document.implementation.addFeature('ProcessExternalResources', ['script']);
+  window.document.implementation.addFeature('MutationEvents', ['2.0']);
+  jQueryTag.src = path || 'http://code.jquery.com/jquery-latest.js';
+  window.document.body.appendChild(jQueryTag);
+
+  jQueryTag.onload = function() {
+    if (callback) {
+      callback(window, window.jQuery);
+    }
+
+    window.document.implementation._features = features;
+  };
+
+  return window;
+};
+
+
+exports.env = exports.jsdom.env = function () {
+  var config = getConfigFromArguments(arguments);
+  var callback = config.done;
+
+  if (config.file) {
+    fs.readFile(config.file, 'utf-8', function (err, text) {
+      if (err) {
+        return callback(err);
+      }
+
+      config.html = text;
+      processHTML(config);
+    });
+  } else if (config.html) {
+    processHTML(config);
+  } else if (config.url) {
+    handleUrl(config);
+  } else if (config.somethingToAutodetect) {
+    var url = URL.parse(config.somethingToAutodetect);
+    if (url.protocol && url.hostname) {
+      config.url = config.somethingToAutodetect;
+      handleUrl(config.somethingToAutodetect);
+    } else {
+      fs.readFile(config.somethingToAutodetect, 'utf-8', function (err, text) {
+        if (err) {
+          if (err.code === 'ENOENT' || err.code === 'ENAMETOOLONG') {
+            config.html = config.somethingToAutodetect;
+            processHTML(config);
+          } else {
+            callback(err);
+          }
+        } else {
+          config.html = text;
+          config.url = toFileUrl(config.somethingToAutodetect);
+          processHTML(config);
+        }
+      });
+    }
+  }
+
+  function handleUrl() {
+    var options = {
+      uri: config.url,
+      encoding: config.encoding || 'utf8',
+      headers: config.headers || {},
+      proxy: config.proxy || null
+    };
+
+    request(options, function (err, res, responseText) {
+      if (err) {
+        return callback(err);
+      }
+
+      // The use of `res.request.uri.href` ensures that `window.location.href`
+      // is updated when `request` follows redirects.
+      config.html = responseText;
+      config.url = res.request.uri.href;
+      processHTML(config);
+    });
+  }
+};
+
+function processHTML(config) {
+  var callback = config.done;
+  var options = {
+    features: config.features,
+    url: config.url,
+    parser: config.parser
+  };
+
+  if (config.document) {
+    options.referrer = config.document.referrer;
+    options.cookie = config.document.cookie;
+    options.cookieDomain = config.document.cookieDomain;
+  }
+
+  var window = exports.html(config.html, null, options).createWindow();
+  var features = JSON.parse(JSON.stringify(window.document.implementation._features));
+
+  var docsLoaded = 0;
+  var totalDocs = config.scripts.length + config.src.length;
+  var readyState = null;
+  var errors = [];
+
+  if (!window || !window.document) {
+    return callback(new Error('JSDOM: a window object could not be created.'));
+  }
+
+  window.document.implementation.addFeature('FetchExternalResources', ['script']);
+  window.document.implementation.addFeature('ProcessExternalResources', ['script']);
+  window.document.implementation.addFeature('MutationEvents', ['2.0']);
+
+  function scriptComplete() {
+    docsLoaded++;
+
+    if (docsLoaded >= totalDocs) {
+      window.document.implementation._features = features;
+
+      errors = errors.concat(window.document.errors || []);
+      if (errors.length === 0) {
+        errors = null;
+      }
+
+      process.nextTick(function() {
+        callback(errors, window);
+      });
+    }
+  }
+
+  function handleScriptError(e) {
+    if (!errors) {
+      errors = [];
+    }
+    errors.push(e.error || e.message);
+
+    // nextTick so that an exception within scriptComplete won't cause
+    // another script onerror (which would be an infinite loop)
+    process.nextTick(scriptComplete);
+  }
+
+  if (config.scripts.length > 0 || config.src.length > 0) {
+    config.scripts.forEach(function (scriptSrc) {
+      var script = window.document.createElement('script');
+      script.className = 'jsdom';
+      script.onload = scriptComplete;
+      script.onerror = handleScriptError;
+      script.src = scriptSrc;
+
+      try {
+        // protect against invalid dom
+        // ex: http://www.google.com/foo#bar
+        window.document.documentElement.appendChild(script);
+      } catch (e) {
+        handleScriptError(e);
+      }
+    });
+
+    config.src.forEach(function (scriptText) {
+      var script = window.document.createElement('script');
+      script.onload = scriptComplete;
+      script.onerror = handleScriptError;
+      script.text = scriptText;
+
+      window.document.documentElement.appendChild(script);
+      window.document.documentElement.removeChild(script);
+    });
+  } else {
+    scriptComplete();
+  }
+}
+
+function getConfigFromArguments(args, callback) {
+  var config = {};
+  if (typeof args[0] === 'object') {
+    var configToClone = args[0];
+    Object.keys(configToClone).forEach(function (key) {
+      config[key] = configToClone[key];
+    });
+  } else {
+    var stringToAutodetect = null;
+
+    Array.prototype.forEach.call(args, function (arg) {
+      switch (typeof arg) {
+        case 'string':
+          config.somethingToAutodetect = arg;
+          break;
+        case 'function':
+          config.done = arg;
+          break;
+        case 'object':
+          if (Array.isArray(arg)) {
+            config.scripts = arg;
+          } else {
+            extend(config, arg);
+          }
+          break;
+      }
+    });
+  }
+
+  if (!config.done) {
+    throw new Error('Must pass a "done" option or a callback to jsdom.env.');
+  }
+
+  if (!config.somethingToAutodetect && !config.html && !config.file && !config.url) {
+    throw new Error('Must pass a "html", "file", or "url" option, or a string, to jsdom.env');
+  }
+
+  config.scripts = ensureArray(config.scripts);
+  config.src = ensureArray(config.src);
+
+  config.features = config.features || {
+    FetchExternalResources: false,
+    ProcessExternalResources: false,
+    SkipExternalResources: false
+  };
+
+  if (!config.url && config.file) {
+    config.url = toFileUrl(config.file);
+  }
+
+  return config;
+}
+
+function ensureArray(value) {
+  var array = value || [];
+  if (typeof array === 'string') {
+    array = [array];
+  }
+  return array;
+}
+
+function extend(config, overrides) {
+  Object.keys(overrides).forEach(function (key) {
+    config[key] = overrides[key];
+  });
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/browser/documentfeatures.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/browser/documentfeatures.js
new file mode 100644
index 0000000..2673631
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/browser/documentfeatures.js
@@ -0,0 +1,52 @@
+exports.availableDocumentFeatures = [
+  'FetchExternalResources',
+  'ProcessExternalResources',
+  'MutationEvents',
+  'SkipExternalResources'
+];
+
+exports.defaultDocumentFeatures = {
+  "FetchExternalResources": ['script', 'link'/*, 'img', 'css', 'frame'*/],
+  "ProcessExternalResources": ['script'/*, 'frame', 'iframe'*/],
+  "MutationEvents": '2.0',
+  "SkipExternalResources": false
+};
+
+exports.applyDocumentFeatures = function(doc, features) {
+  var i, maxFeatures = exports.availableDocumentFeatures.length,
+      defaultFeatures = exports.defaultDocumentFeatures,
+      j,
+      k,
+      featureName,
+      featureSource;
+
+  features = features || {};
+
+  for (i=0; i<maxFeatures; i++) {
+    featureName = exports.availableDocumentFeatures[i];
+    if (typeof features[featureName] !== 'undefined') {
+      featureSource = features[featureName];
+    // We have to check the lowercase version also because the Document feature
+    // methods convert everything to lowercase.
+    } else if (typeof features[featureName.toLowerCase()] !== 'undefined') {
+      featureSource = features[featureName.toLowerCase()];
+    } else if (defaultFeatures[featureName]) {
+      featureSource = defaultFeatures[featureName];
+    } else {
+      continue;
+    }
+
+    doc.implementation.removeFeature(featureName);
+
+    if (typeof featureSource !== 'undefined') {
+      if (featureSource instanceof Array) {
+        k = featureSource.length;
+        for (j=0; j<k; j++) {
+          doc.implementation.addFeature(featureName, featureSource[j]);
+        }
+      } else {
+        doc.implementation.addFeature(featureName, featureSource);
+      }
+    }
+  }
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/browser/domtohtml.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/browser/domtohtml.js
new file mode 100644
index 0000000..4c69858
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/browser/domtohtml.js
@@ -0,0 +1,174 @@
+//List from node-htmlparser
+var singleTags = {
+  area: 1,
+  base: 1,
+  basefont: 1,
+  br: 1,
+  col: 1,
+  frame: 1,
+  hr: 1,
+  img: 1,
+  input: 1,
+  isindex: 1,
+  link: 1,
+  meta: 1,
+  param: 1,
+  embed: 1
+};
+
+var expr = {
+  upperCaseChars: /([A-Z])/g,
+  breakBetweenTags: /(<(\/?\w+).*?>)(?=<(?!\/\2))/gi,
+  singleTag: (function() {
+    var tags = [];
+    for (var i in singleTags) {
+      tags.push(i);
+    }
+    return new RegExp('<' + tags.join('|<'), 'i');
+  })()
+};
+
+var uncanon = function(str, letter) {
+  return '-' + letter.toLowerCase();
+};
+
+var HTMLEncode = require('./htmlencoding').HTMLEncode;
+
+exports.stringifyElement = function stringifyElement(element) {
+  var tagName = element.tagName.toLowerCase(),
+      ret = {
+        start: "<" + tagName,
+        end:''
+      },
+      attributes = [],
+      i,
+      attribute = null;
+
+  if (element.attributes.length) {
+    ret.start += " ";
+    for (i = 0; i<element.attributes.length; i++) {
+      attribute = element.attributes.item(i);
+      attributes.push(attribute.name + '="' +
+                      HTMLEncode(attribute.nodeValue, true) + '"');
+    }
+  }
+  ret.start += attributes.join(" ");
+
+  if (singleTags[tagName]) {
+    ret.start += " />";
+    ret.end = '';
+  } else {
+    ret.start += ">";
+    ret.end = "</" + tagName + ">";
+  }
+
+  return ret;
+};
+
+var rawTextElements = /SCRIPT|STYLE/i;
+
+function stringifyDoctype (doctype) {
+  if (doctype.ownerDocument && doctype.ownerDocument._fullDT) {
+    return doctype.ownerDocument._fullDT;
+  }
+
+  var dt = '<!DOCTYPE ' + doctype.name;
+  if (doctype.publicId) {
+    // Public ID may never contain double quotes, so this is always safe.
+    dt += ' PUBLIC "' + doctype.publicId + '" ';
+  }
+  if (!doctype.publicId && doctype.systemId) {
+    dt += ' SYSTEM ';
+  }
+  if (doctype.systemId) {
+    // System ID may contain double quotes OR single quotes, not never both.
+    if (doctype.systemId.indexOf('"') > -1) {
+      dt += "'" + doctype.systemId + "'";
+    } else {
+      dt += '"' + doctype.systemId + '"';
+    }
+  }
+  dt += '>';
+  return dt;
+}
+
+exports.makeHtmlGenerator = function makeHtmlGenerator(indentUnit, eol) {
+  indentUnit = indentUnit || "";
+  eol = eol || "";
+
+  return function generateHtmlRecursive(node, rawText, curIndent) {
+    var ret = "", parent, current, i;
+    curIndent = curIndent || "";
+    if (node) {
+      if (node.nodeType &&
+          node.nodeType === node.ENTITY_REFERENCE_NODE) {
+        node = node._entity;
+      }
+
+      var childNodesRawText = rawText || rawTextElements.test(node.nodeName);
+
+      switch (node.nodeType) {
+        case node.ELEMENT_NODE:
+          current = exports.stringifyElement(node);
+          if (childNodesRawText) {
+            ret += curIndent + current.start;
+          } else {
+            ret += curIndent + current.start;
+          }
+          var len = node._childNodes.length;
+          if (len > 0) {
+            if (node._childNodes[0].nodeType !== node.TEXT_NODE) {
+              ret += eol;
+            }
+            for (i=0; i<len; i++) {
+              ret += generateHtmlRecursive(node._childNodes[i], childNodesRawText, curIndent + indentUnit);
+            }
+            if (node._childNodes[len - 1].nodeType !== node.TEXT_NODE) {
+              ret += curIndent;
+            }
+            ret += current.end + eol;
+          } else {
+            ret += ((rawText ? node.nodeValue : HTMLEncode(node.nodeValue, false)) || '') + current.end + eol;
+          }
+          break;
+        case node.TEXT_NODE:
+          // Skip pure whitespace nodes if we're indenting
+          if (!indentUnit || !/^[\s\n]*$/.test(node.nodeValue)) {
+            ret += (rawText ? node.nodeValue : HTMLEncode(node.nodeValue, false)) || '';
+          }
+          break;
+        case node.COMMENT_NODE:
+          ret += curIndent + '<!--' + node.nodeValue + '-->' + eol;
+          break;
+        case node.DOCUMENT_NODE:
+          for (i=0; i<node._childNodes.length; i++) {
+            ret += generateHtmlRecursive(node._childNodes[i], childNodesRawText, curIndent);
+          }
+          break;
+        case node.DOCUMENT_TYPE_NODE:
+          ret += stringifyDoctype(node);
+        break;
+      }
+    }
+    return ret;
+  };
+};
+
+exports.domToHtml = function(dom, noformat, raw) {
+  var htmlGenerator = exports.makeHtmlGenerator(noformat ? "" : "  ",
+                                                noformat ? "" : "\n");
+  if (dom._toArray) {
+    // node list
+    dom = dom._toArray();
+  }
+  if (typeof dom.length !== 'undefined') {
+    var ret = "";
+    for (var i=0,len=dom.length; i<len; i++) {
+      ret += htmlGenerator(dom[i], raw);
+    }
+    return ret;
+  } else {
+    // single node
+    return htmlGenerator(dom, raw);
+  }
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/browser/history.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/browser/history.js
new file mode 100644
index 0000000..3b8bb65
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/browser/history.js
@@ -0,0 +1,99 @@
+"use strict";
+
+function StateEntry(data, title, url) {
+  this.data = data;
+  this.title = title;
+  this.url = url;
+}
+
+module.exports = History;
+
+function History(window) {
+  this._states = [];
+  this._index = -1;
+  this._window = window;
+  this._location = window.location;
+}
+
+History.prototype = {
+  constructor: History,
+
+  get length() {
+    return this._states.length;
+  },
+
+  get state() {
+    var state = this._states[this._index];
+    return state ? state.data : null;
+  },
+
+  back: function () {
+    this.go(-1);
+  },
+
+  forward: function () {
+    this.go(1);
+  },
+
+  go: function (delta) {
+    if (typeof delta === "undefined" || delta === 0) {
+      this._location.reload();
+      return;
+    }
+
+    var newIndex = this._index + delta;
+
+    if (newIndex < 0 || newIndex >= this.length) {
+      return;
+    }
+
+    this._index = newIndex;
+    this._applyState(this._states[this._index]);
+  },
+
+  pushState: function (data, title, url) {
+    var state = new StateEntry(data, title, url);
+    if (this._index + 1 !== this._states.length) {
+      this._states = this._states.slice(0, this._index + 1);
+    }
+    this._states.push(state);
+    this._applyState(state);
+    this._index++;
+  },
+
+  replaceState: function (data, title, url) {
+    var state = new StateEntry(data, title, url);
+    this._states[this._index] = state;
+    this._applyState(state);
+  },
+
+  _applyState: function(state) {
+    var url = state.url;
+    var pathname;
+
+    // Absolute path
+    if (state.url.charAt(0) === "/") {
+      pathname = state.url;
+    } else {
+      pathname = [this._location.pathname, state.url].join("/");
+    }
+
+    this._location._url.pathname = pathname;
+    this._signalPopstate(state);
+  },
+
+  _signalPopstate: function(state) {
+    if (this._window.document) {
+      var ev = this._window.document.createEvent("HTMLEvents");
+      ev.initEvent("popstate", false, false);
+      ev.state = state.data;
+      process.nextTick(function () {
+        this._window.dispatchEvent(ev);
+      }.bind(this));
+    }
+  },
+
+  toString: function () {
+    return "[object History]";
+  }
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/browser/htmlencoding.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/browser/htmlencoding.js
new file mode 100644
index 0000000..8feb7a9
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/browser/htmlencoding.js
@@ -0,0 +1,1506 @@
+var charByEntityName = {
+  'quot': '"',
+  'amp': '&',
+  'apos': '\'',
+  'lt': '<',
+  'gt': '>',
+  'nbsp': ' ',
+  'iexcl': '¡',
+  'cent': '¢',
+  'pound': '£',
+  'curren': '¤',
+  'yen': '¥',
+  'brvbar': '¦',
+  'sect': '§',
+  'uml': '¨',
+  'copy': '©',
+  'ordf': 'ª',
+  'laquo': '«',
+  'not': '¬',
+  'shy': '­',
+  'reg': '®',
+  'macr': '¯', // http://www.w3.org/TR/html4/sgml/entities.html
+  'strns': '¯', // http://www.w3.org/TR/html5/named-character-references.html
+  'deg': '°',
+  'plusmn': '±', // http://www.w3.org/TR/html4/sgml/entities.html
+  'pm': '±', // http://www.w3.org/TR/html5/named-character-references.html
+  'sup2': '²',
+  'sup3': '³',
+  'acute': '´',
+  'micro': 'µ',
+  'para': '¶',
+  'middot': '·',
+  'cedil': '¸',
+  'sup1': '¹',
+  'ordm': 'º',
+  'raquo': '»',
+  'frac14': '¼',
+  'half': '½', // http://www.w3.org/TR/html4/sgml/entities.html
+  'frac12': '½', // http://www.w3.org/TR/html5/named-character-references.html
+  'frac34': '¾',
+  'iquest': '¿',
+  'Agrave': 'À',
+  'Aacute': 'Á',
+  'Acirc': 'Â',
+  'Atilde': 'Ã',
+  'Auml': 'Ä',
+  'Aring': 'Å', // http://www.w3.org/TR/html4/sgml/entities.html
+  'angst': 'Å', // http://www.w3.org/TR/html5/named-character-references.html
+  'AElig': 'Æ',
+  'Ccedil': 'Ç',
+  'Egrave': 'È',
+  'Eacute': 'É',
+  'Ecirc': 'Ê',
+  'Euml': 'Ë',
+  'Igrave': 'Ì',
+  'Iacute': 'Í',
+  'Icirc': 'Î',
+  'Iuml': 'Ï',
+  'ETH': 'Ð',
+  'Ntilde': 'Ñ',
+  'Ograve': 'Ò',
+  'Oacute': 'Ó',
+  'Ocirc': 'Ô',
+  'Otilde': 'Õ',
+  'Ouml': 'Ö',
+  'times': '×',
+  'Oslash': 'Ø',
+  'Ugrave': 'Ù',
+  'Uacute': 'Ú',
+  'Ucirc': 'Û',
+  'Uuml': 'Ü',
+  'Yacute': 'Ý',
+  'THORN': 'Þ',
+  'szlig': 'ß',
+  'agrave': 'à',
+  'aacute': 'á',
+  'acirc': 'â',
+  'atilde': 'ã',
+  'auml': 'ä',
+  'aring': 'å',
+  'aelig': 'æ',
+  'ccedil': 'ç',
+  'egrave': 'è',
+  'eacute': 'é',
+  'ecirc': 'ê',
+  'euml': 'ë',
+  'igrave': 'ì',
+  'iacute': 'í',
+  'icirc': 'î',
+  'iuml': 'ï',
+  'eth': 'ð',
+  'ntilde': 'ñ',
+  'ograve': 'ò',
+  'oacute': 'ó',
+  'ocirc': 'ô',
+  'otilde': 'õ',
+  'ouml': 'ö',
+  'divide': '÷',
+  'oslash': 'ø',
+  'ugrave': 'ù',
+  'uacute': 'ú',
+  'ucirc': 'û',
+  'uuml': 'ü',
+  'yacute': 'ý',
+  'thorn': 'þ',
+  'yuml': 'ÿ',
+  'Amacr': 'Ā',
+  'amacr': 'ā',
+  'Abreve': 'Ă',
+  'abreve': 'ă',
+  'Aogon': 'Ą',
+  'aogon': 'ą',
+  'Cacute': 'Ć',
+  'cacute': 'ć',
+  'Ccirc': 'Ĉ',
+  'ccirc': 'ĉ',
+  'Cdot': 'Ċ',
+  'cdot': 'ċ',
+  'Ccaron': 'Č',
+  'ccaron': 'č',
+  'Dcaron': 'Ď',
+  'dcaron': 'ď',
+  'Dstrok': 'Đ',
+  'dstrok': 'đ',
+  'Emacr': 'Ē',
+  'emacr': 'ē',
+  'Edot': 'Ė',
+  'edot': 'ė',
+  'Eogon': 'Ę',
+  'eogon': 'ę',
+  'Ecaron': 'Ě',
+  'ecaron': 'ě',
+  'Gcirc': 'Ĝ',
+  'gcirc': 'ĝ',
+  'Gbreve': 'Ğ',
+  'gbreve': 'ğ',
+  'Gdot': 'Ġ',
+  'gdot': 'ġ',
+  'Gcedil': 'Ģ',
+  'Hcirc': 'Ĥ',
+  'hcirc': 'ĥ',
+  'Hstrok': 'Ħ',
+  'hstrok': 'ħ',
+  'Itilde': 'Ĩ',
+  'itilde': 'ĩ',
+  'Imacr': 'Ī',
+  'imacr': 'ī',
+  'Iogon': 'Į',
+  'iogon': 'į',
+  'Idot': 'İ',
+  'inodot': 'ı',
+  'IJlig': 'IJ',
+  'ijlig': 'ij',
+  'Jcirc': 'Ĵ',
+  'jcirc': 'ĵ',
+  'Kcedil': 'Ķ',
+  'kcedil': 'ķ',
+  'kgreen': 'ĸ',
+  'Lacute': 'Ĺ',
+  'lacute': 'ĺ',
+  'Lcedil': 'Ļ',
+  'lcedil': 'ļ',
+  'Lcaron': 'Ľ',
+  'lcaron': 'ľ',
+  'Lmidot': 'Ŀ',
+  'lmidot': 'ŀ',
+  'Lstrok': 'Ł',
+  'lstrok': 'ł',
+  'Nacute': 'Ń',
+  'nacute': 'ń',
+  'Ncedil': 'Ņ',
+  'ncedil': 'ņ',
+  'Ncaron': 'Ň',
+  'ncaron': 'ň',
+  'napos': 'ʼn',
+  'ENG': 'Ŋ',
+  'eng': 'ŋ',
+  'Omacr': 'Ō',
+  'omacr': 'ō',
+  'Odblac': 'Ő',
+  'odblac': 'ő',
+  'OElig': 'Œ',
+  'oelig': 'œ',
+  'Racute': 'Ŕ',
+  'racute': 'ŕ',
+  'Rcedil': 'Ŗ',
+  'rcedil': 'ŗ',
+  'Rcaron': 'Ř',
+  'rcaron': 'ř',
+  'Sacute': 'Ś',
+  'sacute': 'ś',
+  'Scirc': 'Ŝ',
+  'scirc': 'ŝ',
+  'Scedil': 'Ş',
+  'scedil': 'ş',
+  'Scaron': 'Š',
+  'scaron': 'š',
+  'Tcedil': 'Ţ',
+  'tcedil': 'ţ',
+  'Tcaron': 'Ť',
+  'tcaron': 'ť',
+  'Tstrok': 'Ŧ',
+  'tstrok': 'ŧ',
+  'Utilde': 'Ũ',
+  'utilde': 'ũ',
+  'Umacr': 'Ū',
+  'umacr': 'ū',
+  'Ubreve': 'Ŭ',
+  'ubreve': 'ŭ',
+  'Uring': 'Ů',
+  'uring': 'ů',
+  'Udblac': 'Ű',
+  'udblac': 'ű',
+  'Uogon': 'Ų',
+  'uogon': 'ų',
+  'Wcirc': 'Ŵ',
+  'wcirc': 'ŵ',
+  'Ycirc': 'Ŷ',
+  'ycirc': 'ŷ',
+  'Yuml': 'Ÿ',
+  'Zacute': 'Ź',
+  'zacute': 'ź',
+  'Zdot': 'Ż',
+  'zdot': 'ż',
+  'Zcaron': 'Ž',
+  'zcaron': 'ž',
+  'fnof': 'ƒ',
+  'imped': 'Ƶ',
+  'gacute': 'ǵ',
+  'jmath': 'ȷ',
+  'circ': 'ˆ',
+  'caron': 'ˇ',
+  'breve': '˘',
+  'dot': '˙',
+  'ring': '˚',
+  'ogon': '˛',
+  'tilde': '˜',
+  'dblac': '˝',
+  'Alpha': 'Α',
+  'Beta': 'Β',
+  'Gamma': 'Γ',
+  'Delta': 'Δ',
+  'Epsilon': 'Ε',
+  'Zeta': 'Ζ',
+  'Eta': 'Η',
+  'Theta': 'Θ',
+  'Iota': 'Ι',
+  'Kappa': 'Κ',
+  'Lambda': 'Λ',
+  'Mu': 'Μ',
+  'Nu': 'Ν',
+  'Xi': 'Ξ',
+  'Omicron': 'Ο',
+  'Pi': 'Π',
+  'Rho': 'Ρ',
+  'Sigma': 'Σ',
+  'Tau': 'Τ',
+  'Upsilon': 'Υ',
+  'Phi': 'Φ',
+  'Chi': 'Χ',
+  'Psi': 'Ψ',
+  'Omega': 'Ω', // http://www.w3.org/TR/html4/sgml/entities.html
+  'ohm': 'Ω', // http://www.w3.org/TR/html5/named-character-references.html
+  'alpha': 'α',
+  'beta': 'β',
+  'gamma': 'γ',
+  'delta': 'δ',
+  'epsilon': 'ε',
+  'zeta': 'ζ',
+  'eta': 'η',
+  'theta': 'θ',
+  'iota': 'ι',
+  'kappa': 'κ',
+  'lambda': 'λ',
+  'mu': 'μ',
+  'nu': 'ν',
+  'xi': 'ξ',
+  'omicron': 'ο',
+  'pi': 'π',
+  'rho': 'ρ',
+  'sigmaf': 'ς', // http://www.w3.org/TR/html4/sgml/entities.html
+  'varsigma': 'ς', // http://www.w3.org/TR/html5/named-character-references.html
+  'sigma': 'σ',
+  'tau': 'τ',
+  'upsilon': 'υ',
+  'phi': 'φ',
+  'chi': 'χ',
+  'psi': 'ψ',
+  'omega': 'ω',
+  'thetasym': 'ϑ', // http://www.w3.org/TR/html4/sgml/entities.html
+  'vartheta': 'ϑ', // http://www.w3.org/TR/html5/named-character-references.html
+  'upsih': 'ϒ',
+  'varphi': 'ϕ',
+  'piv': 'ϖ', // http://www.w3.org/TR/html4/sgml/entities.html
+  'varpi': 'ϖ', // http://www.w3.org/TR/html5/named-character-references.html
+  'Gammad': 'Ϝ',
+  'gammad': 'ϝ',
+  'varkappa': 'ϰ',
+  'varrho': 'ϱ',
+  'varepsilon': 'ϵ',
+  'bepsi': '϶',
+  'IOcy': 'Ё',
+  'DJcy': 'Ђ',
+  'GJcy': 'Ѓ',
+  'Jukcy': 'Є',
+  'DScy': 'Ѕ',
+  'Iukcy': 'І',
+  'YIcy': 'Ї',
+  'Jsercy': 'Ј',
+  'LJcy': 'Љ',
+  'NJcy': 'Њ',
+  'TSHcy': 'Ћ',
+  'KJcy': 'Ќ',
+  'Ubrcy': 'Ў',
+  'DZcy': 'Џ',
+  'Acy': 'А',
+  'Bcy': 'Б',
+  'Vcy': 'В',
+  'Gcy': 'Г',
+  'Dcy': 'Д',
+  'IEcy': 'Е',
+  'ZHcy': 'Ж',
+  'Zcy': 'З',
+  'Icy': 'И',
+  'Jcy': 'Й',
+  'Kcy': 'К',
+  'Lcy': 'Л',
+  'Mcy': 'М',
+  'Ncy': 'Н',
+  'Ocy': 'О',
+  'Pcy': 'П',
+  'Rcy': 'Р',
+  'Scy': 'С',
+  'Tcy': 'Т',
+  'Ucy': 'У',
+  'Fcy': 'Ф',
+  'KHcy': 'Х',
+  'TScy': 'Ц',
+  'CHcy': 'Ч',
+  'SHcy': 'Ш',
+  'SHCHcy': 'Щ',
+  'HARDcy': 'Ъ',
+  'Ycy': 'Ы',
+  'SOFTcy': 'Ь',
+  'Ecy': 'Э',
+  'YUcy': 'Ю',
+  'YAcy': 'Я',
+  'acy': 'а',
+  'bcy': 'б',
+  'vcy': 'в',
+  'gcy': 'г',
+  'dcy': 'д',
+  'iecy': 'е',
+  'zhcy': 'ж',
+  'zcy': 'з',
+  'icy': 'и',
+  'jcy': 'й',
+  'kcy': 'к',
+  'lcy': 'л',
+  'mcy': 'м',
+  'ncy': 'н',
+  'ocy': 'о',
+  'pcy': 'п',
+  'rcy': 'р',
+  'scy': 'с',
+  'tcy': 'т',
+  'ucy': 'у',
+  'fcy': 'ф',
+  'khcy': 'х',
+  'tscy': 'ц',
+  'chcy': 'ч',
+  'shcy': 'ш',
+  'shchcy': 'щ',
+  'hardcy': 'ъ',
+  'ycy': 'ы',
+  'softcy': 'ь',
+  'ecy': 'э',
+  'yucy': 'ю',
+  'yacy': 'я',
+  'iocy': 'ё',
+  'djcy': 'ђ',
+  'gjcy': 'ѓ',
+  'jukcy': 'є',
+  'dscy': 'ѕ',
+  'iukcy': 'і',
+  'yicy': 'ї',
+  'jsercy': 'ј',
+  'ljcy': 'љ',
+  'njcy': 'њ',
+  'tshcy': 'ћ',
+  'kjcy': 'ќ',
+  'ubrcy': 'ў',
+  'dzcy': 'џ',
+  'ensp': ' ',
+  'emsp': ' ',
+  'emsp13': ' ',
+  'emsp14': ' ',
+  'numsp': ' ',
+  'puncsp': ' ',
+  'thinsp': ' ',
+  'hairsp': ' ',
+  'ZeroWidthSpace': '​',
+  'zwnj': '‌',
+  'zwj': '‍',
+  'lrm': '‎',
+  'rlm': '‏',
+  'hyphen': '‐',
+  'ndash': '–',
+  'mdash': '—',
+  'horbar': '―',
+  'Vert': '‖',
+  'lsquo': '‘',
+  'rsquo': '’', // http://www.w3.org/TR/html4/sgml/entities.html
+  'rsquor': '’', // http://www.w3.org/TR/html5/named-character-references.html
+  'sbquo': '‚',
+  'ldquo': '“',
+  'rdquo': '”', // http://www.w3.org/TR/html4/sgml/entities.html
+  'rdquor': '”', // http://www.w3.org/TR/html5/named-character-references.html
+  'ldquo': '“', // http://www.w3.org/TR/html4/sgml/entities.html
+  'ldquor': '„', // http://www.w3.org/TR/html5/named-character-references.html
+  'dagger': '†',
+  'Dagger': '‡', // http://www.w3.org/TR/html4/sgml/entities.html
+  'ddagger': '‡', // http://www.w3.org/TR/html5/named-character-references.html
+  'bull': '•', // http://www.w3.org/TR/html4/sgml/entities.html
+  'bullet': '•', // http://www.w3.org/TR/html5/named-character-references.html
+  'nldr': '‥',
+  'hellip': '…', // http://www.w3.org/TR/html4/sgml/entities.html
+  'mldr': '…', // http://www.w3.org/TR/html5/named-character-references.html
+  'permil': '‰',
+  'pertenk': '‱',
+  'prime': '′',
+  'Prime': '″',
+  'tprime': '‴',
+  'bprime': '‵',
+  'lsaquo': '‹',
+  'rsaquo': '›',
+  'oline': '‾',
+  'caret': '⁁',
+  'hybull': '⁃',
+  'frasl': '⁄',
+  'bsemi': '⁏',
+  'qprime': '⁗',
+  'MediumSpace': ' ',
+  'NoBreak': '⁠',
+  'af': '⁡',
+  'it': '⁢',
+  'ic': '⁣',
+  'euro': '€',
+  'complexes': 'ℂ',
+  'incare': '℅',
+  'gscr': 'ℊ',
+  'hamilt': 'ℋ',
+  'Poincareplane': 'ℌ',
+  'quaternions': 'ℍ',
+  'planckh': 'ℎ',
+  'plankv': 'ℏ',
+  'imagline': 'ℐ',
+  'image': 'ℑ', // http://www.w3.org/TR/html4/sgml/entities.html
+  'imagpart': 'ℑ', // http://www.w3.org/TR/html5/named-character-references.html
+  'lagran': 'ℒ',
+  'ell': 'ℓ',
+  'naturals': 'ℕ',
+  'numero': '№',
+  'copysr': '℗',
+  'weierp': '℘', // http://www.w3.org/TR/html4/sgml/entities.html
+  'wp': '℘', // http://www.w3.org/TR/html5/named-character-references.html
+  'primes': 'ℙ',
+  'rationals': 'ℚ',
+  'realine': 'ℛ',
+  'real': 'ℜ', // http://www.w3.org/TR/html4/sgml/entities.html
+  'realpart': 'ℜ', // http://www.w3.org/TR/html5/named-character-references.html
+  'reals': 'ℝ',
+  'rx': '℞',
+  'trade': '™',
+  'integers': 'ℤ',
+  'mho': '℧',
+  'zeetrf': 'ℨ',
+  'iiota': '℩',
+  'bernou': 'ℬ',
+  'Cfr': 'ℭ',
+  'escr': 'ℯ',
+  'expectation': 'ℰ',
+  'Fscr': 'ℱ',
+  'phmmat': 'ℳ',
+  'oscr': 'ℴ',
+  'alefsym': 'ℵ', // http://www.w3.org/TR/html4/sgml/entities.html
+  'aleph': 'ℵ', // http://www.w3.org/TR/html5/named-character-references.html
+  'beth': 'ℶ',
+  'gimel': 'ℷ',
+  'daleth': 'ℸ',
+  'DD': 'ⅅ',
+  'dd': 'ⅆ',
+  'exponentiale': 'ⅇ',
+  'ii': 'ⅈ',
+  'frac13': '⅓',
+  'frac23': '⅔',
+  'frac15': '⅕',
+  'frac25': '⅖',
+  'frac35': '⅗',
+  'frac45': '⅘',
+  'frac16': '⅙',
+  'frac56': '⅚',
+  'frac18': '⅛',
+  'frac38': '⅜',
+  'frac58': '⅝',
+  'frac78': '⅞',
+  'larr': '←', // http://www.w3.org/TR/html4/sgml/entities.html
+  'slarr': '←', // http://www.w3.org/TR/html5/named-character-references.html
+  'uarr': '↑', // http://www.w3.org/TR/html4/sgml/entities.html
+  'uparrow': '↑', // http://www.w3.org/TR/html5/named-character-references.html
+  'rarr': '→', // http://www.w3.org/TR/html4/sgml/entities.html
+  'srarr': '→', // http://www.w3.org/TR/html5/named-character-references.html
+  'darr': '↓', // http://www.w3.org/TR/html4/sgml/entities.html
+  'downarrow': '↓', // http://www.w3.org/TR/html5/named-character-references.html
+  'harr': '↔', // http://www.w3.org/TR/html4/sgml/entities.html
+  'leftrightarrow': '↔', // http://www.w3.org/TR/html5/named-character-references.html
+  'varr': '↕',
+  'nwarrow': '↖',
+  'nearrow': '↗',
+  'searrow': '↘',
+  'swarrow': '↙',
+  'nleftarrow': '↚',
+  'nrightarrow': '↛',
+  'rightsquigarrow': '↝',
+  'twoheadleftarrow': '↞',
+  'Uarr': '↟',
+  'twoheadrightarrow': '↠',
+  'Darr': '↡',
+  'leftarrowtail': '↢',
+  'rightarrowtail': '↣',
+  'mapstoleft': '↤',
+  'mapstoup': '↥',
+  'mapsto': '↦',
+  'mapstodown': '↧',
+  'larrhk': '↩',
+  'rarrhk': '↪',
+  'looparrowleft': '↫',
+  'rarrlp': '↬',
+  'leftrightsquigarrow': '↭',
+  'nleftrightarrow': '↮',
+  'lsh': '↰',
+  'rsh': '↱',
+  'ldsh': '↲',
+  'rdsh': '↳',
+  'crarr': '↵',
+  'curvearrowleft': '↶',
+  'curvearrowright': '↷',
+  'olarr': '↺',
+  'orarr': '↻',
+  'lharu': '↼',
+  'lhard': '↽',
+  'upharpoonright': '↾',
+  'upharpoonleft': '↿',
+  'rightharpoonup': '⇀',
+  'rightharpoondown': '⇁',
+  'downharpoonright': '⇂',
+  'downharpoonleft': '⇃',
+  'rlarr': '⇄',
+  'udarr': '⇅',
+  'lrarr': '⇆',
+  'llarr': '⇇',
+  'uuarr': '⇈',
+  'rrarr': '⇉',
+  'downdownarrows': '⇊',
+  'lrhar': '⇋',
+  'rlhar': '⇌',
+  'nlArr': '⇍',
+  'nhArr': '⇎',
+  'nrArr': '⇏',
+  'lArr': '⇐',
+  'uArr': '⇑',
+  'rArr': '⇒',
+  'dArr': '⇓',
+  'hArr': '⇔', // http://www.w3.org/TR/html4/sgml/entities.html
+  'iff': '⇔', // http://www.w3.org/TR/html5/named-character-references.html
+  'vArr': '⇕',
+  'nwArr': '⇖',
+  'neArr': '⇗',
+  'seArr': '⇘',
+  'swArr': '⇙',
+  'lAarr': '⇚',
+  'rAarr': '⇛',
+  'zigrarr': '⇝',
+  'larrb': '⇤',
+  'rarrb': '⇥',
+  'duarr': '⇵',
+  'loarr': '⇽',
+  'roarr': '⇾',
+  'hoarr': '⇿',
+  'forall': '∀',
+  'complement': '∁',
+  'part': '∂',
+  'exist': '∃',
+  'nexists': '∄',
+  'empty': '∅', // http://www.w3.org/TR/html4/sgml/entities.html
+  'varnothing': '∅', // http://www.w3.org/TR/html5/named-character-references.html
+  'nabla': '∇',
+  'isin': '∈', // http://www.w3.org/TR/html4/sgml/entities.html
+  'isinv': '∈', // http://www.w3.org/TR/html5/named-character-references.html
+  'notin': '∉', // http://www.w3.org/TR/html4/sgml/entities.html
+  'notinva': '∉', // http://www.w3.org/TR/html5/named-character-references.html
+  'ni': '∋', // http://www.w3.org/TR/html4/sgml/entities.html
+  'niv': '∋', // http://www.w3.org/TR/html5/named-character-references.html
+  'notniva': '∌',
+  'prod': '∏',
+  'coprod': '∐',
+  'sum': '∑',
+  'minus': '−',
+  'mp': '∓',
+  'plusdo': '∔',
+  'ssetmn': '∖',
+  'lowast': '∗',
+  'compfn': '∘',
+  'radic': '√',
+  'prop': '∝', // http://www.w3.org/TR/html4/sgml/entities.html
+  'vprop': '∝', // http://www.w3.org/TR/html5/named-character-references.html
+  'infin': '∞',
+  'angrt': '∟',
+  'ang': '∠', // http://www.w3.org/TR/html4/sgml/entities.html
+  'angle': '∠', // http://www.w3.org/TR/html5/named-character-references.html
+  'measuredangle': '∡',
+  'angsph': '∢',
+  'smid': '∣',
+  'nsmid': '∤',
+  'spar': '∥',
+  'nspar': '∦',
+  'and': '∧', // http://www.w3.org/TR/html4/sgml/entities.html
+  'wedge': '∧', // http://www.w3.org/TR/html5/named-character-references.html
+  'or': '∨', // http://www.w3.org/TR/html4/sgml/entities.html
+  'vee': '∨', // http://www.w3.org/TR/html5/named-character-references.html
+  'cap': '∩',
+  'cup': '∪',
+  'int': '∫',
+  'Int': '∬',
+  'tint': '∭',
+  'oint': '∮',
+  'DoubleContourIntegral': '∯',
+  'Cconint': '∰',
+  'cwint': '∱',
+  'cwconint': '∲',
+  'awconint': '∳',
+  'there4': '∴', // http://www.w3.org/TR/html4/sgml/entities.html
+  'therefore': '∴', // http://www.w3.org/TR/html5/named-character-references.html
+  'because': '∵',
+  'ratio': '∶',
+  'Proportion': '∷',
+  'minusd': '∸',
+  'mDDot': '∺',
+  'homtht': '∻',
+  'sim': '∼', // http://www.w3.org/TR/html4/sgml/entities.html
+  'thksim': '∼', // http://www.w3.org/TR/html5/named-character-references.html
+  'bsim': '∽',
+  'mstpos': '∾',
+  'acd': '∿',
+  'wreath': '≀',
+  'nsim': '≁',
+  'esim': '≂',
+  'simeq': '≃',
+  'nsimeq': '≄',
+  'cong': '≅',
+  'simne': '≆',
+  'ncong': '≇',
+  'asymp': '≈', // http://www.w3.org/TR/html4/sgml/entities.html
+  'thkap': '≈', // http://www.w3.org/TR/html5/named-character-references.html
+  'napprox': '≉',
+  'approxeq': '≊',
+  'apid': '≋',
+  'bcong': '≌',
+  'asympeq': '≍',
+  'bump': '≎',
+  'bumpeq': '≏',
+  'esdot': '≐',
+  'eDot': '≑',
+  'fallingdotseq': '≒',
+  'risingdotseq': '≓',
+  'coloneq': '≔',
+  'eqcolon': '≕',
+  'eqcirc': '≖',
+  'cire': '≗',
+  'wedgeq': '≙',
+  'veeeq': '≚',
+  'trie': '≜',
+  'questeq': '≟',
+  'ne': '≠',
+  'equiv': '≡',
+  'nequiv': '≢',
+  'le': '≤', // http://www.w3.org/TR/html4/sgml/entities.html
+  'leq': '≤', // http://www.w3.org/TR/html5/named-character-references.html
+  'ge': '≥', // http://www.w3.org/TR/html4/sgml/entities.html
+  'geq': '≥', // http://www.w3.org/TR/html5/named-character-references.html
+  'leqq': '≦',
+  'geqq': '≧',
+  'lneqq': '≨',
+  'gneqq': '≩',
+  'll': '≪',
+  'gg': '≫',
+  'twixt': '≬',
+  'NotCupCap': '≭',
+  'nlt': '≮',
+  'ngtr': '≯',
+  'nleq': '≰',
+  'ngeq': '≱',
+  'lsim': '≲',
+  'gtrsim': '≳',
+  'nlsim': '≴',
+  'ngsim': '≵',
+  'lg': '≶',
+  'gtrless': '≷',
+  'ntlg': '≸',
+  'ntgl': '≹',
+  'prec': '≺',
+  'succ': '≻',
+  'preccurlyeq': '≼',
+  'succcurlyeq': '≽',
+  'prsim': '≾',
+  'succsim': '≿',
+  'nprec': '⊀',
+  'nsucc': '⊁',
+  'sub': '⊂', // http://www.w3.org/TR/html4/sgml/entities.html
+  'subset': '⊂', // http://www.w3.org/TR/html5/named-character-references.html
+  'sup': '⊃', // http://www.w3.org/TR/html4/sgml/entities.html
+  'supset': '⊃', // http://www.w3.org/TR/html5/named-character-references.html
+  'nsub': '⊄',
+  'nsup': '⊅',
+  'sube': '⊆', // http://www.w3.org/TR/html4/sgml/entities.html
+  'subseteq': '⊆', // http://www.w3.org/TR/html5/named-character-references.html
+  'supe': '⊇', // http://www.w3.org/TR/html4/sgml/entities.html
+  'supseteq': '⊇', // http://www.w3.org/TR/html5/named-character-references.html
+  'nsubseteq': '⊈',
+  'nsupseteq': '⊉',
+  'subsetneq': '⊊',
+  'supsetneq': '⊋',
+  'cupdot': '⊍',
+  'uplus': '⊎',
+  'sqsubset': '⊏',
+  'sqsupset': '⊐',
+  'sqsubseteq': '⊑',
+  'sqsupseteq': '⊒',
+  'sqcap': '⊓',
+  'sqcup': '⊔',
+  'oplus': '⊕',
+  'ominus': '⊖',
+  'otimes': '⊗',
+  'osol': '⊘',
+  'odot': '⊙',
+  'ocir': '⊚',
+  'oast': '⊛',
+  'odash': '⊝',
+  'plusb': '⊞',
+  'minusb': '⊟',
+  'timesb': '⊠',
+  'sdotb': '⊡',
+  'vdash': '⊢',
+  'dashv': '⊣',
+  'top': '⊤',
+  'perp': '⊥',
+  'models': '⊧',
+  'vDash': '⊨',
+  'Vdash': '⊩',
+  'Vvdash': '⊪',
+  'VDash': '⊫',
+  'nvdash': '⊬',
+  'nvDash': '⊭',
+  'nVdash': '⊮',
+  'nVDash': '⊯',
+  'prurel': '⊰',
+  'vltri': '⊲',
+  'vrtri': '⊳',
+  'trianglelefteq': '⊴',
+  'trianglerighteq': '⊵',
+  'origof': '⊶',
+  'imof': '⊷',
+  'mumap': '⊸',
+  'hercon': '⊹',
+  'intercal': '⊺',
+  'veebar': '⊻',
+  'barvee': '⊽',
+  'angrtvb': '⊾',
+  'lrtri': '⊿',
+  'xwedge': '⋀',
+  'xvee': '⋁',
+  'xcap': '⋂',
+  'xcup': '⋃',
+  'diamond': '⋄',
+  'sdot': '⋅',
+  'sstarf': '⋆',
+  'divonx': '⋇',
+  'bowtie': '⋈',
+  'ltimes': '⋉',
+  'rtimes': '⋊',
+  'lthree': '⋋',
+  'rthree': '⋌',
+  'bsime': '⋍',
+  'cuvee': '⋎',
+  'cuwed': '⋏',
+  'Subset': '⋐',
+  'Supset': '⋑',
+  'Cap': '⋒',
+  'Cup': '⋓',
+  'pitchfork': '⋔',
+  'epar': '⋕',
+  'ltdot': '⋖',
+  'gtrdot': '⋗',
+  'Ll': '⋘',
+  'ggg': '⋙',
+  'lesseqgtr': '⋚',
+  'gtreqless': '⋛',
+  'curlyeqprec': '⋞',
+  'curlyeqsucc': '⋟',
+  'nprcue': '⋠',
+  'nsccue': '⋡',
+  'nsqsube': '⋢',
+  'nsqsupe': '⋣',
+  'lnsim': '⋦',
+  'gnsim': '⋧',
+  'prnsim': '⋨',
+  'succnsim': '⋩',
+  'ntriangleleft': '⋪',
+  'ntriangleright': '⋫',
+  'ntrianglelefteq': '⋬',
+  'ntrianglerighteq': '⋭',
+  'vellip': '⋮',
+  'ctdot': '⋯',
+  'utdot': '⋰',
+  'dtdot': '⋱',
+  'disin': '⋲',
+  'isinsv': '⋳',
+  'isins': '⋴',
+  'isindot': '⋵',
+  'notinvc': '⋶',
+  'notinvb': '⋷',
+  'isinE': '⋹',
+  'nisd': '⋺',
+  'xnis': '⋻',
+  'nis': '⋼',
+  'notnivc': '⋽',
+  'notnivb': '⋾',
+  'barwedge': '⌅',
+  'doublebarwedge': '⌆',
+  'lceil': '⌈',
+  'rceil': '⌉',
+  'lfloor': '⌊',
+  'rfloor': '⌋',
+  'drcrop': '⌌',
+  'dlcrop': '⌍',
+  'urcrop': '⌎',
+  'ulcrop': '⌏',
+  'bnot': '⌐',
+  'profline': '⌒',
+  'profsurf': '⌓',
+  'telrec': '⌕',
+  'target': '⌖',
+  'ulcorner': '⌜',
+  'urcorner': '⌝',
+  'llcorner': '⌞',
+  'lrcorner': '⌟',
+  'sfrown': '⌢',
+  'ssmile': '⌣',
+  'lang': '〈', // http://www.w3.org/TR/html4/sgml/entities.html
+  'rang': '〉', // http://www.w3.org/TR/html4/sgml/entities.html
+  'cylcty': '⌭',
+  'profalar': '⌮',
+  'topbot': '⌶',
+  'ovbar': '⌽',
+  'solbar': '⌿',
+  'angzarr': '⍼',
+  'lmoustache': '⎰',
+  'rmoustache': '⎱',
+  'tbrk': '⎴',
+  'bbrk': '⎵',
+  'bbrktbrk': '⎶',
+  'OverParenthesis': '⏜',
+  'UnderParenthesis': '⏝',
+  'OverBrace': '⏞',
+  'UnderBrace': '⏟',
+  'trpezium': '⏢',
+  'elinters': '⏧',
+  'blank': '␣',
+  'oS': 'Ⓢ',
+  'boxh': '─',
+  'boxv': '│',
+  'boxdr': '┌',
+  'boxdl': '┐',
+  'boxur': '└',
+  'boxul': '┘',
+  'boxvr': '├',
+  'boxvl': '┤',
+  'boxhd': '┬',
+  'boxhu': '┴',
+  'boxvh': '┼',
+  'boxH': '═',
+  'boxV': '║',
+  'boxdR': '╒',
+  'boxDr': '╓',
+  'boxDR': '╔',
+  'boxdL': '╕',
+  'boxDl': '╖',
+  'boxDL': '╗',
+  'boxuR': '╘',
+  'boxUr': '╙',
+  'boxUR': '╚',
+  'boxuL': '╛',
+  'boxUl': '╜',
+  'boxUL': '╝',
+  'boxvR': '╞',
+  'boxVr': '╟',
+  'boxVR': '╠',
+  'boxvL': '╡',
+  'boxVl': '╢',
+  'boxVL': '╣',
+  'boxHd': '╤',
+  'boxhD': '╥',
+  'boxHD': '╦',
+  'boxHu': '╧',
+  'boxhU': '╨',
+  'boxHU': '╩',
+  'boxvH': '╪',
+  'boxVh': '╫',
+  'boxVH': '╬',
+  'uhblk': '▀',
+  'lhblk': '▄',
+  'block': '█',
+  'blk14': '░',
+  'blk12': '▒',
+  'blk34': '▓',
+  'square': '□',
+  'squf': '▪',
+  'EmptyVerySmallSquare': '▫',
+  'rect': '▭',
+  'marker': '▮',
+  'fltns': '▱',
+  'xutri': '△',
+  'utrif': '▴',
+  'utri': '▵',
+  'rtrif': '▸',
+  'triangleright': '▹',
+  'xdtri': '▽',
+  'dtrif': '▾',
+  'triangledown': '▿',
+  'ltrif': '◂',
+  'triangleleft': '◃',
+  'loz': '◊', // http://www.w3.org/TR/html4/sgml/entities.html
+  'lozenge': '◊', // http://www.w3.org/TR/html5/named-character-references.html
+  'cir': '○',
+  'tridot': '◬',
+  'xcirc': '◯',
+  'ultri': '◸',
+  'urtri': '◹',
+  'lltri': '◺',
+  'EmptySmallSquare': '◻',
+  'FilledSmallSquare': '◼',
+  'starf': '★',
+  'star': '☆',
+  'phone': '☎',
+  'female': '♀',
+  'male': '♂',
+  'spades': '♠', // http://www.w3.org/TR/html4/sgml/entities.html
+  'spadesuit': '♠', // http://www.w3.org/TR/html5/named-character-references.html
+  'clubs': '♣', // http://www.w3.org/TR/html4/sgml/entities.html
+  'clubsuit': '♣', // http://www.w3.org/TR/html5/named-character-references.html
+  'hearts': '♥', // http://www.w3.org/TR/html4/sgml/entities.html
+  'heartsuit': '♥', // http://www.w3.org/TR/html5/named-character-references.html
+  'diams': '♦',
+  'sung': '♪',
+  'flat': '♭',
+  'natural': '♮',
+  'sharp': '♯',
+  'checkmark': '✓',
+  'cross': '✗',
+  'maltese': '✠',
+  'sext': '✶',
+  'VerticalSeparator': '❘',
+  'lbbrk': '❲',
+  'rbbrk': '❳',
+  'bsolhsub': '⟈',
+  'suphsol': '⟉',
+  'lobrk': '⟦',
+  'robrk': '⟧',
+  'langle': '⟨',
+  'rangle': '⟩',
+  'Lang': '⟪',
+  'Rang': '⟫',
+  'loang': '⟬',
+  'roang': '⟭',
+  'xlarr': '⟵',
+  'xrarr': '⟶',
+  'xharr': '⟷',
+  'xlArr': '⟸',
+  'xrArr': '⟹',
+  'xhArr': '⟺',
+  'xmap': '⟼',
+  'dzigrarr': '⟿',
+  'nvlArr': '⤂',
+  'nvrArr': '⤃',
+  'nvHarr': '⤄',
+  'Map': '⤅',
+  'lbarr': '⤌',
+  'rbarr': '⤍',
+  'lBarr': '⤎',
+  'rBarr': '⤏',
+  'drbkarow': '⤐',
+  'DDotrahd': '⤑',
+  'UpArrowBar': '⤒',
+  'DownArrowBar': '⤓',
+  'Rarrtl': '⤖',
+  'latail': '⤙',
+  'ratail': '⤚',
+  'lAtail': '⤛',
+  'rAtail': '⤜',
+  'larrfs': '⤝',
+  'rarrfs': '⤞',
+  'larrbfs': '⤟',
+  'rarrbfs': '⤠',
+  'nwarhk': '⤣',
+  'nearhk': '⤤',
+  'searhk': '⤥',
+  'swarhk': '⤦',
+  'nwnear': '⤧',
+  'toea': '⤨',
+  'tosa': '⤩',
+  'swnwar': '⤪',
+  'rarrc': '⤳',
+  'cudarrr': '⤵',
+  'ldca': '⤶',
+  'rdca': '⤷',
+  'cudarrl': '⤸',
+  'larrpl': '⤹',
+  'curarrm': '⤼',
+  'cularrp': '⤽',
+  'rarrpl': '⥅',
+  'harrcir': '⥈',
+  'Uarrocir': '⥉',
+  'lurdshar': '⥊',
+  'ldrushar': '⥋',
+  'LeftRightVector': '⥎',
+  'RightUpDownVector': '⥏',
+  'DownLeftRightVector': '⥐',
+  'LeftUpDownVector': '⥑',
+  'LeftVectorBar': '⥒',
+  'RightVectorBar': '⥓',
+  'RightUpVectorBar': '⥔',
+  'RightDownVectorBar': '⥕',
+  'DownLeftVectorBar': '⥖',
+  'DownRightVectorBar': '⥗',
+  'LeftUpVectorBar': '⥘',
+  'LeftDownVectorBar': '⥙',
+  'LeftTeeVector': '⥚',
+  'RightTeeVector': '⥛',
+  'RightUpTeeVector': '⥜',
+  'RightDownTeeVector': '⥝',
+  'DownLeftTeeVector': '⥞',
+  'DownRightTeeVector': '⥟',
+  'LeftUpTeeVector': '⥠',
+  'LeftDownTeeVector': '⥡',
+  'lHar': '⥢',
+  'uHar': '⥣',
+  'rHar': '⥤',
+  'dHar': '⥥',
+  'luruhar': '⥦',
+  'ldrdhar': '⥧',
+  'ruluhar': '⥨',
+  'rdldhar': '⥩',
+  'lharul': '⥪',
+  'llhard': '⥫',
+  'rharul': '⥬',
+  'lrhard': '⥭',
+  'udhar': '⥮',
+  'duhar': '⥯',
+  'RoundImplies': '⥰',
+  'erarr': '⥱',
+  'simrarr': '⥲',
+  'larrsim': '⥳',
+  'rarrsim': '⥴',
+  'rarrap': '⥵',
+  'ltlarr': '⥶',
+  'gtrarr': '⥸',
+  'subrarr': '⥹',
+  'suplarr': '⥻',
+  'lfisht': '⥼',
+  'rfisht': '⥽',
+  'ufisht': '⥾',
+  'dfisht': '⥿',
+  'lopar': '⦅',
+  'ropar': '⦆',
+  'lbrke': '⦋',
+  'rbrke': '⦌',
+  'lbrkslu': '⦍',
+  'rbrksld': '⦎',
+  'lbrksld': '⦏',
+  'rbrkslu': '⦐',
+  'langd': '⦑',
+  'rangd': '⦒',
+  'lparlt': '⦓',
+  'rpargt': '⦔',
+  'gtlPar': '⦕',
+  'ltrPar': '⦖',
+  'vzigzag': '⦚',
+  'vangrt': '⦜',
+  'angrtvbd': '⦝',
+  'ange': '⦤',
+  'range': '⦥',
+  'dwangle': '⦦',
+  'uwangle': '⦧',
+  'angmsdaa': '⦨',
+  'angmsdab': '⦩',
+  'angmsdac': '⦪',
+  'angmsdad': '⦫',
+  'angmsdae': '⦬',
+  'angmsdaf': '⦭',
+  'angmsdag': '⦮',
+  'angmsdah': '⦯',
+  'bemptyv': '⦰',
+  'demptyv': '⦱',
+  'cemptyv': '⦲',
+  'raemptyv': '⦳',
+  'laemptyv': '⦴',
+  'ohbar': '⦵',
+  'omid': '⦶',
+  'opar': '⦷',
+  'operp': '⦹',
+  'olcross': '⦻',
+  'odsold': '⦼',
+  'olcir': '⦾',
+  'ofcir': '⦿',
+  'olt': '⧀',
+  'ogt': '⧁',
+  'cirscir': '⧂',
+  'cirE': '⧃',
+  'solb': '⧄',
+  'bsolb': '⧅',
+  'boxbox': '⧉',
+  'trisb': '⧍',
+  'rtriltri': '⧎',
+  'LeftTriangleBar': '⧏',
+  'RightTriangleBar': '⧐',
+  'iinfin': '⧜',
+  'infintie': '⧝',
+  'nvinfin': '⧞',
+  'eparsl': '⧣',
+  'smeparsl': '⧤',
+  'eqvparsl': '⧥',
+  'lozf': '⧫',
+  'RuleDelayed': '⧴',
+  'dsol': '⧶',
+  'xodot': '⨀',
+  'xoplus': '⨁',
+  'xotime': '⨂',
+  'xuplus': '⨄',
+  'xsqcup': '⨆',
+  'qint': '⨌',
+  'fpartint': '⨍',
+  'cirfnint': '⨐',
+  'awint': '⨑',
+  'rppolint': '⨒',
+  'scpolint': '⨓',
+  'npolint': '⨔',
+  'pointint': '⨕',
+  'quatint': '⨖',
+  'intlarhk': '⨗',
+  'pluscir': '⨢',
+  'plusacir': '⨣',
+  'simplus': '⨤',
+  'plusdu': '⨥',
+  'plussim': '⨦',
+  'plustwo': '⨧',
+  'mcomma': '⨩',
+  'minusdu': '⨪',
+  'loplus': '⨭',
+  'roplus': '⨮',
+  'Cross': '⨯',
+  'timesd': '⨰',
+  'timesbar': '⨱',
+  'smashp': '⨳',
+  'lotimes': '⨴',
+  'rotimes': '⨵',
+  'otimesas': '⨶',
+  'Otimes': '⨷',
+  'odiv': '⨸',
+  'triplus': '⨹',
+  'triminus': '⨺',
+  'tritime': '⨻',
+  'iprod': '⨼',
+  'amalg': '⨿',
+  'capdot': '⩀',
+  'ncup': '⩂',
+  'ncap': '⩃',
+  'capand': '⩄',
+  'cupor': '⩅',
+  'cupcap': '⩆',
+  'capcup': '⩇',
+  'cupbrcap': '⩈',
+  'capbrcup': '⩉',
+  'cupcup': '⩊',
+  'capcap': '⩋',
+  'ccups': '⩌',
+  'ccaps': '⩍',
+  'ccupssm': '⩐',
+  'And': '⩓',
+  'Or': '⩔',
+  'andand': '⩕',
+  'oror': '⩖',
+  'orslope': '⩗',
+  'andslope': '⩘',
+  'andv': '⩚',
+  'orv': '⩛',
+  'andd': '⩜',
+  'ord': '⩝',
+  'wedbar': '⩟',
+  'sdote': '⩦',
+  'simdot': '⩪',
+  'congdot': '⩭',
+  'easter': '⩮',
+  'apacir': '⩯',
+  'apE': '⩰',
+  'eplus': '⩱',
+  'pluse': '⩲',
+  'Esim': '⩳',
+  'Colone': '⩴',
+  'Equal': '⩵',
+  'eDDot': '⩷',
+  'equivDD': '⩸',
+  'ltcir': '⩹',
+  'gtcir': '⩺',
+  'ltquest': '⩻',
+  'gtquest': '⩼',
+  'les': '⩽',
+  'ges': '⩾',
+  'lesdot': '⩿',
+  'gesdot': '⪀',
+  'lesdoto': '⪁',
+  'gesdoto': '⪂',
+  'lesdotor': '⪃',
+  'gesdotol': '⪄',
+  'lessapprox': '⪅',
+  'gtrapprox': '⪆',
+  'lneq': '⪇',
+  'gneq': '⪈',
+  'lnapprox': '⪉',
+  'gnapprox': '⪊',
+  'lesseqqgtr': '⪋',
+  'gtreqqless': '⪌',
+  'lsime': '⪍',
+  'gsime': '⪎',
+  'lsimg': '⪏',
+  'gsiml': '⪐',
+  'lgE': '⪑',
+  'glE': '⪒',
+  'lesges': '⪓',
+  'gesles': '⪔',
+  'eqslantless': '⪕',
+  'eqslantgtr': '⪖',
+  'elsdot': '⪗',
+  'egsdot': '⪘',
+  'el': '⪙',
+  'eg': '⪚',
+  'siml': '⪝',
+  'simg': '⪞',
+  'simlE': '⪟',
+  'simgE': '⪠',
+  'LessLess': '⪡',
+  'GreaterGreater': '⪢',
+  'glj': '⪤',
+  'gla': '⪥',
+  'ltcc': '⪦',
+  'gtcc': '⪧',
+  'lescc': '⪨',
+  'gescc': '⪩',
+  'smt': '⪪',
+  'lat': '⪫',
+  'smte': '⪬',
+  'late': '⪭',
+  'bumpE': '⪮',
+  'preceq': '⪯',
+  'succeq': '⪰',
+  'prE': '⪳',
+  'scE': '⪴',
+  'prnE': '⪵',
+  'succneqq': '⪶',
+  'precapprox': '⪷',
+  'succapprox': '⪸',
+  'prnap': '⪹',
+  'succnapprox': '⪺',
+  'Pr': '⪻',
+  'Sc': '⪼',
+  'subdot': '⪽',
+  'supdot': '⪾',
+  'subplus': '⪿',
+  'supplus': '⫀',
+  'submult': '⫁',
+  'supmult': '⫂',
+  'subedot': '⫃',
+  'supedot': '⫄',
+  'subseteqq': '⫅',
+  'supseteqq': '⫆',
+  'subsim': '⫇',
+  'supsim': '⫈',
+  'subsetneqq': '⫋',
+  'supsetneqq': '⫌',
+  'csub': '⫏',
+  'csup': '⫐',
+  'csube': '⫑',
+  'csupe': '⫒',
+  'subsup': '⫓',
+  'supsub': '⫔',
+  'subsub': '⫕',
+  'supsup': '⫖',
+  'suphsub': '⫗',
+  'supdsub': '⫘',
+  'forkv': '⫙',
+  'topfork': '⫚',
+  'mlcp': '⫛',
+  'DoubleLeftTee': '⫤',
+  'Vdashl': '⫦',
+  'Barv': '⫧',
+  'vBar': '⫨',
+  'vBarv': '⫩',
+  'Vbar': '⫫',
+  'Not': '⫬',
+  'bNot': '⫭',
+  'rnmid': '⫮',
+  'cirmid': '⫯',
+  'midcir': '⫰',
+  'topcir': '⫱',
+  'nhpar': '⫲',
+  'parsim': '⫳',
+  'parsl': '⫽',
+  'fflig': 'ff',
+  'filig': 'fi',
+  'fllig': 'fl',
+  'ffilig': 'ffi',
+  'ffllig': 'ffl',
+  'Ascr': '풜',
+  'Cscr': '풞',
+  'Dscr': '풟',
+  'Gscr': '풢',
+  'Jscr': '풥',
+  'Kscr': '풦',
+  'Nscr': '풩',
+  'Oscr': '풪',
+  'Pscr': '풫',
+  'Qscr': '풬',
+  'Sscr': '풮',
+  'Tscr': '풯',
+  'Uscr': '풰',
+  'Vscr': '풱',
+  'Wscr': '풲',
+  'Xscr': '풳',
+  'Yscr': '풴',
+  'Zscr': '풵',
+  'ascr': '풶',
+  'bscr': '풷',
+  'cscr': '풸',
+  'dscr': '풹',
+  'fscr': '풻',
+  'hscr': '풽',
+  'iscr': '풾',
+  'jscr': '풿',
+  'kscr': '퓀',
+  'lscr': '퓁',
+  'mscr': '퓂',
+  'nscr': '퓃',
+  'pscr': '퓅',
+  'qscr': '퓆',
+  'rscr': '퓇',
+  'sscr': '퓈',
+  'tscr': '퓉',
+  'uscr': '퓊',
+  'vscr': '퓋',
+  'wscr': '퓌',
+  'xscr': '퓍',
+  'yscr': '퓎',
+  'zscr': '퓏',
+  'Afr': '프',
+  'Bfr': '픅',
+  'Dfr': '픇',
+  'Efr': '픈',
+  'Ffr': '픉',
+  'Gfr': '픊',
+  'Jfr': '픍',
+  'Kfr': '픎',
+  'Lfr': '픏',
+  'Mfr': '픐',
+  'Nfr': '픑',
+  'Ofr': '픒',
+  'Pfr': '픓',
+  'Qfr': '픔',
+  'Sfr': '픖',
+  'Tfr': '픗',
+  'Ufr': '픘',
+  'Vfr': '픙',
+  'Wfr': '픚',
+  'Xfr': '픛',
+  'Yfr': '픜',
+  'afr': '픞',
+  'bfr': '픟',
+  'cfr': '픠',
+  'dfr': '픡',
+  'efr': '픢',
+  'ffr': '픣',
+  'gfr': '픤',
+  'hfr': '픥',
+  'ifr': '픦',
+  'jfr': '픧',
+  'kfr': '픨',
+  'lfr': '픩',
+  'mfr': '픪',
+  'nfr': '픫',
+  'ofr': '픬',
+  'pfr': '픭',
+  'qfr': '픮',
+  'rfr': '픯',
+  'sfr': '픰',
+  'tfr': '픱',
+  'ufr': '픲',
+  'vfr': '픳',
+  'wfr': '픴',
+  'xfr': '픵',
+  'yfr': '픶',
+  'zfr': '픷',
+  'Aopf': '픸',
+  'Bopf': '픹',
+  'Dopf': '픻',
+  'Eopf': '피',
+  'Fopf': '픽',
+  'Gopf': '픾',
+  'Iopf': '핀',
+  'Jopf': '핁',
+  'Kopf': '핂',
+  'Lopf': '핃',
+  'Mopf': '필',
+  'Oopf': '핆',
+  'Sopf': '핊',
+  'Topf': '핋',
+  'Uopf': '핌',
+  'Vopf': '핍',
+  'Wopf': '핎',
+  'Xopf': '핏',
+  'Yopf': '핐',
+  'aopf': '핒',
+  'bopf': '핓',
+  'copf': '핔',
+  'dopf': '핕',
+  'eopf': '핖',
+  'fopf': '핗',
+  'gopf': '하',
+  'hopf': '학',
+  'iopf': '핚',
+  'jopf': '핛',
+  'kopf': '한',
+  'lopf': '핝',
+  'mopf': '핞',
+  'nopf': '핟',
+  'oopf': '할',
+  'popf': '핡',
+  'qopf': '핢',
+  'ropf': '핣',
+  'sopf': '핤',
+  'topf': '핥',
+  'uopf': '핦',
+  'vopf': '핧',
+  'wopf': '함',
+  'xopf': '합',
+  'yopf': '핪',
+  'zopf': '핫'
+};
+
+var specialCharEntities = {
+  '&': '&',
+  '"': '"',
+  '<': '<',
+  '>': '>',
+  '\xA0': ' '
+};
+
+var entityRegExp = /&(?:#([0-9]+)|#x([0-9a-f]+)|([a-z0-9]+));/gi;
+var attributeModeSpecialCharRegExp = /["&<>\xA0]/g;
+var nonAttributeModeSpecialCharRegExp = /[&<>\xA0]/g;
+
+exports.HTMLDecode = function decode(s) {
+  if (!s) return '';
+  return s.replace(entityRegExp, function ($0, decimalStr, hexStr, entityName) {
+    if (decimalStr) {
+      return String.fromCharCode(parseInt(decimalStr, 10));
+    } else if (hexStr) {
+      return String.fromCharCode(parseInt(hexStr, 16));
+    } else {
+      // Fall back to the original string if we don't know the entity, as per browser behavior:
+      return charByEntityName[entityName] || $0;
+    }
+  });
+};
+
+function specialCharToEntity(s) {
+  var entity = specialCharEntities[s];
+  return entity ? entity : s;
+}
+
+exports.HTMLEncode = function encode(s, attributeMode) {
+  if (!s) return '';
+  if (!s.replace) return s;
+  if(attributeMode) {
+	  return s.replace(attributeModeSpecialCharRegExp, specialCharToEntity);
+  } else {
+	  return s.replace(nonAttributeModeSpecialCharRegExp, specialCharToEntity);
+  }
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/browser/htmltodom.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/browser/htmltodom.js
new file mode 100644
index 0000000..99c7e45
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/browser/htmltodom.js
@@ -0,0 +1,194 @@
+var HTMLDecode = require('./htmlencoding').HTMLDecode;
+
+function HtmlToDom(parser) {
+
+  if(parser && parser.write) {
+    // sax parser
+    this.appendHtmlToElement = function(html, element){
+
+      var currentElement = element, currentLevel = 0;
+
+      parser.onerror = function (e) {};
+
+      parser.ontext = function (t) {
+        var ownerDocument = currentElement.ownerDocument || currentElement;
+        var newText = ownerDocument.createTextNode(t);
+        currentElement.appendChild(newText);
+      };
+
+      parser.onopentag = function (node) {
+        var nodeName  = node.name.toLowerCase(),
+            document   = currentElement.ownerDocument || currentElement,
+            newElement = document.createElement(nodeName),
+            i          = 0,
+            length     = (node.attributes && node.attributes.length) ?
+                          node.attributes.length                     :
+                          0;
+
+        for (i in node.attributes) {
+          if (node.attributes.hasOwnProperty(i)) {
+            newElement.setAttribute(i, node.attributes[i]);
+          }
+        }
+
+        for (i=0; i<node.attributes.length; i++) {
+            newElement.setAttribute(i, node.attributes.item(i));
+        }
+        currentElement.appendChild(newElement);
+        currentElement = newElement;
+      };
+
+      parser.onclosetag = function(node) {
+        currentElement = currentElement.parentNode;
+      };
+
+      parser.write(html).close();
+
+      return element;
+    };
+
+  } else if (parser && (parser.ParseHtml || parser.DefaultHandler)) {
+
+    // Forgiving HTML parser
+
+    if (parser.ParseHtml) {
+      // davglass/node-htmlparser
+    } else if (parser.DefaultHandler){
+      // fb55/htmlparser2
+
+      parser.ParseHtml = function(rawHtml) {
+        var handler = new parser.DefaultHandler();
+        // Check if document is XML
+        var isXML = (/^<\?\s*xml.*version=["']1\.0["'].*\s*\?>/i).test(rawHtml);
+        var parserInstance = new parser.Parser(handler, {
+          xmlMode: isXML,
+          lowerCaseTags: !isXML,
+          lowerCaseAttributeNames: !isXML
+        });
+
+        parserInstance.includeLocation = false;
+        parserInstance.parseComplete(rawHtml);
+        return handler.dom;
+      };
+    }
+
+    this.appendHtmlToElement = function(html, element) {
+
+      if (typeof html !== 'string') {
+        html +='';
+      }
+
+      var parsed = parser.ParseHtml(html);
+
+      for (var i = 0; i < parsed.length; i++) {
+        setChild(element, parsed[i]);
+      }
+
+      return element;
+    };
+
+  } else if (parser && parser.moduleName == 'HTML5') { /* HTML5 parser */
+    this.appendHtmlToElement = function(html, element) {
+
+      if (typeof html !== 'string') {
+        html += '';
+      }
+      if (html.length > 0) {
+        if (element.nodeType == 9) {
+          new parser.Parser({document: element}).parse(html);
+        }
+        else {
+          var p = new parser.Parser({document: element.ownerDocument});
+          p.parse_fragment(html, element);
+        }
+      }
+    };
+  } else {
+
+    this.appendHtmlToElement = function(){
+      console.log('');
+      console.log('###########################################################');
+      console.log('#  WARNING: No HTML parser could be found.');
+      console.log('#  Element.innerHTML setter support has been disabled');
+      console.log('#  Element.innerHTML getter support will still function');
+      console.log('#  Download: http://github.com/tautologistics/node-htmlparser');
+      console.log('###########################################################');
+      console.log('');
+    };
+
+  }
+};
+
+// utility function for forgiving parser
+function setChild(parent, node) {
+
+  var c, newNode, currentDocument = parent._ownerDocument || parent;
+
+  switch (node.type)
+  {
+    case 'tag':
+    case 'script':
+    case 'style':
+      try {
+        newNode = currentDocument.createElement(node.name);
+        if (node.location) {
+          newNode.sourceLocation = node.location;
+          newNode.sourceLocation.file = parent.sourceLocation.file;
+        }
+      } catch (err) {
+        currentDocument.raise('error', 'invalid markup', {
+          exception: err,
+          node : node
+        });
+
+        return null;
+      }
+    break;
+
+    case 'text':
+      // Decode HTML entities if we're not inside a <script> or <style> tag:
+      newNode = currentDocument.createTextNode(/^(?:script|style)$/i.test(parent.nodeName) ?
+                                                   node.data :
+                                                   HTMLDecode(node.data));
+    break;
+
+    case 'comment':
+      newNode = currentDocument.createComment(node.data);
+    break;
+
+    default:
+      return null;
+    break;
+  }
+
+  if (!newNode)
+    return null;
+
+  if (node.attribs) {
+    for (c in node.attribs) {
+      // catchin errors here helps with improperly escaped attributes
+      // but properly fixing parent should (can only?) be done in the htmlparser itself
+      try {
+        newNode.setAttribute(c, HTMLDecode(node.attribs[c]));
+      } catch(e2) { /* noop */ }
+    }
+  }
+
+  if (node.children) {
+    for (c = 0; c < node.children.length; c++) {
+      setChild(newNode, node.children[c]);
+    }
+  }
+
+  try{
+    return parent.appendChild(newNode);
+  }catch(err){
+    currentDocument.raise('error', err.message, {
+          exception: err,
+          node : node
+        });
+    return null;
+  }
+}
+
+exports.HtmlToDom = HtmlToDom;
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/browser/index.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/browser/index.js
new file mode 100644
index 0000000..31701a2
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/browser/index.js
@@ -0,0 +1,630 @@
+var http          = require('http'),
+    URL           = require('url'),
+    HtmlToDom     = require('./htmltodom').HtmlToDom,
+    domToHtml     = require('./domtohtml').domToHtml,
+    htmlencoding  = require('./htmlencoding'),
+    HTMLEncode    = htmlencoding.HTMLEncode,
+    HTMLDecode    = htmlencoding.HTMLDecode,
+    jsdom         = require('../../jsdom'),
+    Location      = require('./location'),
+    History       = require('./history'),
+    NOT_IMPLEMENTED = require('./utils').NOT_IMPLEMENTED,
+    CSSStyleDeclaration = require('cssstyle').CSSStyleDeclaration,
+    toFileUrl = require('../utils').toFileUrl,
+    Contextify    = require('contextify');
+
+function matchesDontThrow(el, selector) {
+  try {
+    return el.matchesSelector(selector);
+  } catch (e) {
+    return false;
+  }
+}
+
+/**
+ * Creates a window having a document. The document can be passed as option,
+ * if omitted, a new document will be created.
+ */
+exports.windowAugmentation = function(dom, options) {
+  options = options || {};
+  var window = exports.createWindow(dom, options);
+
+  if (!options.document) {
+    var browser = browserAugmentation(dom, options);
+
+    options.document = (browser.HTMLDocument)             ?
+                        new browser.HTMLDocument(options) :
+                        new browser.Document(options);
+
+
+
+    options.document.write('<html><head></head><body></body></html>');
+  }
+
+  var doc = window.document = options.document;
+
+  if (doc.addEventListener) {
+    if (doc.readyState == 'complete') {
+      var ev = doc.createEvent('HTMLEvents');
+      ev.initEvent('load', false, false);
+      process.nextTick(function () {
+        window.dispatchEvent(ev);
+      });
+    }
+    else {
+      doc.addEventListener('load', function(ev) {
+        window.dispatchEvent(ev);
+      });
+    }
+  }
+
+  return window;
+};
+
+/**
+ * Creates a document-less window.
+ */
+exports.createWindow = function(dom, options) {
+  var timers = [];
+  var cssSelectorSplitRE = /((?:[^,"']|"[^"]*"|'[^']*')+)/;
+
+  function startTimer(startFn, stopFn, callback, ms) {
+	  var res = startFn(callback, ms);
+	  timers.push( [ res, stopFn ] );
+	  return res;
+  }
+
+  function stopTimer(id) {
+	  if (typeof id === 'undefined') {
+		  return;
+	  }
+	  for (var i in timers) {
+		  if (timers[i][0] === id) {
+			  timers[i][1].call(this, id);
+			  timers.splice(i, 1);
+			  break;
+		  }
+	  }
+  }
+
+  function stopAllTimers() {
+	  timers.forEach(function (t) {
+		  t[1].call(this, t[0]);
+	  });
+	  timers = [];
+  }
+
+  function DOMWindow(options) {
+    var url = (options || {}).url || toFileUrl(__filename);
+    this.location = new Location(url, this);
+    this.history = new History(this);
+
+    this.console._window = this;
+
+    if (options && options.document) {
+      options.document.location = this.location;
+    }
+
+    this.addEventListener = function() {
+      dom.Node.prototype.addEventListener.apply(window, arguments);
+    };
+    this.removeEventListener = function() {
+      dom.Node.prototype.removeEventListener.apply(window, arguments);
+    };
+    this.dispatchEvent = function() {
+      dom.Node.prototype.dispatchEvent.apply(window, arguments);
+    };
+    this.raise = function(){
+      dom.Node.prototype.raise.apply(window.document, arguments);
+    };
+
+    this.setTimeout = function (fn, ms) { return startTimer(setTimeout, clearTimeout, fn, ms); };
+    this.setInterval = function (fn, ms) { return startTimer(setInterval, clearInterval, fn, ms); };
+    this.clearInterval = stopTimer;
+    this.clearTimeout = stopTimer;
+    this.__stopAllTimers = stopAllTimers;
+  }
+
+  DOMWindow.prototype = {
+    __proto__: dom,
+    // This implements window.frames.length, since window.frames returns a
+    // self reference to the window object.  This value is incremented in the
+    // HTMLFrameElement init function (see: level2/html.js).
+    _length : 0,
+    get length () {
+      return this._length;
+    },
+    close : function() {
+      // Recursively close child frame windows, then ourselves.
+      var currentWindow = this;
+      (function windowCleaner (window) {
+        var i;
+        // We could call window.frames.length etc, but window.frames just points
+        // back to window.
+        if (window.length > 0) {
+          for (i = 0; i < window.length; i++) {
+            windowCleaner(window[i]);
+          }
+        }
+        // We're already in our own window.close().
+        if (window !== currentWindow) {
+          window.close();
+        }
+      })(this);
+
+      if (this.document) {
+        if (this.document.body) {
+          this.document.body.innerHTML = "";
+        }
+
+        if (this.document.close) {
+          // We need to empty out the event listener array because
+          // document.close() causes 'load' event to re-fire.
+          this.document._listeners = [];
+          this.document.close();
+        }
+        delete this.document;
+      }
+
+      stopAllTimers();
+      // Clean up the window's execution context.
+      // dispose() is added by Contextify.
+      this.dispose();
+    },
+    getComputedStyle: function(node) {
+      var s = node.style,
+          cs = new CSSStyleDeclaration(),
+          forEach = Array.prototype.forEach;
+
+      function setPropertiesFromRule(rule) {
+        if (!rule.selectorText) {
+          return;
+        }
+
+        var selectors = rule.selectorText.split(cssSelectorSplitRE);
+        var matched = false;
+        selectors.forEach(function (selectorText) {
+          if (selectorText !== '' && selectorText !== ',' && !matched && matchesDontThrow(node, selectorText)) {
+            matched = true;
+            forEach.call(rule.style, function (property) {
+              cs.setProperty(property, rule.style.getPropertyValue(property), rule.style.getPropertyPriority(property));
+            });
+          }
+        });
+      }
+
+      forEach.call(node.ownerDocument.styleSheets, function (sheet) {
+        forEach.call(sheet.cssRules, function (rule) {
+          if (rule.media) {
+            if (Array.prototype.indexOf.call(rule.media, 'screen') !== -1) {
+              forEach.call(rule.cssRules, setPropertiesFromRule);
+            }
+          } else {
+            setPropertiesFromRule(rule);
+          }
+        });
+      });
+
+      forEach.call(s, function (property) {
+        cs.setProperty(property, s.getPropertyValue(property), s.getPropertyPriority(property));
+      });
+
+      return cs;
+    },
+    console: {
+      log:   function(message) { this._window.raise('log',   message) },
+      info:  function(message) { this._window.raise('info',  message) },
+      warn:  function(message) { this._window.raise('warn',  message) },
+      error: function(message) { this._window.raise('error', message) }
+    },
+    navigator: {
+      userAgent: 'Node.js (' + process.platform + '; U; rv:' + process.version + ')',
+      appName: 'Node.js jsDom',
+      platform: process.platform,
+      appVersion: process.version,
+      noUI: true
+    },
+    XMLHttpRequest: function() {
+      var XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest;
+      var xhr = new XMLHttpRequest();
+      var lastUrl = '';
+      xhr._open = xhr.open;
+      xhr.open = function(method, url, async, user, password) {
+        url = URL.resolve(options.url, url);
+        lastUrl = url;
+        return xhr._open(method, url, async, user, password);
+      };
+      xhr._send = xhr.send;
+      xhr.send = function(data) {
+        if (window.document.cookie) {
+          var cookieDomain = window.document._cookieDomain;
+          var url = URL.parse(lastUrl);
+          var host = url.host.split(':')[0];
+          if (host.indexOf(cookieDomain, host.length - cookieDomain.length) !== -1) {
+            xhr.setDisableHeaderCheck(true);
+            xhr.setRequestHeader('cookie', window.document.cookie);
+            xhr.setDisableHeaderCheck(false);
+          }
+        }
+        return xhr._send(data);
+      };
+      return xhr;
+    },
+
+    name: 'nodejs',
+    innerWidth: 1024,
+    innerHeight: 768,
+    outerWidth: 1024,
+    outerHeight: 768,
+    pageXOffset: 0,
+    pageYOffset: 0,
+    screenX: 0,
+    screenY: 0,
+    screenLeft: 0,
+    screenTop: 0,
+    scrollX: 0,
+    scrollY: 0,
+    scrollTop: 0,
+    scrollLeft: 0,
+    alert: NOT_IMPLEMENTED(null, 'window.alert'),
+    blur: NOT_IMPLEMENTED(null, 'window.blur'),
+    confirm: NOT_IMPLEMENTED(null, 'window.confirm'),
+    createPopup: NOT_IMPLEMENTED(null, 'window.createPopup'),
+    focus: NOT_IMPLEMENTED(null, 'window.focus'),
+    moveBy: NOT_IMPLEMENTED(null, 'window.moveBy'),
+    moveTo: NOT_IMPLEMENTED(null, 'window.moveTo'),
+    open: NOT_IMPLEMENTED(null, 'window.open'),
+    print: NOT_IMPLEMENTED(null, 'window.print'),
+    prompt: NOT_IMPLEMENTED(null, 'window.prompt'),
+    resizeBy: NOT_IMPLEMENTED(null, 'window.resizeBy'),
+    resizeTo: NOT_IMPLEMENTED(null, 'window.resizeTo'),
+    scroll: NOT_IMPLEMENTED(null, 'window.scroll'),
+    scrollBy: NOT_IMPLEMENTED(null, 'window.scrollBy'),
+    scrollTo: NOT_IMPLEMENTED(null, 'window.scrollTo'),
+    screen : {
+      width : 0,
+      height : 0
+    },
+    Image : NOT_IMPLEMENTED(null, 'window.Image'),
+
+    // Note: these will not be necessary for newer Node.js versions, which have
+    // typed arrays in V8 and thus on every global object. (That is, in newer
+    // versions we'll get `ArrayBuffer` just as automatically as we get
+    // `Array`.) But to support older versions, we explicitly set them here.
+    Int8Array: Int8Array,
+    Int16Array: Int16Array,
+    Int32Array: Int32Array,
+    Float32Array: Float32Array,
+    Float64Array: Float64Array,
+    Uint8Array: Uint8Array,
+    Uint8ClampedArray: Uint8ClampedArray,
+    Uint16Array: Uint16Array,
+    Uint32Array: Uint32Array,
+    ArrayBuffer: ArrayBuffer
+  };
+
+  var window = new DOMWindow(options);
+
+  Contextify(window);
+
+  // We need to set up self references using Contextify's getGlobal() so that
+  // the global object identity is correct (window === this).
+  // See Contextify README for more info.
+  var global = window.getGlobal();
+
+  // Set up the window as if it's a top level window.
+  // If it's not, then references will be corrected by frame/iframe code.
+  // Note: window.frames is maintained in the HTMLFrameElement init function.
+  window.window = window.frames
+                = window.self
+                = window.parent
+                = window.top = global;
+
+  return window;
+};
+
+//Caching for HTMLParser require. HUGE performace boost.
+/**
+* 5000 iterations
+* Without cache: ~1800+ms
+* With cache: ~80ms
+*/
+// TODO: is this even needed in modern Node.js versions?
+var defaultParser = null;
+var getDefaultParser = exports.getDefaultParser = function () {
+  if (defaultParser === null) {
+    defaultParser = require('htmlparser2');
+  }
+  return defaultParser;
+}
+
+/**
+ * Export getter/setter of default parser to facilitate testing
+ * with different HTML parsers.
+ */
+exports.setDefaultParser = function (parser) {
+  if (typeof parser == 'object') {
+    defaultParser = parser;
+  } else if (typeof parser == 'string')
+    defaultParser = require(parser);
+}
+
+/**
+ * Augments the given DOM by adding browser-specific properties and methods (BOM).
+ * Returns the augmented DOM.
+ */
+var browserAugmentation = exports.browserAugmentation = function(dom, options) {
+
+  if(!options) {
+    options = {};
+  }
+
+  // set up html parser - use a provided one or try and load from library
+  var parser = options.parser || getDefaultParser();
+
+  if (dom._augmented && dom._parser === parser) {
+    return dom;
+  }
+
+  dom._parser = parser;
+  var htmltodom = new HtmlToDom(parser);
+
+  if (!dom.HTMLDocument) {
+    dom.HTMLDocument = dom.Document;
+  }
+  if (!dom.HTMLDocument.prototype.write) {
+    dom.HTMLDocument.prototype.write = function(html) {
+      this.innerHTML = html;
+    };
+  }
+
+  dom.Element.prototype.getElementsByClassName = function(className) {
+
+    function filterByClassName(child) {
+      if (!child) {
+        return false;
+      }
+
+      if (child.nodeType &&
+          child.nodeType === dom.Node.ENTITY_REFERENCE_NODE)
+      {
+        child = child._entity;
+      }
+
+      var classString = child.className;
+      if (classString) {
+        var s = classString.split(" ");
+        for (var i=0; i<s.length; i++) {
+          if (s[i] === className) {
+            return true;
+          }
+        }
+      }
+      return false;
+    }
+
+    return new dom.NodeList(this.ownerDocument || this, dom.mapper(this, filterByClassName));
+  };
+
+  dom.Element.prototype.__defineGetter__('sourceIndex', function() {
+    /*
+    * According to QuirksMode:
+    * Get the sourceIndex of element x. This is also the index number for
+    * the element in the document.getElementsByTagName('*') array.
+    * http://www.quirksmode.org/dom/w3c_core.html#t77
+    */
+    var items = this.ownerDocument.getElementsByTagName('*'),
+        len = items.length;
+
+    for (var i = 0; i < len; i++) {
+      if (items[i] === this) {
+        return i;
+      }
+    }
+  });
+
+  dom.Document.prototype.__defineGetter__('outerHTML', function() {
+    return domToHtml(this, true);
+  });
+
+  dom.Element.prototype.__defineGetter__('outerHTML', function() {
+    return domToHtml(this, true);
+  });
+
+  dom.Element.prototype.__defineGetter__('innerHTML', function() {
+    if (/^(?:script|style)$/.test(this._tagName)) {
+      var type = this.getAttribute('type');
+      if (!type || /^text\//i.test(type) || /\/javascript$/i.test(type)) {
+        return domToHtml(this._childNodes, true, true);
+      }
+    }
+
+    return domToHtml(this._childNodes, true);
+  });
+
+  dom.Element.prototype.__defineSetter__('doctype', function() {
+    throw new dom.DOMException(dom.NO_MODIFICATION_ALLOWED_ERR);
+  });
+  dom.Element.prototype.__defineGetter__('doctype', function() {
+    var r = null;
+    if (this.nodeName == '#document') {
+        if (this._doctype) {
+         r = this._doctype;
+        }
+    }
+    return r;
+  });
+
+  dom.Element.prototype.__defineSetter__('innerHTML', function(html) {
+    //Clear the children first:
+    var child;
+    while ((child = this._childNodes[0])) {
+      this.removeChild(child);
+    }
+
+    if (this.nodeName === '#document') {
+      parseDocType(this, html);
+    }
+    if (html !== "" && html != null) {
+      htmltodom.appendHtmlToElement(html, this);
+    }
+    return html;
+  });
+
+
+  dom.Document.prototype.__defineGetter__('innerHTML', function() {
+    return domToHtml(this._childNodes, true);
+  });
+
+  dom.Document.prototype.__defineSetter__('innerHTML', function(html) {
+    //Clear the children first:
+    var child;
+    while ((child = this._childNodes[0])) {
+      this.removeChild(child);
+    }
+
+    if (this.nodeName === '#document') {
+      parseDocType(this, html);
+    }
+    if (html !== "" && html != null) {
+      htmltodom.appendHtmlToElement(html, this);
+    }
+    return html;
+  });
+
+  var DOC_HTML5      = /<!doctype html>/i,
+      DOC_TYPE       = /<!DOCTYPE (\w(.|\n)*)">/i,
+      DOC_TYPE_START = '<!DOCTYPE ',
+      DOC_TYPE_END   = '">';
+
+  function parseDocType(doc, html) {
+    var publicID = '',
+        systemID = '',
+        fullDT = '',
+        name = 'HTML',
+        set = true,
+        doctype = html.match(DOC_HTML5);
+
+    //Default, No doctype === null
+    doc._doctype = null;
+
+    if (doctype && doctype[0]) { //Handle the HTML shorty doctype
+      fullDT = doctype[0];
+    } else { //Parse the doctype
+      // find the start
+      var start     = html.indexOf(DOC_TYPE_START),
+          end       = html.indexOf(DOC_TYPE_END),
+          docString;
+
+      if (start < 0 || end < 0) {
+        return;
+      }
+
+      docString = html.substr(start, (end-start)+DOC_TYPE_END.length);
+      doctype = docString.replace(/[\n\r]/g,'').match(DOC_TYPE);
+
+      if (!doctype) {
+        return;
+      }
+
+      fullDT = doctype[0];
+      doctype = doctype[1].split(' "');
+      var _id1 = doctype.length ? doctype.pop().replace(/"/g, '') : '',
+          _id2 = doctype.length ? doctype.pop().replace(/"/g, '') : '';
+
+      if (_id1.indexOf('-//') !== -1) {
+        publicID = _id1;
+      }
+      if (_id2.indexOf('-//') !== -1) {
+        publicID = _id2;
+      }
+      if (_id1.indexOf('://') !== -1) {
+        systemID = _id1;
+      }
+      if (_id2.indexOf('://') !== -1) {
+        systemID = _id2;
+      }
+      if (doctype.length) {
+        doctype = doctype[0].split(' ');
+        name = doctype[0].toUpperCase();
+      }
+    }
+    doc._doctype = new dom.DOMImplementation().createDocumentType(name, publicID, systemID);
+    doc._doctype._ownerDocument = doc;
+    doc._doctype._fullDT = fullDT;
+    doc._doctype.toString = function() {
+      return this._fullDT;
+    };
+  }
+
+  dom.Document.prototype.getElementsByClassName = function(className) {
+
+    function filterByClassName(child) {
+      if (!child) {
+        return false;
+      }
+
+      if (child.nodeType &&
+          child.nodeType === dom.Node.ENTITY_REFERENCE_NODE)
+      {
+        child = child._entity;
+      }
+
+      var classString = child.className;
+      if (classString) {
+        var s = classString.split(" ");
+        for (var i=0; i<s.length; i++) {
+          if (s[i] === className) {
+            return true;
+          }
+        }
+      }
+      return false;
+    }
+
+    return new dom.NodeList(this.ownerDocument || this, dom.mapper(this, filterByClassName));
+  };
+
+  dom.Element.prototype.__defineGetter__('nodeName', function(val) {
+    return this._nodeName.toUpperCase();
+  });
+
+  dom.Element.prototype.__defineGetter__('tagName', function(val) {
+    var t = this._tagName.toUpperCase();
+    //Document should not return a tagName
+    if (this.nodeName === '#document') {
+      t = null;
+    }
+    return t;
+  });
+
+  dom.Element.prototype.scrollTop = 0;
+  dom.Element.prototype.scrollLeft = 0;
+
+  dom.Document.prototype.__defineGetter__('parentWindow', function() {
+    if (!this._parentWindow) {
+      this.parentWindow = exports.windowAugmentation(dom, {document: this, url: this.URL});
+    }
+    return this._parentWindow;
+  });
+
+  dom.Document.prototype.__defineSetter__('parentWindow', function(window) {
+    // Contextify does not support getters and setters, so we have to set them
+    // on the original object instead.
+    window._frame = function (name, frame) {
+      if (typeof frame === 'undefined') {
+        delete window[name];
+      } else {
+        window.__defineGetter__(name, function () { return frame.contentWindow; });
+      }
+    };
+    this._parentWindow = window.getGlobal();
+  });
+
+  dom.Document.prototype.__defineGetter__('defaultView', function() {
+    return this.parentWindow;
+  });
+
+  dom._augmented = true;
+  return dom;
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/browser/location.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/browser/location.js
new file mode 100644
index 0000000..111a325
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/browser/location.js
@@ -0,0 +1,98 @@
+"use strict";
+
+var URL = require("url");
+var NOT_IMPLEMENTED = require("./utils").NOT_IMPLEMENTED;
+
+module.exports = Location;
+
+function Location(urlString, window) {
+  this._url = URL.parse(urlString);
+  this._window = window;
+}
+
+Location.prototype = {
+  constructor: Location,
+  reload: function () {
+    NOT_IMPLEMENTED(this._window, "location.reload")();
+  },
+  get protocol() { return this._url.protocol; },
+  get host() { return this._url.host; },
+  get auth() { return this._url.auth; },
+  get hostname() { return this._url.hostname; },
+  get port() { return this._url.port; },
+  get pathname() { return this._url.pathname; },
+  get href() { return this._url.href; },
+  get hash() { return this._url.hash || ""; },
+  get search() { return this._url.search || ""; },
+
+  set href(val) {
+    var oldUrl = this._url.href;
+    var oldProtocol = this._url.protocol;
+    var oldHost = this._url.host;
+    var oldPathname = this._url.pathname;
+    var oldHash = this._url.hash || "";
+
+    this._url = URL.parse(URL.resolve(oldUrl, val));
+    var newUrl = this._url.href;
+    var newProtocol = this._url.protocol;
+    var newHost = this._url.host;
+    var newPathname = this._url.pathname;
+    var newHash = this._url.hash || "";
+
+    if (oldProtocol === newProtocol && oldHost === newHost && oldPathname === newPathname && oldHash !== newHash) {
+      this._signalHashChange(oldUrl, newUrl);
+    } else {
+      NOT_IMPLEMENTED(this._window, "location.href (no reload)")();
+    }
+  },
+
+  set hash(val) {
+    var oldUrl = this._url.href;
+    var oldHash = this._url.hash || "";
+
+    if (val.lastIndexOf("#", 0) !== 0) {
+      val = "#" + val;
+    }
+
+    this._url = URL.parse(URL.resolve(oldUrl, val));
+    var newUrl = this._url.href;
+    var newHash = this._url.hash || "";
+
+    if (oldHash !== newHash) {
+      this._signalHashChange(oldUrl, newUrl);
+    }
+  },
+
+  set search(val) {
+    var oldUrl = this._url.href;
+    var oldHash = this._url.hash || "";
+    if (val.length) {
+      if (val.lastIndexOf("?", 0) !== 0) {
+        val = "?" + val;
+      }
+      this._url = URL.parse(URL.resolve(oldUrl, val + oldHash));
+    } else {
+      this._url = URL.parse(oldUrl.replace(/\?([^#]+)/, ""));
+    }
+  },
+
+  replace: function (val) {
+    this.href = val;
+  },
+
+  toString: function () {
+    return this._url.href;
+  },
+
+  _signalHashChange: function (oldUrl, newUrl) {
+    if (this._window.document) {
+      var ev = this._window.document.createEvent("HTMLEvents");
+      ev.initEvent("hashchange", false, false);
+      ev.oldUrl = oldUrl;
+      ev.newUrl = newUrl;
+      process.nextTick(function () {
+        this._window.dispatchEvent(ev);
+      }.bind(this));
+    }
+  }
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/browser/utils.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/browser/utils.js
new file mode 100644
index 0000000..c282f77
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/browser/utils.js
@@ -0,0 +1,12 @@
+"use strict";
+
+var jsdom = require("../../jsdom");
+
+exports.NOT_IMPLEMENTED = function (target, nameForErrorMessage) {
+  return function () {
+    if (!jsdom.debugMode) {
+      var raise = target ? target.raise : this.raise;
+      raise.call(this, "error", "NOT IMPLEMENTED" + (nameForErrorMessage ? ": " + nameForErrorMessage : ""));
+    }
+  };
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level1/core.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level1/core.js
new file mode 100644
index 0000000..5763f79
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level1/core.js
@@ -0,0 +1,1786 @@
+/*
+  ServerJS Javascript DOM Level 1
+*/
+
+// utility functions
+var attachId = function(id,elm,doc) {
+  if (id && elm && doc) {
+    if (!doc._ids[id]) {
+      doc._ids[id] = [];
+    }
+    doc._ids[id].push(elm);
+  }
+};
+var detachId = function(id,elm,doc) {
+  var elms, i;
+  if (id && elm && doc) {
+    if (doc._ids && doc._ids[id]) {
+      elms = doc._ids[id];
+      for (i=0;i<elms.length;i++) {
+        if (elms[i] === elm) {
+          elms.splice(i,1);
+          i--;
+        }
+      }
+      if (elms.length === 0) {
+        delete doc._ids[id];
+      }
+    }
+  }
+};
+
+var core = {
+
+  mapper: function(parent, filter, recursive) {
+    return function() {
+      return core.mapDOMNodes(parent, recursive !== false, filter);
+    };
+  },
+
+  // Returns Array
+  mapDOMNodes : function(parent, recursive, callback) {
+    function visit(parent, result) {
+      return Array.prototype.reduce.call(parent.childNodes, reducer, result);
+    }
+
+    function reducer(array, child) {
+      if (callback(child)) {
+        array.push(child);
+      }
+      if (recursive && child._childNodes) {
+        visit(child, array);
+      }
+      return array;
+    }
+
+    return visit(parent, []);
+  },
+
+  visitTree: function(root, callback) {
+    var cur = root; // TODO: Unroll this.
+
+    function visit(el) {
+      if (el) {
+        callback(el);
+        if (el._childNodes) {
+          var i        = 0,
+              children = el._childNodes,
+              l        = children.length;
+
+          for (i; i<l; i++) {
+            visit(children[i]);
+          }
+        }
+      }
+    }
+    visit(root);
+  },
+
+  markTreeReadonly: function(node) {
+    function markLevel(el) {
+      el._readonly = true;
+      // also mark attributes and their children read-only
+      if (el.attributes) {
+        var attributes = el.attributes, l = attributes.length, i=0;
+        attributes._readonly = true;
+
+        for (i; i<l; i++) {
+          core.visitTree(attributes[i], markLevel);
+        }
+      }
+    }
+
+    core.visitTree(node, markLevel);
+  }
+};
+
+// ExceptionCode
+var INDEX_SIZE_ERR              = core.INDEX_SIZE_ERR              = 1,
+    DOMSTRING_SIZE_ERR          = core.DOMSTRING_SIZE_ERR          = 2,
+    HIERARCHY_REQUEST_ERR       = core.HIERARCHY_REQUEST_ERR       = 3,
+    WRONG_DOCUMENT_ERR          = core.WRONG_DOCUMENT_ERR          = 4,
+    INVALID_CHARACTER_ERR       = core.INVALID_CHARACTER_ERR       = 5,
+    NO_DATA_ALLOWED_ERR         = core.NO_DATA_ALLOWED_ERR         = 6,
+    NO_MODIFICATION_ALLOWED_ERR = core.NO_MODIFICATION_ALLOWED_ERR = 7,
+    NOT_FOUND_ERR               = core.NOT_FOUND_ERR               = 8,
+    NOT_SUPPORTED_ERR           = core.NOT_SUPPORTED_ERR           = 9,
+    INUSE_ATTRIBUTE_ERR         = core.INUSE_ATTRIBUTE_ERR         = 10,
+
+// Node Types
+    ELEMENT_NODE                = 1,
+    ATTRIBUTE_NODE              = 2,
+    TEXT_NODE                   = 3,
+    CDATA_SECTION_NODE          = 4,
+    ENTITY_REFERENCE_NODE       = 5,
+    ENTITY_NODE                 = 6,
+    PROCESSING_INSTRUCTION_NODE = 7,
+    COMMENT_NODE                = 8,
+    DOCUMENT_NODE               = 9,
+    DOCUMENT_TYPE_NODE          = 10,
+    DOCUMENT_FRAGMENT_NODE      = 11,
+    NOTATION_NODE               = 12;
+
+var messages = core.exceptionMessages = { };
+messages[INDEX_SIZE_ERR]              = "Index size error";
+messages[DOMSTRING_SIZE_ERR]          = "DOMString size error";
+messages[HIERARCHY_REQUEST_ERR]       = "Hierarchy request error";
+messages[WRONG_DOCUMENT_ERR]          = "Wrong document";
+messages[INVALID_CHARACTER_ERR]       = "Invalid character";
+messages[NO_DATA_ALLOWED_ERR]         = "No data allowed";
+messages[NO_MODIFICATION_ALLOWED_ERR] = "No modification allowed";
+messages[NOT_FOUND_ERR]               = "Not found";
+messages[NOT_SUPPORTED_ERR]           = "Not supported";
+messages[INUSE_ATTRIBUTE_ERR]         = "Attribute in use";
+
+core.DOMException = function(code, message) {
+  this.code = code;
+  Error.call(this, core.exceptionMessages[code]);
+  this.message = core.exceptionMessages[code];
+  if(message) this.message = this.message + ": " + message;
+  if(Error.captureStackTrace) Error.captureStackTrace(this, core.DOMException);
+};
+
+core.DOMException.INDEX_SIZE_ERR              = INDEX_SIZE_ERR;
+core.DOMException.DOMSTRING_SIZE_ERR          = DOMSTRING_SIZE_ERR;
+core.DOMException.HIERARCHY_REQUEST_ERR       = HIERARCHY_REQUEST_ERR;
+core.DOMException.WRONG_DOCUMENT_ERR          = WRONG_DOCUMENT_ERR;
+core.DOMException.INVALID_CHARACTER_ERR       = INVALID_CHARACTER_ERR;
+core.DOMException.NO_DATA_ALLOWED_ERR         = NO_DATA_ALLOWED_ERR;
+core.DOMException.NO_MODIFICATION_ALLOWED_ERR = NO_MODIFICATION_ALLOWED_ERR;
+core.DOMException.NOT_FOUND_ERR               = NOT_FOUND_ERR;
+core.DOMException.NOT_SUPPORTED_ERR           = NOT_SUPPORTED_ERR;
+core.DOMException.INUSE_ATTRIBUTE_ERR         = INUSE_ATTRIBUTE_ERR;
+
+core.DOMException.prototype = {
+  INDEX_SIZE_ERR              : INDEX_SIZE_ERR,
+  DOMSTRING_SIZE_ERR          : DOMSTRING_SIZE_ERR,
+  HIERARCHY_REQUEST_ERR       : HIERARCHY_REQUEST_ERR,
+  WRONG_DOCUMENT_ERR          : WRONG_DOCUMENT_ERR,
+  INVALID_CHARACTER_ERR       : INVALID_CHARACTER_ERR,
+  NO_DATA_ALLOWED_ERR         : NO_DATA_ALLOWED_ERR,
+  NO_MODIFICATION_ALLOWED_ERR : NO_MODIFICATION_ALLOWED_ERR,
+  NOT_FOUND_ERR               : NOT_FOUND_ERR,
+  NOT_SUPPORTED_ERR           : NOT_SUPPORTED_ERR,
+  INUSE_ATTRIBUTE_ERR         : INUSE_ATTRIBUTE_ERR
+};
+
+core.DOMException.prototype.__proto__ = Error.prototype;
+
+core.NodeList = function NodeList(element, query) {
+  if (!query) {
+    // Non-live NodeList
+    if (Array.isArray(element)) {
+      Array.prototype.push.apply(this, element);
+    }
+    Object.defineProperties(this, {
+      _length: {value: element ? element.length : 0, writable:true}
+    });
+  } else {
+    Object.defineProperties(this, {
+      _element: {value: element},
+      _query: {value: query},
+      _snapshot: {writable: true},
+      _length: {value: 0, writable: true},
+      _version: {value: -1, writable: true}
+    });
+    this._update();
+  }
+};
+
+function lengthFromProperties(arrayLike) {
+  var max = -1;
+  for (var i in arrayLike) {
+    var asNumber = +i;
+    if (!isNaN(asNumber) && asNumber > max) {
+      max = asNumber;
+    }
+  }
+  return max + 1;
+}
+core.NodeList.prototype = {
+  _update: function() {
+    var i;
+
+    if (!this._element) {
+      this._length = lengthFromProperties(this);
+    } else {
+      if (this._version < this._element._version) {
+        var nodes = this._snapshot = this._query();
+        this._resetTo(nodes);
+        this._version = this._element._version;
+      }
+    }
+  },
+  _resetTo: function(array) {
+    var startingLength = lengthFromProperties(this);
+    for (var i = 0; i < startingLength; ++i) {
+      delete this[i];
+    }
+
+    for (var j = 0; j < array.length; ++j) {
+      this[j] = array[j];
+    }
+    this._length = array.length;
+  },
+  _toArray: function() {
+    if (this._element) {
+      this._update();
+      return this._snapshot;
+    }
+
+    return Array.prototype.slice.call(this);
+  },
+  get length() {
+    this._update();
+    return this._length || 0;
+  },
+  item: function(index) {
+    this._update();
+    return this[index] || null;
+  },
+  toString: function() {
+    return '[ jsdom NodeList ]: contains ' + this.length + ' items';
+  }
+};
+Object.defineProperty(core.NodeList.prototype, 'constructor', {
+  value: core.NodeList,
+  writable: true,
+  configurable: true
+});
+
+core.DOMImplementation = function DOMImplementation(document, /* Object */ features) {
+  this._ownerDocument = document;
+  this._features = {};
+
+  if (features) {
+    for (var feature in features) {
+      if (features.hasOwnProperty(feature)) {
+        this.addFeature(feature.toLowerCase(), features[feature]);
+      }
+    }
+  }
+};
+
+core.DOMImplementation.prototype = {
+  get ownerDocument() { return this._ownerDocument },
+  removeFeature : function(feature, version) {
+    feature = feature.toLowerCase();
+    if (this._features[feature]) {
+      if (version) {
+        var j        = 0,
+            versions = this._features[feature],
+            l        = versions.length;
+
+        for (j; j<l; j++) {
+          if (versions[j] === version) {
+            versions.splice(j,1);
+            return;
+          }
+        }
+      } else {
+        delete this._features[feature];
+      }
+    }
+  },
+
+  addFeature: function(feature, version) {
+    feature = feature.toLowerCase();
+
+    if (version) {
+
+      if (!this._features[feature]) {
+        this._features[feature] = [];
+      }
+
+      if (version instanceof Array) {
+        Array.prototype.push.apply(this._features[feature], version);
+      } else {
+        this._features[feature].push(version);
+      }
+    }
+  },
+
+  hasFeature: function(/* string */ feature, /* string */ version) {
+    feature = (feature) ? feature.toLowerCase() : '';
+    var versions = (this._features[feature]) ?
+                    this._features[feature]  :
+                    false;
+
+    if (!version && versions.length && versions.length > 0) {
+      return true;
+    } else if (typeof versions === 'string') {
+      return versions === version;
+    } else if (versions.indexOf && versions.length > 0) {
+      for (var i = 0; i < versions.length; i++) {
+        var found = versions[i] instanceof RegExp ?
+          versions[i].test(version) :
+          versions[i] === version;
+        if (found) { return true; }
+      }
+      return false;
+    } else {
+      return false;
+    }
+  }
+};
+
+
+var attrCopy = function(src, dest, fn) {
+  if (src.attributes) {
+    var attrs = src.attributes, i, l = attrs.length, attr, copied;
+    for (i=0;i<l;i++) {
+      attr = attrs[i];
+      // skip over default attributes
+      if (!attr.specified) {
+        continue;
+      }
+      // TODO: consider duplicating this code and moving it into level2/core
+      if (attr.namespaceURI) {
+        dest.setAttributeNS(attr.namespaceURI,
+                                     attr.nodeName,
+                                     attr.nodeValue);
+        var localName = attr.nodeName.split(':').pop();
+        copied = dest.getAttributeNodeNS(attr.namespaceURI, localName);
+      } else {
+        dest.setAttribute(attr.nodeName, attr.nodeValue);
+        copied = dest.getAttributeNode(attr.nodeName);
+      }
+      if (typeof fn == "function") {
+        fn(attr, copied);
+      }
+
+    }
+  }
+  return dest;
+};
+
+core.Node = function Node(ownerDocument) {
+  this._childNodes = new core.NodeList();
+  this._ownerDocument = ownerDocument;
+  this._attributes = new core.AttrNodeMap(ownerDocument, this);
+  this._nodeName = null;
+  this._childrenList = null;
+  this._version = 0;
+  this._nodeValue = null;
+  this._parentNode = null;
+  this._nodeName = null;
+  this._readonly = false;
+};
+
+core.Node.ELEMENT_NODE                = ELEMENT_NODE;
+core.Node.ATTRIBUTE_NODE              = ATTRIBUTE_NODE;
+core.Node.TEXT_NODE                   = TEXT_NODE;
+core.Node.CDATA_SECTION_NODE          = CDATA_SECTION_NODE;
+core.Node.ENTITY_REFERENCE_NODE       = ENTITY_REFERENCE_NODE;
+core.Node.ENTITY_NODE                 = ENTITY_NODE;
+core.Node.PROCESSING_INSTRUCTION_NODE = PROCESSING_INSTRUCTION_NODE;
+core.Node.COMMENT_NODE                = COMMENT_NODE;
+core.Node.DOCUMENT_NODE               = DOCUMENT_NODE;
+core.Node.DOCUMENT_TYPE_NODE          = DOCUMENT_TYPE_NODE;
+core.Node.DOCUMENT_FRAGMENT_NODE      = DOCUMENT_FRAGMENT_NODE;
+core.Node.NOTATION_NODE               = NOTATION_NODE;
+
+core.Node.prototype = {
+  ELEMENT_NODE                : ELEMENT_NODE,
+  ATTRIBUTE_NODE              : ATTRIBUTE_NODE,
+  TEXT_NODE                   : TEXT_NODE,
+  CDATA_SECTION_NODE          : CDATA_SECTION_NODE,
+  ENTITY_REFERENCE_NODE       : ENTITY_REFERENCE_NODE,
+  ENTITY_NODE                 : ENTITY_NODE,
+  PROCESSING_INSTRUCTION_NODE : PROCESSING_INSTRUCTION_NODE,
+  COMMENT_NODE                : COMMENT_NODE,
+  DOCUMENT_NODE               : DOCUMENT_NODE,
+  DOCUMENT_TYPE_NODE          : DOCUMENT_TYPE_NODE,
+  DOCUMENT_FRAGMENT_NODE      : DOCUMENT_FRAGMENT_NODE,
+  NOTATION_NODE               : NOTATION_NODE,
+
+  get children() {
+    if (!this._childrenList) {
+      var self = this;
+      this._childrenList = new core.NodeList(this, function() {
+        return Array.prototype.filter.call(self._childNodes, function(node) {
+          return node.tagName;
+        });
+      });
+    }
+    return this._childrenList;
+  },
+  get nodeValue() {
+    return this._nodeValue;
+  },
+  set nodeValue(value) {
+    // readonly
+    if (this._readonly === true) {
+      throw new core.DOMException(NO_MODIFICATION_ALLOWED_ERR, 'Attempting to modify a read-only node');
+    }
+
+    this._nodeValue = value;
+  },
+  get parentNode() { return this._parentNode;},
+
+  get nodeName() {
+    var name = this._nodeName || this._tagName;
+    if (this.nodeType === ELEMENT_NODE &&
+        this._ownerDocument                  &&
+        this._ownerDocument._doctype          &&
+        this._ownerDocument._doctype.name.toLowerCase().indexOf("html") !== -1)
+    {
+      return name.toUpperCase();
+    }
+    return name;
+  },
+  set nodeName(unused) { throw new core.DOMException();},
+  get attributes() { return this._attributes;},
+  get firstChild() {
+    return this._childNodes.length > 0 ? this._childNodes[0] : null;
+  },
+  set firstChild(unused) { throw new core.DOMException();},
+  get ownerDocument() { return this._ownerDocument;},
+  get readonly() { return this._readonly;},
+
+  get lastChild() {
+    var len = this._childNodes.length;
+    return len > 0 ? this._childNodes[len -1] : null;
+  },
+  set lastChild(unused) { throw new core.DOMException();},
+
+  get childNodes() {
+    return this._childNodes;
+  },
+  set childNodes(unused) { throw new core.DOMException();},
+
+  _indexOf: function(/*Node*/ child) {
+    if (!this._childNodes ||
+	!this._childNodes.length) {
+      return -1;
+    }
+
+    var currentNode, index = 0, children = this._childNodes;
+
+    while ((currentNode = children[index])) {
+      if (currentNode == child) {
+        break;
+      }
+      index++;
+    }
+
+    if (currentNode == child) {
+      return index;
+    }
+    return -1;
+  },
+
+  get nextSibling() {
+    // find this node's index in the parentNode, add one and call it a day
+    if (!this._parentNode || !this._parentNode._indexOf) {
+      return null;
+    }
+
+    var index = this._parentNode._indexOf(this);
+
+    if (index == -1 || index+1 >= this._parentNode._childNodes.length) {
+      return null;
+    }
+
+    return this._parentNode._childNodes[index+1] || null;
+  },
+  set nextSibling(unused) { throw new core.DOMException();},
+
+  get previousSibling() {
+    if (!this._parentNode || !this._parentNode._indexOf) {
+      return null;
+    }
+
+    var index = this._parentNode._indexOf(this);
+
+    if (index == -1 || index-1 < 0) {
+      return null;
+    }
+
+    return this._parentNode._childNodes[index-1] || null;
+  },
+  set previousSibling(unused) { throw new core.DOMException();},
+
+  /* returns Node */
+  insertBefore :  function(/* Node */ newChild, /* Node*/ refChild) {
+    if (this._readonly === true) {
+      throw new core.DOMException(NO_MODIFICATION_ALLOWED_ERR, 'Attempting to modify a read-only node');
+    }
+
+    // Adopt unowned children, for weird nodes like DocumentType
+    if (!newChild._ownerDocument) newChild._ownerDocument = this._ownerDocument;
+
+    // TODO - if (!newChild) then?
+    if (newChild._ownerDocument !== this._ownerDocument) {
+      throw new core.DOMException(WRONG_DOCUMENT_ERR);
+    }
+
+    if (newChild.nodeType && newChild.nodeType === ATTRIBUTE_NODE) {
+      throw new core.DOMException(HIERARCHY_REQUEST_ERR);
+    }
+
+    // search for parents matching the newChild
+    var current = this;
+    do {
+      if (current === newChild) {
+        throw new core.DOMException(HIERARCHY_REQUEST_ERR);
+      }
+    } while((current = current._parentNode));
+
+    // fragments are merged into the element
+    if (newChild.nodeType === DOCUMENT_FRAGMENT_NODE) {
+      var tmpNode, i = newChild._childNodes.length;
+      while (i-- > 0) {
+        tmpNode = newChild.removeChild(newChild.firstChild);
+        this.insertBefore(tmpNode, refChild);
+      }
+    } else if (newChild === refChild) {
+      return newChild;
+    } else {
+      // if the newChild is already in the tree elsewhere, remove it first
+      if (newChild._parentNode) {
+        newChild._parentNode.removeChild(newChild);
+      }
+
+      if (refChild == null) {
+        var refChildIndex = this._childNodes.length;
+      } else {
+        var refChildIndex = this._indexOf(refChild);
+        if (refChildIndex == -1) {
+          throw new core.DOMException(NOT_FOUND_ERR);
+        }
+      }
+
+      Array.prototype.splice.call(this._childNodes, refChildIndex, 0, newChild);
+
+      newChild._parentNode = this;
+      if (this._attached && newChild._attach) {
+        newChild._attach();
+      }
+
+      this._modified();
+    }
+
+    return newChild;
+  }, // raises(DOMException);
+
+  _modified: function() {
+    this._version++;
+    if (this._ownerDocument) {
+      this._ownerDocument._version++;
+    }
+
+    if (this._childrenList) {
+      this._childrenList._update();
+    }
+  },
+
+  _attrModified: function(name, value, oldValue) {
+    if (name == 'id' && this._attached) {
+      var doc = this._ownerDocument;
+      detachId(oldValue,this,doc);
+      attachId(value,this,doc);
+    }
+
+    // Check for inline event handlers.
+    // We can't set these like other attributes then look it up in
+    // dispatchEvent() because that would create 2 'traditional' event handlers
+    // in the case where there's an inline event handler attribute, plus one
+    // set using element.on* in a script.
+    //
+    // @see http://www.w3.org/TR/2011/WD-html5-20110405/webappapis.html#event-handler-content-attributes
+    if ((name.length > 2) && (name[0] == 'o') && (name[1] == 'n')) {
+        if (value) {
+          var self = this;
+          // Check whether we're the window. This can happen because inline
+          // handlers on the body are proxied to the window.
+          var w = (typeof self.run !== 'undefined') ? self : self._ownerDocument.parentWindow;
+          self[name] = function (event) {
+              // The handler code probably refers to functions declared in the
+              // window context, so we need to call run().
+
+              // Use awesome hacks to get the correct `this` context for the
+              // inline event handler. This would only be necessary if we're an
+              // element, but for the sake of simplicity we also do it on window.
+
+              // Also set event variable and support `return false`.
+              w.__tempContextForInlineEventHandler = self;
+              w.__tempEvent = event;
+              w.run("if ((function (event) {" + value + "}).call(" +
+                "window.__tempContextForInlineEventHandler, window.__tempEvent) === false) {" +
+                "window.__tempEvent.preventDefault()}");
+              delete w.__tempContextForInlineEventHandler;
+              delete w.__tempEvent;
+          };
+        } else {
+          this[name] = null;
+        }
+    }
+  },
+
+  /* returns Node */
+  replaceChild : function(/* Node */ newChild, /* Node */ oldChild){
+    this.insertBefore(newChild, oldChild);
+    return this.removeChild(oldChild);
+  }, //raises(DOMException);
+
+  /* returns void */
+  _attach : function() {
+    this._attached = true;
+    if (this.id) {
+      attachId(this.id,this,this._ownerDocument);
+    }
+    for (var i=0,len=this._childNodes.length;i<len;i++) {
+      if (this._childNodes[i]._attach) {
+        this._childNodes[i]._attach();
+      }
+    }
+  },
+  /* returns void */
+  _detach : function() {
+    var i, elms;
+    this._attached = false;
+    if (this.id) {
+      detachId(this.id,this,this._ownerDocument);
+    }
+    for (var i=0,len=this._childNodes.length;i<len;i++) {
+      this._childNodes[i]._detach();
+    }
+  },
+
+  /* returns Node */
+  removeChild : function(/* Node */ oldChild){
+    if (this._readonly === true) {
+      throw new core.DOMException(NO_MODIFICATION_ALLOWED_ERR);
+    }
+
+    // TODO - if (!oldChild) then?
+    var oldChildIndex = this._indexOf(oldChild);
+    if (oldChildIndex == -1) {
+      throw new core.DOMException(NOT_FOUND_ERR);
+    }
+
+    Array.prototype.splice.call(this._childNodes, oldChildIndex, 1);
+    oldChild._parentNode = null;
+    this._modified();
+    oldChild._detach();
+    return oldChild;
+  }, // raises(DOMException);
+
+  /* returns Node */
+  appendChild : function(/* Node */ newChild) {
+    return this.insertBefore(newChild, null);
+  }, // raises(DOMException);
+
+  /* returns boolean */
+  hasChildNodes : function() {
+    return this._childNodes.length > 0;
+  },
+
+  /* returns Node */
+  cloneNode : function(/* bool */ deep, fn) {
+
+    var object = null;
+    switch (this.nodeType) {
+
+      case this.ELEMENT_NODE:
+        object = attrCopy(this,this._ownerDocument.createElement(this.tagName), fn);
+      break;
+
+      case this.TEXT_NODE:
+        object = attrCopy(this,this._ownerDocument.createTextNode(this.tagName));
+        object.nodeValue = this.nodeValue;
+      break;
+      case this.CDATA_SECTION_NODE:
+        object = this._ownerDocument.createCDATASection(this.tagName);
+        object.nodeValue = this.nodeValue;
+      break;
+      case this.ENTITY_REFERENCE_NODE:
+        var name = (this._entity) ? this._entity.name : this._entityName,
+            ref  = this._ownerDocument.createEntityReference(name);
+
+        object = attrCopy(this, ref);
+        object.nodeValue = this.nodeValue;
+      break;
+      case this.ATTRIBUTE_NODE:
+        object = this._ownerDocument.createAttribute(this.name);
+      break;
+      case this.ENTITY_NODE:
+        var entity = this._ownerDocument.createEntityNode(this.name);
+        object = attrCopy(this, entity);
+        object.nodeValue = this.nodeValue;
+        object._publicId = this._publicId;
+        object._systemId = this._systemId;
+        object._notationName = this.notationName;
+      break;
+      case this.PROCESSING_INSTRUCTION_NODE:
+        var pi = this._ownerDocument.createProcessingInstruction(this._target,
+                                                                this._data);
+        object = attrCopy(this, pi);
+        object.nodeValue = this.nodeValue;
+      break;
+      case this.COMMENT_NODE:
+        object = this._ownerDocument.createComment(this.tagName);
+        object.nodeValue = this.nodeValue;
+      break;
+      case this.DOCUMENT_NODE:
+        object = attrCopy(this, new core.Document());
+        // TODO: clone the doctype/entities/notations/etc?
+      break;
+      case this.DOCUMENT_TYPE_NODE:
+        object = attrCopy(this, new core.DocumentType());
+        object.nodeValue = this.nodeValue;
+      break;
+      case this.DOCUMENT_FRAGMENT_NODE:
+        object = this._ownerDocument.createDocumentFragment();
+      break;
+      case this.NOTATION_NODE:
+        object = this._ownerDocument.createNotationNode(this._name,
+                                                       this._publicId,
+                                                       this._systemId);
+        object = attrCopy(this,object);
+        object.nodeValue = this.nodeValue;
+      break;
+      default:
+        throw new core.DOMException(NOT_FOUND_ERR);
+      break;
+    }
+
+    if (typeof fn === "function") {
+      fn(this, object);
+    }
+
+    if (deep || this.nodeType === ATTRIBUTE_NODE) {
+      var clone = null;
+      for (var i=0,len=this._childNodes.length;i<len;i++)
+      {
+        clone = this._childNodes[i].cloneNode(true);
+        if (clone.nodeType === ATTRIBUTE_NODE) {
+          object.setAttributeNode(clone);
+        } else {
+          var readonly = object._readonly;
+          object._readonly = false;
+          object.appendChild(clone);
+          object._readonly = readonly;
+        }
+      }
+    }
+
+    return object;
+  },
+
+  /* returns void */
+  normalize: function() {
+    var prevChild, child, attr,i;
+
+    if (this._attributes && this._attributes.length) {
+      for (i=0;i<this._attributes.length;i++)
+      {
+        if (this._attributes.item(i)) {
+          attr = this._attributes.item(i).normalize();
+        }
+      }
+    }
+
+    for (i=0;i<this._childNodes.length;i++)
+    {
+      child = this._childNodes[i];
+
+      if (child.normalize) {
+        child.normalize();
+      }
+
+      // Level2/core clean off empty nodes
+      if (child.nodeValue === "") {
+        this.removeChild(child);
+        i--;
+        continue;
+      }
+
+      if (i>0) {
+        prevChild = this._childNodes[i-1];
+
+        if (child.nodeType === TEXT_NODE &&
+            prevChild.nodeType === TEXT_NODE)
+        {
+
+          // remove the child and decrement i
+          prevChild.appendData(child.nodeValue);
+
+          this.removeChild(child);
+          i--;
+        }
+      }
+    }
+  },
+  toString: function() {
+    var id = '';
+    if (this.id) {
+        id = '#' + this.id;
+    }
+    if (this.className) {
+        var classes = this.className.split(/\s+/);
+	for (var i = 0, len = classes.length; i < len; i++) {
+	    id += '.' + classes[i];
+	}
+    }
+    return '[ ' + this.tagName + id + ' ]';
+  },
+  raise: function(type, message, data) {
+    var text = type + ": " + message;
+
+    if (data) {
+      if (data.exception) {
+        text = data.exception.stack;
+      } else {
+        text += ' - More:\n' + data;
+      }
+    }
+
+    if (type === "error") {
+      if (!this.errors) {
+        this.errors = [];
+      }
+      // TODO: consider using actual `Error` objects or `DOMException`s even..
+      var err = {
+        type    : type,
+        message : message || "No message",
+        data    : data || null
+      };
+
+      this.errors.push(err);
+
+      if (this._ownerDocument        &&
+          this._ownerDocument.raise &&
+          this !== this._ownerDocument)
+      {
+        this._ownerDocument.raise(type, message, data);
+      }
+    }
+  }
+};
+
+
+core.NamedNodeMap = function NamedNodeMap(document) {
+  this._nodes = Object.create(null);
+  this._nsStore = {};
+  this.length = 0;
+  this._ownerDocument = document;
+  this._readonly = false;
+};
+core.NamedNodeMap.prototype = {
+  get readonly() { return this._readonly;},
+  get ownerDocument() { this._ownerDocument;},
+
+  exists : function(name) {
+    return (this._nodes[name] || this._nodes[name] === null) ? true : false;
+  },
+
+  /* returns Node */
+  getNamedItem: function(/* string */ name) {
+    return this._nodes[name] || null;
+  },
+
+  /* returns Node */
+  setNamedItem: function(/* Node */ arg) {
+
+    // readonly
+    if (this._readonly === true) {
+      throw new core.DOMException(NO_MODIFICATION_ALLOWED_ERR);
+    }
+
+    // arg is from a different document
+    if (arg && arg._ownerDocument !== this._ownerDocument) {
+      throw new core.DOMException(WRONG_DOCUMENT_ERR);
+    }
+
+    // if this argument is already in use..
+    if (arg && arg._ownerElement) {
+      throw new core.DOMException(INUSE_ATTRIBUTE_ERR);
+    }
+
+    var name = arg.name || arg.tagName;
+    var ret = this._nodes[name];
+    if (!ret) {
+      this.length++;
+      ret = null;
+    }
+    arg._specified = true;
+    this[name] = this._nodes[name] = arg;
+    return ret;
+  }, // raises: function(DOMException) {},
+
+  /* returns Node */
+  removeNamedItem: function(/* string */ name) {
+
+    // readonly
+    if (this._readonly === true) {
+      throw new core.DOMException(NO_MODIFICATION_ALLOWED_ERR);
+    }
+
+    if (!this._nodes[name]) {
+      throw new core.DOMException(NOT_FOUND_ERR);
+    }
+
+    var prev = this._nodes[name] || null;
+    delete this._nodes[name];
+    delete this[name];
+
+    this.length--;
+    return prev;
+  }, // raises: function(DOMException) {},
+
+  /* returns Node */
+  item: function(/* int */ index) {
+    var current = 0;
+    for (var member in this._nodes) {
+      if (current === index && this._nodes[member]) {
+        return this._nodes[member];
+      }
+      current++;
+    }
+    return null;
+  }
+};
+
+core.AttrNodeMap = function AttrNodeMap(document, parentNode) {
+  core.NamedNodeMap.call(this, document);
+  this._parentNode = parentNode;
+};
+core.AttrNodeMap.prototype = {
+  get parentNode() { return this._parentNode;},
+
+  /* returns Node */
+  setNamedItem: function(/* Node */ arg) {
+    var prev = core.NamedNodeMap.prototype.setNamedItem.call(this, arg);
+    var p = this._parentNode;
+    arg._ownerElement = p;
+    p._attrModified(arg.name, arg.value, prev && prev.value || null);
+    p._modified();
+    return prev;
+  },
+
+  /* returns Node */
+  removeNamedItem: function(/* string */ name) {
+    var prev = core.NamedNodeMap.prototype.removeNamedItem.call(this, name);
+    var p = this._parentNode;
+
+    prev._ownerElement = null;
+    p._attrModified(name);
+    p._modified();
+
+    var doc = this._ownerDocument;
+
+    // set default value if available
+    if (doc && doc._doctype && doc._doctype.name.toLowerCase() !== "html") {
+      var defaultValue = false,
+          elem         = doc._doctype._attributes
+                                     .getNamedItem(this._parentNode.nodeName);
+
+      if (elem) {
+        var defaultValue = elem.attributes.getNamedItem(name);
+
+        if (defaultValue) {
+          var attr = doc.createAttribute(name);
+          attr.value = defaultValue.value;
+          attr._specified = false;
+          this._nodes[name] = attr;
+          this.length++;
+        }
+      }
+    }
+    return prev;
+  }, // raises: function(DOMException) {},
+};
+core.AttrNodeMap.prototype.__proto__ = core.NamedNodeMap.prototype;
+
+core.NotationNodeMap = function NotationNodeMap(document) {
+  core.NamedNodeMap.call(this, document);
+  this._readonly = false;
+  for (var i=1;i<arguments.length;i++) {
+    this.setNamedItem(arguments[i]);
+  }
+  this._readonly = true;
+};
+core.NotationNodeMap.prototype = {};
+core.NotationNodeMap.prototype.__proto__ = core.NamedNodeMap.prototype;
+
+core.EntityNodeMap = function EntityNodeMap(document) {
+  core.NamedNodeMap.call(this,document);
+  this._readonly = false;
+  var i = 1, l = arguments.length;
+
+  for (i=1; i<l; i++) {
+    this.setNamedItem(arguments[i]);
+  }
+  core.markTreeReadonly(this);
+};
+core.EntityNodeMap.prototype = {};
+core.EntityNodeMap.prototype.__proto__ = core.NamedNodeMap.prototype;
+
+
+core.Element = function Element(document, tagName) {
+  this._ownerDocument = document;
+  core.Node.call(this, document);
+  this._nodeName = tagName;
+  this._tagName = tagName;
+};
+
+core.Element.prototype = {
+
+  get nodeValue() { return null;},
+  set nodeValue(value) { /* do nothing */ },
+  get tagName() {
+    if (this.nodeType === ELEMENT_NODE &&
+        this._ownerDocument                  &&
+        this._ownerDocument._doctype          &&
+        this._ownerDocument._doctype.name.toLowerCase().indexOf("html") !== -1)
+    {
+      return this.nodeName.toUpperCase();
+    }
+    return this.nodeName;
+  },
+  nodeType : ELEMENT_NODE,
+  get attributes() {
+    for(var i=0; i<this._attributes.length; i++) {
+      this._attributes[i] = this._attributes.item(i);
+    }
+    return this._attributes;
+  },
+
+  /* returns string */
+  getAttribute: function(/* string */ name) {
+    var attribute = this._attributes.getNamedItem(name);
+    if (attribute) {
+      return attribute.value;
+    }
+    return null;
+  },
+
+  /* returns string */
+  setAttribute: function(/* string */ name, /* string */ value) {
+    if (this._ownerDocument) {
+      var attr = this._ownerDocument.createAttribute(name);
+      attr.value = value;
+      this._attributes.setNamedItem(attr);
+    }
+
+  }, //raises: function(DOMException) {},
+
+  /* returns string */
+  removeAttribute: function(/* string */ name) {
+    if (!this._attributes.exists(name)) {
+      return;
+    }
+
+    this._attributes.removeNamedItem(name);
+  }, // raises: function(DOMException) {},
+
+  /* returns Attr */
+  getAttributeNode: function(/* string */ name) {
+    return this._attributes.getNamedItem(name);
+  },
+
+  /* returns Attr */
+  setAttributeNode: function(/* Attr */ newAttr) {
+    var prevNode = this._attributes.getNamedItem(newAttr.name);
+    if (prevNode) {
+      prevNode._ownerElement = null;
+    }
+
+    this._attributes.setNamedItem(newAttr);
+
+    return (prevNode && prevNode.specified) ? prevNode : null;
+  }, //  raises: function(DOMException) {},
+
+  /* returns Attr */
+  removeAttributeNode: function(/* Attr */ oldAttr) {
+    var existingAttr = this._attributes.getNamedItem(oldAttr.name);
+
+    if (this._attributes && existingAttr === oldAttr) {
+      this._attributes.removeNamedItem(oldAttr.name);
+      return oldAttr;
+    }
+
+    throw new core.DOMException(NOT_FOUND_ERR);
+  }, //raises: function(DOMException) {},
+
+  /* returns NodeList */
+  getElementsByTagName: function(/* string */ name) {
+    name = name.toLowerCase();
+
+    function filterByTagName(child) {
+      child = (child.nodeType === ENTITY_REFERENCE_NODE) ?
+               child._entity                             :
+               child;
+
+      if (child.nodeName && child.nodeType === ELEMENT_NODE) {
+        return name === "*" || (child.nodeName.toLowerCase() === name);
+      }
+
+      return false;
+    }
+    return new core.NodeList(this._ownerDocument || this, core.mapper(this, filterByTagName, true));
+  },
+};
+core.Element.prototype.__proto__ = core.Node.prototype;
+
+core.DocumentFragment = function DocumentFragment(document) {
+  core.Node.call(this, document);
+  this._nodeName = this._tagName = "#document-fragment";
+};
+core.DocumentFragment.prototype = {
+  nodeType : DOCUMENT_FRAGMENT_NODE,
+  get nodeValue() { return null;},
+  set nodeValue(unused) { /* do nothing */ },
+  get attributes() { return null;}
+};
+core.DocumentFragment.prototype.__proto__ = core.Node.prototype;
+
+core.ProcessingInstruction = function ProcessingInstruction(document, target, data) {
+  this._ownerDocument = document;
+  core.Node.call(this, document);
+  this._nodeName = target;
+  this._tagName = target;
+  this._target = target;
+  this._nodeValue = data;
+}
+core.ProcessingInstruction.prototype = {
+  nodeType : PROCESSING_INSTRUCTION_NODE,
+  get target() { return this._target;},
+  set target(value) { throw new core.DOMException(1);},
+  get nodeValue() { return this._nodeValue;},
+  set nodeValue(value) { this._nodeValue = value},
+  get data()   { return this._nodeValue;},
+  set data(unused)   { throw new core.DOMException(NO_MODIFICATION_ALLOWED_ERR);},
+  get attributes() { return null;}
+
+};
+core.ProcessingInstruction.prototype.__proto__ = core.Node.prototype;
+
+core.Document = function Document(options) {
+  if (!options) {
+    options = {};
+  }
+  else if (typeof options == 'string') {
+    options = {
+      name: options
+    };
+  }
+  core.Node.call(this, "#document");
+  this._nodeName = this._tagName = "#document";
+  this._contentType = options.contentType || "text/xml";
+  this._doctype = options._doctype;
+  this._implementation = options.implementation || new (core.DOMImplementation)();
+  this._documentElement = null;
+  this._ids = Object.create(null);
+  this._attached = true;
+  this._ownerDocument = this;
+  this._readonly = false;
+};
+
+
+var tagRegEx = /[^\w:\d_\.-]+/i;
+var entRegEx = /[^\w\d_\-&;]+/;
+var invalidAttrRegEx = /[\s"'>/=\u0000-\u001A]/;
+
+core.Document.prototype = {
+  nodeType : DOCUMENT_NODE,
+  _elementBuilders : { },
+  _defaultElementBuilder: function(document, tagName) {
+    return new core.Element(document, tagName);
+  },
+  get contentType() { return this._contentType;},
+  get doctype() { return this._doctype || null;},
+  set doctype(doctype) { this._doctype = doctype;},
+  get documentElement() {
+    if (this._documentElement) {
+      return this._documentElement;
+    } else {
+      var children = this._childNodes, len = this._childNodes.length, i=0;
+      for (i;i<len;i++) {
+        if (children[i].nodeType === ELEMENT_NODE) {
+          this._documentElement = children[i];
+          return children[i];
+        }
+      }
+      return null;
+    }
+  },
+
+  get implementation() { return this._implementation;},
+  set implementation(implementation) { this._implementation = implementation;},
+  get nodeName() { return '#document'; },
+  get tagName() {
+    return null;
+  },
+  get nodeValue() { return null; },
+  set nodeValue(unused) { /* noop */ },
+  get attributes() { return null;},
+  get ownerDocument() { return null;},
+  get readonly() { return this._readonly;},
+
+  /* returns Element */
+  _createElementNoTagNameValidation: function(/*string*/ tagName) {
+    var lower = tagName.toLowerCase();
+    var element = (this._elementBuilders[lower] || this._defaultElementBuilder)(this, tagName);
+
+    // Check for and introduce default elements
+    if (this._doctype && this._doctype._attributes && this._doctype.name.toLowerCase() !== "html") {
+      var attrElement = this._doctype._attributes.getNamedItem(tagName);
+      if (attrElement && attrElement._childNodes) {
+
+        var attrs = attrElement.attributes;
+        var attr, len = attrs.length, defaultAttr;
+        for (var i = 0; i < len; i++) {
+          defaultAttr = attrs.item(i);
+          if (defaultAttr) {
+            attr = this.createAttribute(defaultAttr.name);
+            attr.value = defaultAttr.value;
+            element.setAttributeNode(attr);
+            attr._specified = false;
+          }
+        }
+      }
+    }
+
+    element._created = true;
+    return element;
+  },
+
+  /* returns Element */
+  createElement: function(/* string */ tagName) {
+    tagName = String(tagName);
+
+    var c = [];
+
+    if (tagName.length === 0 || (c = tagName.match(tagRegEx))) {
+      throw new core.DOMException(INVALID_CHARACTER_ERR, 'Invalid character in tag name: ' + c.pop());
+    }
+
+    return this._createElementNoTagNameValidation(tagName);
+  }, //raises: function(DOMException) {},
+
+  /* returns DocumentFragment */
+  createDocumentFragment: function() {
+    return new core.DocumentFragment(this);
+  },
+
+  /* returns Text */
+  createTextNode: function(/* string */ data) {
+    return new core.Text(this,data);
+  },
+
+  /* returns Comment */
+  createComment: function(/* string */ data) {
+    return new core.Comment(this,data);
+  },
+
+  /* returns CDATASection */
+  createCDATASection: function(/* string */ data) {
+    if (this._doctype && this._doctype.name === "html") {
+      throw new core.DOMException(NOT_SUPPORTED_ERR);
+    }
+
+    return new core.CDATASection(this,data);
+  }, // raises: function(DOMException) {},
+
+  /* returns ProcessingInstruction */
+  createProcessingInstruction: function(/* string */ target,/* string */ data) {
+
+    if (this._doctype && this._doctype.name === "html") {
+      throw new core.DOMException(NOT_SUPPORTED_ERR);
+    }
+
+    if (target.match(tagRegEx) || !target || !target.length) {
+      throw new core.DOMException(INVALID_CHARACTER_ERR);
+    }
+
+    return new core.ProcessingInstruction(this, target, data);
+  }, // raises: function(DOMException) {},
+
+  /* returns Attr */
+  createAttribute: function(/* string */ name) {
+    if (!name || !name.length || name.match(invalidAttrRegEx) ) {
+      throw new core.DOMException(INVALID_CHARACTER_ERR, "attribute name: " + name);
+    }
+    return new core.Attr(this, name,false);
+  }, // raises: function(DOMException) {},
+
+  /* returns EntityReference */
+  createEntityReference: function(/* string */ name) {
+
+    if (this._doctype && this._doctype.name === "html") {
+      throw new core.DOMException(NOT_SUPPORTED_ERR);
+    }
+
+    name = name.replace(/[&;]/g,"");
+    if (!name || !name.length) {
+      throw new core.DOMException(INVALID_CHARACTER_ERR);
+    }
+
+    if (name.match(tagRegEx)) {
+      throw new core.DOMException(INVALID_CHARACTER_ERR);
+    }
+
+    var entity;
+    if (this._doctype && this._doctype.entities) {
+      entity = this._doctype.entities.getNamedItem(name);
+    } else {
+      entity = null;
+    }
+
+    var ref    = new core.EntityReference(this, entity);
+
+    ref._entityName = name;
+
+    return ref;
+  }, //raises: function(DOMException) {},
+
+  /* returns Entity */
+  createEntityNode : function(/* string */ name)
+  {
+
+    if (name.match(entRegEx) || !name || !name.length) {
+      throw new core.DOMException(INVALID_CHARACTER_ERR);
+    }
+
+    var ret = new core.Entity(this, name);
+    ret._readonly = false;// TODO: fix me please.
+
+    for (var i=1;i<arguments.length;i++)
+    {
+      ret.appendChild(arguments[i]);
+    }
+
+    core.markTreeReadonly(ret);
+
+    return ret;
+  },
+
+  /* returns Notation */
+  createNotationNode : function(/* string */ name,/* string */ publicId,/* string */ systemId)
+  {
+
+    if (name.match(entRegEx) || !name || !name.length) {
+      throw new core.DOMException(INVALID_CHARACTER_ERR);
+    }
+
+    var ret = new core.Notation(this, name, publicId, systemId);
+    ret._readonly = false;// TODO: fix me please.
+
+    for (var i=3;i<arguments.length;i++)
+    {
+      ret.appendChild(arguments[i]);
+    }
+
+    core.markTreeReadonly(ret);
+
+    return ret;
+  },
+
+  appendChild : function(/* Node */ arg) {
+    if (this.documentElement && arg.nodeType == ELEMENT_NODE) {
+      throw new core.DOMException(HIERARCHY_REQUEST_ERR);
+    }
+    return core.Node.prototype.appendChild.call(this, arg);
+  },
+
+  removeChild : function(/* Node */ arg) {
+    var ret = core.Node.prototype.removeChild.call(this, arg);
+    if (arg == this._documentElement) {
+      this._documentElement = null;// force a recalculation
+    }
+    return ret;
+  },
+
+  /* returns NodeList */
+  getElementsByTagName: function(/* string */ name) {
+    function filterByTagName(child) {
+      if (child.nodeType && child.nodeType === ENTITY_REFERENCE_NODE)
+      {
+        child = child._entity;
+      }
+
+      if (child.nodeName && child.nodeType === ELEMENT_NODE)
+      {
+        if (name === "*") {
+          return true;
+
+        // case insensitivity for html
+        } else if (child._ownerDocument && child._ownerDocument._doctype &&
+                   //child._ownerDocument._doctype.name === "html" &&
+                   child.nodeName.toLowerCase() === name.toLowerCase())
+        {
+          return true;
+        } else if (child.nodeName.toLowerCase() === name.toLowerCase()) {
+          return true;
+        }
+      }
+      return false;
+    }
+    return new core.NodeList(this.documentElement || this, core.mapper(this, filterByTagName, true));
+  }
+};
+core.Document.prototype.__proto__ = core.Node.prototype;
+
+core.CharacterData = function CharacterData(document, value) {
+  core.Node.call(this, document);
+
+  this._nodeValue = value + "";
+};
+core.CharacterData.prototype = {
+
+  get data() { return this._nodeValue;},
+  set data(data) {
+
+    // readonly
+    if (this._readonly === true) {
+      throw new core.DOMException(NO_MODIFICATION_ALLOWED_ERR);
+    }
+
+    this._nodeValue = data;
+  },
+
+  /* returns int */
+  get length() { return this._nodeValue.length || 0;},
+
+  /* returns string */
+  substringData: function(/* int */ offset, /* int */ count) {
+
+    if (count < 0 || offset < 0 || offset > this._nodeValue.length) {
+      throw new core.DOMException(INDEX_SIZE_ERR);
+    }
+
+    return (this._nodeValue.length < offset + count) ?
+            this._nodeValue.substring(offset) :
+            this._nodeValue.substring(offset, offset+count);
+
+  }, // raises: function(DOMException) {},
+
+  /* returns string */
+  appendData: function(/* string */ arg) {
+
+    // readonly
+    if (this._readonly === true) {
+      throw new core.DOMException(NO_MODIFICATION_ALLOWED_ERR);
+    }
+
+    this._nodeValue+=arg;
+    return this._nodeValue;
+  }, // raises: function(DOMException) {},
+
+  /* returns string */
+  insertData: function(/* int */ offset, /* string */ arg) {
+
+    // readonly
+    if (this._readonly === true) {
+      throw new core.DOMException(NO_MODIFICATION_ALLOWED_ERR);
+    }
+
+    if (offset < 0 || offset > this._nodeValue.length) {
+      throw new core.DOMException(INDEX_SIZE_ERR);
+    }
+
+    var start = this._nodeValue.substring(0,offset);
+    var end = this._nodeValue.substring(offset);
+
+    this._nodeValue = start + arg + end;
+
+  }, //raises: function(DOMException) {},
+
+  /* returns void */
+  deleteData: function(/* int */ offset, /* int */ count) {
+
+    // readonly
+    if (this._readonly === true) {
+      throw new core.DOMException(NO_MODIFICATION_ALLOWED_ERR);
+    }
+
+    if (offset       < 0                     ||
+        offset       > this._nodeValue.length ||
+        count        < 0)
+    {
+      throw new core.DOMException(INDEX_SIZE_ERR);
+    }
+
+    var start = this._nodeValue.substring(0,offset);
+
+    this._nodeValue = (offset+count<this._nodeValue.length) ?
+                     start + this._nodeValue.substring(offset+count) :
+                     start;
+  }, // raises: function(DOMException) {},
+
+  /* returns void */
+  replaceData: function(/* int */ offset, /* int */ count, /* string */ arg) {
+
+    // readonly
+    if (this._readonly === true) {
+      throw new core.DOMException(NO_MODIFICATION_ALLOWED_ERR);
+    }
+
+    count = (offset+count > this._nodeValue.length) ?
+             this.nodeValue.length-offset           :
+             count;
+
+    if (offset       < 0                     ||
+        offset       > this._nodeValue.length ||
+        count        < 0                     /*||
+        offset+count > this._nodeValue.length*/)
+    {
+      throw new core.DOMException(INDEX_SIZE_ERR);
+    }
+
+    var start = this._nodeValue.substring(0,offset);
+    var end = this._nodeValue.substring(offset+count);
+
+    this._nodeValue = start + arg + end;
+  } // raises: function(DOMException) {},
+};
+core.CharacterData.prototype.__proto__ = core.Node.prototype;
+
+
+core.Attr = function Attr(document, name, value) {
+  core.Node.call(this, document);
+  this._nodeValue = value;
+  this._name = name;
+  this._specified = (value) ? true : false;
+  this._tagName   = name;
+  this._nodeName  = name;
+};
+core.Attr.prototype =  {
+  nodeType : ATTRIBUTE_NODE,
+  get nodeValue() {
+    var val = '';
+    for (var i=0,len=this._childNodes.length;i<len;i++) {
+      var child = this._childNodes[i];
+      if (child.nodeType === ENTITY_REFERENCE_NODE) {
+        val += Array.prototype.reduce.call(child.childNodes, function(prev, c) {
+          return prev += (c.nodeValue || c);
+        }, '');
+      } else {
+        val += child.nodeValue;
+      }
+    }
+    return val;
+  },
+  set nodeValue(value) {
+    // readonly
+    if (this._readonly) {
+      throw new core.DOMException(NO_MODIFICATION_ALLOWED_ERR);
+    }
+
+    this._childNodes._resetTo([this._ownerDocument.createTextNode(value)]);
+    this._modified();
+    this._specified = true;
+    var prev = this._nodeValue;
+    this._nodeValue = value;
+    if (this._ownerElement) {
+      this._ownerElement._attrModified(this._name, value, prev);
+    }
+  },
+  get name() { return this._name;},
+  get specified() { return this._specified },
+  get value() {
+    return this.nodeValue;
+  },
+  set value(value) {
+    this.nodeValue = value;
+  },
+  get parentNode() { return null;},
+  get attributes() { return null;},
+
+  insertBefore : function(/* Node */ newChild, /* Node*/ refChild){
+    if (newChild.nodeType === CDATA_SECTION_NODE ||
+        newChild.nodeType === ELEMENT_NODE)
+    {
+      throw new core.DOMException(HIERARCHY_REQUEST_ERR);
+    }
+
+    return core.Node.prototype.insertBefore.call(this, newChild, refChild);
+  },
+
+  appendChild : function(/* Node */ arg) {
+
+    if (arg.nodeType === CDATA_SECTION_NODE ||
+        arg.nodeType === ELEMENT_NODE)
+    {
+      throw new core.DOMException(HIERARCHY_REQUEST_ERR);
+    }
+
+    return core.Node.prototype.appendChild.call(this, arg);
+  }
+
+};
+core.Attr.prototype.__proto__ = core.Node.prototype;
+
+core.Text = function Text(document, text, readonly) {
+    core.CharacterData.call(this, document, text);
+    this._nodeName = "#text";
+    this._readonly = readonly ? true : false
+};
+core.Text.prototype = {
+  nodeType : TEXT_NODE,
+  get attributes() { return null;},
+
+  /* returns Text */
+  splitText: function(offset) {
+
+    // readonly
+    if (this._readonly) {
+      throw new core.DOMException(NO_MODIFICATION_ALLOWED_ERR);
+    }
+
+    if (offset < 0 || offset > this._nodeValue.length) {
+      throw new core.DOMException(INDEX_SIZE_ERR);
+    }
+
+    var newText = this._nodeValue.substring(offset);
+    this._nodeValue = this._nodeValue.substring(0, offset);
+    var newNode = this._ownerDocument.createTextNode(newText);
+
+    if(this._parentNode.lastChild === this) {
+      this._parentNode.appendChild(newNode);
+    } else {
+      this._parentNode.insertBefore(newNode, this.nextSibling);
+    }
+
+    return newNode;
+  }, //raises: function(DOMException) {},
+  toString: function() {
+    return this.nodeName;
+  }
+};
+core.Text.prototype.__proto__ = core.CharacterData.prototype
+
+
+core.Comment = function Comment(document, text) {
+  core.Text.call(this, document, text);
+  this._nodeName = "#comment";
+  this._tagName  = "#comment";
+};
+core.Comment.prototype = {
+  nodeType : COMMENT_NODE
+};
+core.Comment.prototype.__proto__ = core.Text.prototype
+
+
+core.CDATASection = function CDATASection(document, value) {
+  core.Text.call(this, document, value);
+  this._nodeName = "#cdata-section";
+};
+core.CDATASection.prototype = {
+  nodeType : CDATA_SECTION_NODE
+};
+core.CDATASection.prototype.__proto__ = core.Text.prototype
+
+core.DocumentType = function DocumentType(document, name, entities, notations, attributes) {
+  core.Node.call(this, document);
+  this._name = name;
+  this._tagName = name;
+  this._nodeName = name;
+  this._entities = entities || new core.EntityNodeMap(document);
+  this._notations = notations || new core.NotationNodeMap(document);
+
+  core.markTreeReadonly(this._notations);
+
+  this._attributes = attributes || new core.AttrNodeMap(document);
+};
+core.DocumentType.prototype = {
+  nodeType : DOCUMENT_TYPE_NODE,
+  get nodeValue() { return null;},
+  set nodeValue(unused) { /* do nothing */ },
+  get name() { return this._name;},
+  get entities() { return this._entities;},
+  get notations() { return this._notations;},
+  get attributes() { return null;}
+};
+core.DocumentType.prototype.__proto__ = core.Node.prototype;
+
+
+core.Notation = function Notation(document, name, publicId, systemId){
+  core.Node.call(this, document);
+  this._name = name;
+  this._nodeName = name;
+  this._publicId = publicId || null;
+  this._systemId = systemId || null;
+  this._nodeValue = null;
+};
+core.Notation.prototype = {
+  nodeType : NOTATION_NODE,
+  get publicId() { return this._publicId;},
+  get systemId() { return this._systemId;},
+  get name() { return this._name || this._nodeName;},
+  get attributes() { /* as per spec */ return null;},
+  set nodeValue(unused) { /* intentionally left blank */ },
+  get nodeValue() { return this._nodeValue;},
+};
+core.Notation.prototype.__proto__ = core.Node.prototype;
+
+
+core.Entity = function Entity(document, name) {
+  core.Node.call(this, document);
+  this._name = name;
+  this._nodeName = name;
+  this._tagName = name;
+  this._publicId = null;
+  this._systemId = null;
+  this._notationName = null;
+  this._readonly = true;
+};
+core.Entity.prototype = {
+  nodeType : ENTITY_NODE,
+  get nodeValue() { return null;},
+  set nodeValue(unused) {
+    // readonly
+    if (this._readonly === true) {
+      // TODO: is this needed?
+      // throw new DOMException(NO_MODIFICATION_ALLOWED_ERR);
+    }
+    /* do nothing */
+  },
+  get name() { return this._name },
+  get publicId() { return this._publicId;},
+  get systemId() { return this._systemId;},
+
+  set publicId(publicId) { this._publicId = publicId;},
+  set systemId(systemId) { this._systemId = systemId;},
+  set notationName(notationName) { this._notationName = notationName;},
+
+  get notationName() { return this._notationName;},
+  get attributes() { return null;},
+
+};
+core.Entity.prototype.__proto__ = core.Node.prototype;
+
+
+core.EntityReference = function EntityReference(document, entity) {
+  core.Node.call(this, document);
+  this._entity = entity;
+  this._nodeName = (entity) ? entity.name : null;
+  this._readonly = true;
+};
+core.EntityReference.prototype = {
+  nodeType : ENTITY_REFERENCE_NODE,
+  get nodeValue() { return (this._entity) ? this._entity.nodeValue : null;},
+  set nodeValue(unused) {
+    // readonly
+    if (this._readonly === true) {
+      // TODO: is this needed?
+      //throw new DOMException(NO_MODIFICATION_ALLOWED_ERR);
+    }
+
+    /* do nothing */
+  },
+  get attributes() { return null;},
+
+  // Proxy to the entity
+  get nodeName() { return this._entityName;},
+  get firstChild() { return this._entity.firstChild || null;},
+  get childNodes() { return this._entity.childNodes;},
+  get lastChild() { return this._entity.lastChild || null;},
+
+};
+core.EntityReference.prototype.__proto__ = core.Node.prototype;
+
+exports.dom = { "level1" : { "core" : core }};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level2/core.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level2/core.js
new file mode 100644
index 0000000..4fb5d1f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level2/core.js
@@ -0,0 +1,643 @@
+var core                     = require("../level1/core").dom.level1.core;
+
+// modify cloned instance for more info check: https://github.com/tmpvar/jsdom/issues/325
+core = Object.create(core);
+
+var INVALID_STATE_ERR        = core.INVALID_STATE_ERR        = 11,
+    SYNTAX_ERR               = core.SYNTAX_ERR               = 12,
+    INVALID_MODIFICATION_ERR = core.INVALID_MODIFICATION_ERR = 13,
+    NAMESPACE_ERR            = core.NAMESPACE_ERR            = 14,
+    INVALID_ACCESS_ERR       = core.INVALID_ACCESS_ERR       = 15,
+    ns = {
+      validate : function(ns, URI) {
+        if (!ns) {
+          throw new core.DOMException(core.INVALID_CHARACTER_ERR, "namespace is undefined");
+        }
+
+        if(ns.match(/[^0-9a-z\.:\-_]/i) !== null) {
+          throw new core.DOMException(core.INVALID_CHARACTER_ERR, ns);
+        }
+
+        var msg = false, parts = ns.split(':');
+        if (ns === 'xmlns'                          &&
+            URI !== "http://www.w3.org/2000/xmlns/")
+        {
+          msg = "localName is 'xmlns' but the namespaceURI is invalid";
+
+        } else if (ns === "xml"                                   &&
+                   URI !== "http://www.w3.org/XML/1998/namespace")
+        {
+          msg = "localName is 'xml' but the namespaceURI is invalid";
+
+        } else if (ns[ns.length-1] === ':') {
+          msg = "Namespace seperator found with no localName";
+
+        } else if (ns[0] === ':') {
+          msg = "Namespace seperator found, without a prefix";
+
+        } else if (parts.length > 2) {
+          msg = "Too many namespace seperators";
+
+        }
+
+        if (msg) {
+          throw new core.DOMException(NAMESPACE_ERR, msg + " (" + ns + "@" + URI + ")");
+        }
+      }
+    };
+
+core.exceptionMessages['NAMESPACE_ERR'] = "Invalid namespace";
+
+core.DOMImplementation.prototype.createDocumentType = function(/* String */ qualifiedName,
+                                                               /* String */ publicId,
+                                                               /* String */ systemId)
+{
+  ns.validate(qualifiedName);
+  var doctype = new core.DocumentType(null, qualifiedName);
+  doctype._publicId = publicId ? publicId : '';
+  doctype._systemId = systemId ? systemId : '';
+  return doctype;
+};
+
+/**
+  Creates an XML Document object of the specified type with its document element.
+  HTML-only DOM implementations do not need to implement this method.
+*/
+core.DOMImplementation.prototype.createDocument = function(/* String */       namespaceURI,
+                                                           /* String */       qualifiedName,
+                                                           /* DocumentType */ doctype)
+{
+  if (qualifiedName || namespaceURI) {
+    ns.validate(qualifiedName, namespaceURI);
+  }
+
+  if (doctype && doctype._ownerDocument !== null) {
+    throw new core.DOMException(core.WRONG_DOCUMENT_ERR);
+  }
+
+  if (qualifiedName && qualifiedName.indexOf(':') > -1 && !namespaceURI) {
+    throw new core.DOMException(NAMESPACE_ERR);
+  }
+
+  var document = new core.Document();
+
+  if (doctype) {
+    document.doctype = doctype;
+    doctype._ownerDocument = document;
+    document.appendChild(doctype);
+  } else {
+    document.doctype = null;
+  }
+
+  if (doctype && !doctype.entities) {
+    doctype.entities = new core.EntityNodeMap();
+  }
+
+  document._ownerDocument = document;
+
+  if (qualifiedName) {
+    var docElement = document.createElementNS(namespaceURI, qualifiedName);
+    document.appendChild(docElement);
+  }
+
+  return document;
+};
+
+core.Node.prototype.__defineGetter__("ownerDocument", function() {
+  return this._ownerDocument || null;
+});
+
+core.Node.prototype.isSupported = function(/* string */ feature,
+                                           /* string */ version)
+{
+  return this._ownerDocument.implementation.hasFeature(feature, version);
+};
+
+core.Node.prototype._namespaceURI = null;
+core.Node.prototype.__defineGetter__("namespaceURI", function() {
+  return this._namespaceURI || null;
+});
+
+core.Node.prototype.__defineSetter__("namespaceURI", function(value) {
+  this._namespaceURI = value;
+});
+
+core.Node.prototype.__defineGetter__("prefix", function() {
+  return this._prefix || null;
+});
+
+core.Node.prototype.__defineSetter__("prefix", function(value) {
+
+  if (this.readonly) {
+    throw new core.DOMException(core.NO_MODIFICATION_ALLOWED_ERR);
+  }
+
+  ns.validate(value, this._namespaceURI);
+
+  if ((this._created && !this._namespaceURI)  ||
+      this._prefix === "xmlns"                ||
+      (!this._prefix && this._created))
+  {
+    throw new core.DOMException(core.NAMESPACE_ERR);
+  }
+
+  if (this._localName) {
+    this._nodeName = value + ':' + this._localName;
+  }
+
+  this._prefix = value;
+});
+
+core.Node.prototype.__defineGetter__("localName", function() {
+  return this._localName || null;
+});
+
+/* return boolean */
+core.Node.prototype.hasAttributes = function() {
+  return (this.nodeType === this.ELEMENT_NODE &&
+          this._attributes                    &&
+          this._attributes.length > 0);
+};
+
+core.NamedNodeMap.prototype.getNamedItemNS = function(/* string */ namespaceURI,
+                                                      /* string */ localName)
+{
+  if (this._nsStore[namespaceURI] && this._nsStore[namespaceURI][localName]) {
+    return this._nsStore[namespaceURI][localName];
+  }
+  return null;
+};
+
+core.AttrNodeMap.prototype.setNamedItemNS = function(/* Node */ arg) {
+  if (arg.nodeType !== this._ownerDocument.ATTRIBUTE_NODE) {
+    throw new core.DOMException(core.HIERARCHY_REQUEST_ERR);
+  }
+
+  return core.NamedNodeMap.prototype.setNamedItemNS.call(this, arg);
+};
+
+var prevSetNamedItem = core.AttrNodeMap.prototype.setNamedItem;
+
+core.AttrNodeMap.prototype.setNamedItem = function(/* Node */ arg) {
+  if (arg.nodeType !== this._ownerDocument.ATTRIBUTE_NODE) {
+    throw new core.DOMException(core.HIERARCHY_REQUEST_ERR);
+  }
+
+  return prevSetNamedItem.call(this, arg);
+};
+
+
+core.NamedNodeMap.prototype.setNamedItemNS = function(/* Node */ arg)
+{
+  if (this._readonly) {
+    throw new core.DOMException(core.NO_MODIFICATION_ALLOWED_ERR);
+  }
+
+  var owner = this._ownerDocument;
+  if (this._parentNode &&
+      this._parentNode._parentNode &&
+      this._parentNode._parentNode.nodeType === owner.ENTITY_NODE)
+  {
+    throw new core.DOMException(core.NO_MODIFICATION_ALLOWED_ERR);
+  }
+
+  if (this._ownerDocument !== arg.ownerDocument) {
+    throw new core.DOMException(core.WRONG_DOCUMENT_ERR);
+  }
+
+  if (arg._ownerElement) {
+    throw new core.DOMException(core.INUSE_ATTRIBUTE_ERR);
+  }
+
+  // readonly
+  if (this._readonly === true) {
+    throw new core.DOMException(core.NO_MODIFICATION_ALLOWED_ERR);
+  }
+
+
+  if (!this._nsStore[arg.namespaceURI]) {
+    this._nsStore[arg.namespaceURI] = {};
+  }
+  var existing = null;
+  if (this._nsStore[arg.namespaceURI][arg.localName]) {
+    var existing = this._nsStore[arg.namespaceURI][arg.localName];
+  }
+
+  this._nsStore[arg.namespaceURI][arg.localName] = arg;
+
+  arg._specified = true;
+  arg._ownerDocument = this._ownerDocument;
+
+  return this.setNamedItem(arg);
+};
+
+core.NamedNodeMap.prototype.removeNamedItemNS = function(/*string */ namespaceURI,
+                                                         /* string */ localName)
+{
+
+  if (this.readonly) {
+    throw new core.DOMException(core.NO_MODIFICATION_ALLOWED_ERR);
+  }
+
+
+  var parent = this._parentNode,
+      found = null,
+      defaults,
+      clone,
+      defaultEl,
+      defaultAttr;
+
+  if (this._parentNode &&
+      this._parentNode._parentNode &&
+      this._parentNode._parentNode.nodeType === this._ownerDocument.ENTITY_NODE)
+  {
+    throw new core.DOMException(core.NO_MODIFICATION_ALLOWED_ERR);
+  }
+
+  if (this._nsStore[namespaceURI] &&
+      this._nsStore[namespaceURI][localName])
+  {
+    found = this._nsStore[namespaceURI][localName];
+    this.removeNamedItem(found.qualifiedName);
+    delete this._nsStore[namespaceURI][localName];
+  }
+
+  if (!found) {
+    throw new core.DOMException(core.NOT_FOUND_ERR);
+  }
+
+  if (parent.ownerDocument.doctype && parent.ownerDocument.doctype._attributes) {
+    defaults = parent.ownerDocument.doctype._attributes;
+    defaultEl = defaults.getNamedItemNS(parent._namespaceURI, parent._localName);
+  }
+
+  if (defaultEl) {
+    defaultAttr = defaultEl._attributes.getNamedItemNS(namespaceURI, localName);
+
+    if (defaultAttr) {
+      clone = defaultAttr.cloneNode(true);
+      clone._created               = false;
+      clone._namespaceURI          = found._namespaceURI;
+      clone._nodeName              = found.name;
+      clone._localName             = found._localName;
+      clone._prefix                = found._prefix
+      this.setNamedItemNS(clone);
+      clone._created               = true;
+      clone._specified             = false;
+    }
+  }
+
+  return found;
+};
+
+core.Attr.prototype.__defineGetter__("ownerElement", function() {
+  return this._ownerElement || null;
+});
+
+
+core.Node.prototype._prefix = false;
+
+core.Node.prototype.__defineSetter__("qualifiedName", function(qualifiedName) {
+  ns.validate(qualifiedName, this._namespaceURI);
+  qualifiedName       = qualifiedName || "";
+  this._localName     = qualifiedName.split(":")[1] || null;
+  this.prefix         = qualifiedName.split(":")[0] || null;
+  this._nodeName = qualifiedName;
+});
+
+core.Node.prototype.__defineGetter__("qualifiedName", function() {
+  return this._nodeName;
+});
+
+core.NamedNodeMap.prototype._map = function(fn) {
+  var ret = [], l = this.length, i = 0, node;
+  for(i; i<l; i++) {
+    node = this.item(i);
+    if (fn && fn(node)) {
+      ret.push(node);
+    }
+  }
+  return ret;
+};
+
+core.Element.prototype.getAttributeNS = function(/* string */ namespaceURI,
+                                                 /* string */ localName)
+{
+  var attr =  this._attributes.getNamedItemNS(namespaceURI, localName);
+  return attr && attr.nodeValue;
+};
+
+core.Element.prototype.setAttributeNS = function(/* string */ namespaceURI,
+                                                 /* string */ qualifiedName,
+                                                 /* string */ value)
+{
+  var s       = qualifiedName.split(':'),
+      local   = s.pop(),
+      prefix  = s.pop() || null,
+      attr;
+
+  ns.validate(qualifiedName, namespaceURI);
+
+  if (qualifiedName.split(':').shift() === "xml" &&
+      namespaceURI !== "http://www.w3.org/XML/1998/namespace")
+  {
+    throw new core.DOMException(core.NAMESPACE_ERR);
+  }
+
+  if (prefix === "xmlns" && namespaceURI !== "http://www.w3.org/2000/xmlns/") {
+    throw new core.DOMException(core.NAMESPACE_ERR);
+  }
+
+  if (qualifiedName.split(':').length > 1 && !namespaceURI) {
+    throw new core.DOMException(core.NAMESPACE_ERR);
+  }
+
+  attr = this._attributes.getNamedItemNS(namespaceURI, local);
+
+  if (!attr) {
+    attr = this.ownerDocument.createAttributeNS(namespaceURI,
+                                                qualifiedName,
+                                                value);
+    this._attributes.setNamedItemNS(attr);
+  }
+
+  attr._namespaceURI = namespaceURI;
+  attr._prefix    = prefix;
+  attr._created = true;
+  attr.value = value;
+  attr._localName = local;
+};
+
+core.Element.prototype.removeAttributeNS = function(/* string */ namespaceURI,
+                                                    /* string */ localName)
+{
+
+  if (this.readonly) {
+    throw new core.DOMException(core.NO_MODIFICATION_ALLOWED_ERR);
+  }
+
+  var ownerDoc = this.ownerDocument,
+      defaults,
+      clone,
+      defaultEl,
+      defaultAttr,
+      clone,
+      localName;
+
+  if (ownerDoc.doctype && ownerDoc.doctype._attributes) {
+    defaults = ownerDoc.doctype._attributes;
+    defaultEl = defaults.getNamedItemNS(namespaceURI, this.localName);
+  }
+
+  if (defaultEl) {
+    defaultAttr = defaultEl.getAttributeNodeNS(namespaceURI, localName);
+  }
+
+  this._attributes.removeNamedItemNS(namespaceURI, localName);
+
+  if (defaultAttr) {
+    this.setAttributeNS(defaultAttr.namespaceURI,
+                                defaultAttr.name,
+                                defaultAttr.value);
+    localName = defaultAttr.name.split(':').pop();
+    clone = this.getAttributeNS(defaultAttr.namespaceURI, localName);
+    clone._specified = false;
+  }
+};
+
+core.Element.prototype.getAttributeNodeNS = function(/* string */ namespaceURI,
+                                                     /* string */ localName)
+{
+  return this._attributes.getNamedItemNS(namespaceURI, localName);
+};
+core.Element.prototype._created = false;
+
+core.Element.prototype.setAttributeNodeNS = function(/* Attr */ newAttr)
+{
+  if (newAttr.ownerElement) {
+    throw new core.DOMException(core.INUSE_ATTRIBUTE_ERR);
+  }
+
+  var existing = null;
+  try {
+    existing = this._attributes.removeNamedItemNS(newAttr.namespaceURI,
+                                                  newAttr.localName);
+  } catch (e) { /* noop */}
+
+  return this._attributes.setNamedItemNS(newAttr) || existing;
+};
+
+core.Element.prototype.getElementsByTagNameNS = function(/* String */ namespaceURI,
+                                                         /* String */ localName)
+{
+  var nsPrefixCache = {};
+
+  function filterByTagName(child) {
+    if (child.nodeType && child.nodeType === this.ENTITY_REFERENCE_NODE) {
+      child = child._entity;
+    }
+
+    var localMatch = child.localName === localName,
+        nsMatch    = child.namespaceURI === namespaceURI;
+
+    if ((localMatch || localName === "*") &&
+        (nsMatch || namespaceURI === "*"))
+    {
+      if (child.nodeType === child.ELEMENT_NODE) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  return new core.NodeList(this.ownerDocument || this,
+                           core.mapper(this, filterByTagName));
+};
+
+core.Element.prototype.hasAttribute = function(/* string */name)
+{
+  if (!this._attributes) {
+    return false;
+  }
+  return this._attributes.exists(name);
+};
+
+core.Element.prototype.hasAttributeNS = function(/* string */namespaceURI,
+                                                 /* string */localName)
+{
+  if (this._attributes.getNamedItemNS(namespaceURI, localName)) {
+    return true;
+  } else if (this.hasAttribute(localName)) {
+    return true;
+  }
+  return false;
+};
+
+core.DocumentType.prototype.__defineGetter__("publicId", function() {
+  return this._publicId || "";
+});
+
+core.DocumentType.prototype.__defineGetter__("systemId", function() {
+  return this._systemId || "";
+});
+
+core.DocumentType.prototype.__defineGetter__("internalSubset", function() {
+  return this._internalSubset || null;
+});
+
+core.Document.prototype.importNode = function(/* Node */ importedNode,
+                                              /* bool */ deep)
+{
+  if (importedNode && importedNode.nodeType) {
+    if (importedNode.nodeType === this.DOCUMENT_NODE ||
+        importedNode.nodeType === this.DOCUMENT_TYPE_NODE) {
+      throw new core.DOMException(core.NOT_SUPPORTED_ERR);
+    }
+  }
+
+  var self = this,
+      newNode = importedNode.cloneNode(deep, function(a, b) {
+        b._namespaceURI  = a._namespaceURI;
+        b._nodeName      = a._nodeName;
+        b._localName     = a._localName;
+      }),
+      defaults = false,
+      defaultEl;
+
+  if (this.doctype && this.doctype._attributes) {
+    defaults = this.doctype._attributes;
+  }
+
+  function lastChance(el) {
+    var attr, defaultEl;
+
+    el._ownerDocument = self;
+    if (el.id) {
+      if (!self._ids) {self._ids = {};}
+      if (!self._ids[el.id]) {self._ids[el.id] = [];}
+      self._ids[el.id].push(el);
+    }
+    if (el._attributes) {
+      el._attributes._ownerDocument = self;
+      for (var i=0,len=el._attributes.length; i < len; i++) {
+        attr = el._attributes.item(i);
+        attr._ownerDocument = self;
+        attr._specified = true;
+      }
+    }
+    if (defaults) {
+
+      defaultEl = defaults.getNamedItemNS(el._namespaceURI,
+                                          el._localName);
+
+      // TODO: This could use some love
+      if (defaultEl) {
+        defaultEl._attributes._map(function(defaultAttr) {
+          if (!el.hasAttributeNS(defaultAttr.namespaceURL,
+                                 defaultAttr.localName))
+          {
+            var clone = defaultAttr.cloneNode(true);
+            clone._namespaceURI = defaultAttr._namespaceURI;
+            clone._prefix       = defaultAttr._prefix;
+            clone._localName    = defaultAttr._localName;
+            el.setAttributeNodeNS(clone);
+            clone._specified = false;
+          }
+        });
+      }
+    }
+
+  }
+
+  if (deep) {
+    core.visitTree(newNode, lastChance);
+  }
+  else {
+    lastChance(newNode);
+  }
+
+  if (newNode.nodeType == newNode.ATTRIBUTE_NODE) {
+    newNode._specified = true;
+  }
+
+  return newNode;
+};
+
+core.Document.prototype.createElementNS = function(/* string */ namespaceURI,
+                                                   /* string */ qualifiedName)
+{
+  var parts   = qualifiedName.split(':'),
+      element, prefix;
+
+  if (parts.length > 1 && !namespaceURI) {
+    throw new core.DOMException(core.NAMESPACE_ERR);
+  }
+
+  ns.validate(qualifiedName, namespaceURI);
+  element = this.createElement(qualifiedName),
+
+  element._created = false;
+
+  element._namespaceURI = namespaceURI;
+  element._nodeName = qualifiedName;
+  element._localName = parts.pop();
+
+  if (parts.length > 0) {
+    prefix = parts.pop();
+    element.prefix = prefix;
+  }
+
+  element._created = true;
+  return element;
+};
+
+core.Document.prototype.createAttributeNS = function(/* string */ namespaceURI,
+                                                     /* string */ qualifiedName)
+{
+  var attribute, parts = qualifiedName.split(':');
+
+  if (parts.length > 1 && !namespaceURI) {
+    throw new core.DOMException(core.NAMESPACE_ERR,
+                                "Prefix specified without namespaceURI (" + qualifiedName + ")");
+  }
+
+
+  ns.validate(qualifiedName, namespaceURI);
+
+  attribute = this.createAttribute(qualifiedName);
+  attribute.namespaceURI = namespaceURI;
+  attribute.qualifiedName = qualifiedName;
+
+  attribute._localName = parts.pop();
+  attribute._prefix = (parts.length > 0) ? parts.pop() : null;
+  return attribute;
+};
+
+core.Document.prototype.getElementsByTagNameNS = function(/* String */ namespaceURI,
+                                                          /* String */ localName)
+{
+  return core.Element.prototype.getElementsByTagNameNS.call(this,
+                                                            namespaceURI,
+                                                            localName);
+};
+
+core.Element.prototype.__defineSetter__("id", function(id) {
+  this.setAttribute("id", id);
+});
+
+core.Element.prototype.__defineGetter__("id",function() {
+  return this.getAttribute("id");
+});
+
+core.Document.prototype.getElementById = function(id) {
+  // return the first element
+  return (this._ids && this._ids[id] && this._ids[id].length > 0 ? this._ids[id][0] : null);
+};
+
+
+exports.dom =
+{
+  level2 : {
+    core : core
+  }
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level2/events.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level2/events.js
new file mode 100644
index 0000000..546a9be
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level2/events.js
@@ -0,0 +1,411 @@
+/* DOM Level2 Events implemented as described here:
+ *
+ * http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html
+ *
+ */
+var core = require("./core").dom.level2.core,
+    utils = require("../utils");
+
+// modify cloned instance for more info check: https://github.com/tmpvar/jsdom/issues/325
+core = Object.create(core);
+
+var events = {};
+
+events.EventException = function() {
+    if (arguments.length > 0) {
+        this._code = arguments[0];
+    } else {
+        this._code = 0;
+    }
+    if (arguments.length > 1) {
+        this._message = arguments[1];
+    } else {
+        this._message = "Unspecified event type";
+    }
+    Error.call(this, this._message);
+    if (Error.captureStackTrace) {
+        Error.captureStackTrace(this, events.EventException);
+    }
+};
+events.EventException.prototype = {
+  UNSPECIFIED_EVENT_TYPE_ERR : 0,
+  get code() { return this._code;}
+};
+events.EventException.prototype.__proto__ = Error.prototype;
+
+events.Event = function(eventType) {
+    this._eventType = eventType;
+    this._type = null;
+    this._bubbles = null;
+    this._cancelable = null;
+    this._target = null;
+    this._currentTarget = null;
+    this._eventPhase = null;
+    this._timeStamp = null;
+    this._preventDefault = false;
+    this._stopPropagation = false;
+};
+events.Event.prototype = {
+    initEvent: function(type, bubbles, cancelable) {
+        this._type = type;
+        this._bubbles = bubbles;
+        this._cancelable = cancelable;
+    },
+    preventDefault: function() {
+        if (this._cancelable) {
+            this._preventDefault = true;
+        }
+    },
+    stopPropagation: function() {
+        this._stopPropagation = true;
+    },
+    CAPTURING_PHASE : 1,
+    AT_TARGET       : 2,
+    BUBBLING_PHASE  : 3,
+    get eventType() { return this._eventType; },
+    get type() { return this._type; },
+    get bubbles() { return this._bubbles; },
+    get cancelable() { return this._cancelable; },
+    get target() { return this._target; },
+    get currentTarget() { return this._currentTarget; },
+    get eventPhase() { return this._eventPhase; },
+    get timeStamp() { return this._timeStamp; }
+};
+
+
+events.UIEvent = function(eventType) {
+    events.Event.call(this, eventType);
+    this.view = null;
+    this.detail = null;
+};
+events.UIEvent.prototype = {
+    initUIEvent: function(type, bubbles, cancelable, view, detail) {
+        this.initEvent(type, bubbles, cancelable);
+        this.view = view;
+        this.detail = detail;
+    },
+};
+events.UIEvent.prototype.__proto__ = events.Event.prototype;
+
+
+events.MouseEvent = function(eventType) {
+    events.UIEvent.call(this, eventType);
+    this.screenX = null;
+    this.screenY = null;
+    this.clientX = null;
+    this.clientY = null;
+    this.ctrlKey = null;
+    this.shiftKey = null;
+    this.altKey = null;
+    this.metaKey = null;
+    this.button = null;
+    this.relatedTarget = null;
+};
+events.MouseEvent.prototype = {
+    initMouseEvent:   function(type,
+                               bubbles,
+                               cancelable,
+                               view,
+                               detail,
+                               screenX,
+                               screenY,
+                               clientX,
+                               clientY,
+                               ctrlKey,
+                               altKey,
+                               shiftKey,
+                               metaKey,
+                               button,
+                               relatedTarget) {
+        this.initUIEvent(type, bubbles, cancelable, view, detail);
+        this.screenX  = screenX
+        this.screenY  = screenY
+        this.clientX  = clientX
+        this.clientY  = clientY
+        this.ctrlKey  = ctrlKey
+        this.shiftKey  = shiftKey
+        this.altKey  = altKey
+        this.metaKey  = metaKey
+        this.button  = button
+        this.relatedTarget  = relatedTarget
+    }
+};
+events.MouseEvent.prototype.__proto__ = events.UIEvent.prototype;
+
+
+events.MutationEvent = function(eventType) {
+    events.Event.call(this, eventType);
+    this.relatedNode = null;
+    this.prevValue = null;
+    this.newValue = null;
+    this.attrName = null;
+    this.attrChange = null;
+};
+events.MutationEvent.prototype = {
+    initMutationEvent:   function(type,
+                                  bubbles,
+                                  cancelable,
+                                  relatedNode,
+                                  prevValue,
+                                  newValue,
+                                  attrName,
+                                  attrChange) {
+        this.initEvent(type, bubbles, cancelable);
+        this.relatedNode = relatedNode;
+        this.prevValue = prevValue;
+        this.newValue = newValue;
+        this.attrName = attrName;
+        this.attrChange = attrChange;
+    },
+    MODIFICATION : 1,
+    ADDITION     : 2,
+    REMOVAL      : 3
+};
+events.MutationEvent.prototype.__proto__ = events.Event.prototype;
+
+events.EventTarget = function() {};
+
+events.EventTarget.getListeners = function getListeners(target, type, capturing) {
+    var listeners = target._listeners
+            && target._listeners[type]
+            && target._listeners[type][capturing] || [];
+    if (!capturing) {
+        var traditionalHandler = target['on' + type];
+        if (traditionalHandler) {
+            var implementation = (target._ownerDocument ? target._ownerDocument.implementation
+                                                        : target.document.implementation);
+
+            if (implementation.hasFeature('ProcessExternalResources', 'script')) {
+                listeners.push(traditionalHandler);
+            }
+        }
+    }
+    return listeners;
+};
+
+events.EventTarget.dispatch = function dispatch(event, iterator, capturing) {
+    var listeners,
+        currentListener,
+        target = iterator();
+
+    while (target && !event._stopPropagation) {
+        listeners = events.EventTarget.getListeners(target, event._type, capturing);
+        currentListener = listeners.length;
+        while (currentListener--) {
+            event._currentTarget = target;
+            try {
+              listeners[currentListener].call(target, event);
+            } catch (e) {
+              target.raise(
+                'error', "Dispatching event '" + event._type + "' failed",
+                {error: e, event: event}
+              );
+            }
+        }
+        target = iterator();
+    }
+    return !event._stopPropagation;
+};
+
+events.EventTarget.forwardIterator = function forwardIterator(list) {
+  var i = 0, len = list.length;
+  return function iterator() { return i < len ? list[i++] : null };
+};
+
+events.EventTarget.backwardIterator = function backwardIterator(list) {
+  var i = list.length;
+  return function iterator() { return i >=0 ? list[--i] : null };
+};
+
+events.EventTarget.singleIterator = function singleIterator(obj) {
+  var i = 1;
+  return function iterator() { return i-- ? obj : null };
+};
+
+events.EventTarget.prototype = {
+    addEventListener: function(type, listener, capturing) {
+        this._listeners = this._listeners || {};
+        var listeners = this._listeners[type] || {};
+        capturing = (capturing === true);
+        var capturingListeners = listeners[capturing] || [];
+        for (var i=0; i < capturingListeners.length; i++) {
+            if (capturingListeners[i] === listener) {
+                return;
+            }
+        }
+        capturingListeners.push(listener);
+        listeners[capturing] = capturingListeners;
+        this._listeners[type] = listeners;
+    },
+
+    removeEventListener: function(type, listener, capturing) {
+        var listeners  = this._listeners && this._listeners[type];
+        if (!listeners) return;
+        var capturingListeners = listeners[(capturing === true)];
+        if (!capturingListeners) return;
+        for (var i=0; i < capturingListeners.length; i++) {
+            if (capturingListeners[i] === listener) {
+                capturingListeners.splice(i, 1);
+                return;
+            }
+        }
+    },
+
+    dispatchEvent: function(event) {
+        if (event == null) {
+            throw new events.EventException(0, "Null event");
+        }
+        if (event._type == null || event._type == "") {
+            throw new events.EventException(0, "Uninitialized event");
+        }
+
+        var targetList = [];
+
+        event._target = this;
+
+        //per the spec we gather the list of targets first to ensure
+        //against dom modifications during actual event dispatch
+        var target = this,
+            targetParent = target._parentNode;
+        while (targetParent) {
+            targetList.push(targetParent);
+            target = targetParent;
+            targetParent = target._parentNode;
+        }
+        targetParent = target._parentWindow;
+        if (targetParent) {
+            targetList.push(targetParent);
+        }
+
+        var iterator = events.EventTarget.backwardIterator(targetList);
+
+        event._eventPhase = event.CAPTURING_PHASE;
+        if (!events.EventTarget.dispatch(event, iterator, true)) return event._preventDefault;
+
+        iterator = events.EventTarget.singleIterator(event._target);
+        event._eventPhase = event.AT_TARGET;
+        if (!events.EventTarget.dispatch(event, iterator, false)) return event._preventDefault;
+
+        if (event._bubbles && !event._stopPropagation) {
+            var i = 0;
+            iterator = events.EventTarget.forwardIterator(targetList);
+            event._eventPhase = event.BUBBLING_PHASE;
+            events.EventTarget.dispatch(event, iterator, false);
+        }
+
+        return event._preventDefault;
+    }
+
+};
+
+
+core.Node.prototype.__proto__ = events.EventTarget.prototype;
+
+function getDocument(el) {
+  return el.nodeType == core.Node.DOCUMENT_NODE ? el : el._ownerDocument;
+}
+
+function mutationEventsEnabled(el) {
+  return el.nodeType != core.Node.ATTRIBUTE_NODE &&
+         getDocument(el).implementation.hasFeature('MutationEvents');
+}
+
+utils.intercept(core.Node, 'insertBefore', function(_super, args, newChild, refChild) {
+  var ret = _super.apply(this, args);
+  if (mutationEventsEnabled(this)) {
+    var doc = getDocument(this),
+        ev = doc.createEvent("MutationEvents");
+
+    ev.initMutationEvent("DOMNodeInserted", true, false, this, null, null, null, null);
+    newChild.dispatchEvent(ev);
+    if (this.nodeType == core.Node.DOCUMENT_NODE || this._attachedToDocument) {
+      ev = doc.createEvent("MutationEvents");
+      ev.initMutationEvent("DOMNodeInsertedIntoDocument", false, false, null, null, null, null, null);
+      core.visitTree(newChild, function(el) {
+        if (el.nodeType == core.Node.ELEMENT_NODE) {
+          el.dispatchEvent(ev);
+          el._attachedToDocument = true;
+        }
+      });
+    }
+  }
+  return ret;
+});
+
+utils.intercept(core.Node, 'removeChild', function (_super, args, oldChild) {
+  if (mutationEventsEnabled(this)) {
+    var doc = getDocument(this),
+        ev = doc.createEvent("MutationEvents");
+
+    ev.initMutationEvent("DOMNodeRemoved", true, false, this, null, null, null, null);
+    oldChild.dispatchEvent(ev);
+
+    ev = doc.createEvent("MutationEvents");
+    ev.initMutationEvent("DOMNodeRemovedFromDocument", false, false, null, null, null, null, null);
+    core.visitTree(oldChild, function(el) {
+      if (el.nodeType == core.Node.ELEMENT_NODE) {
+        el.dispatchEvent(ev);
+        el._attachedToDocument = false;
+      }
+    });
+  }
+  return _super.apply(this, args);
+});
+
+function dispatchAttrEvent(change) {
+  return function(_super, args, node) {
+    var target = this._parentNode,
+        prev = _super.apply(this, args);
+
+    if (mutationEventsEnabled(target)) {
+      var doc = target._ownerDocument,
+          attrChange = events.MutationEvent.prototype[change],
+          attrName = prev && prev.name || node.name,
+          prevVal = prev && prev.value || null,
+          newVal = change == 'ADDITION' ? node.value : null,
+          ev;
+
+      if (!newVal || newVal != prevVal) {
+        ev = doc.createEvent("MutationEvents");
+        ev.initMutationEvent("DOMAttrModified", true, false, target, prevVal, newVal, attrName, attrChange);
+        target.dispatchEvent(ev);
+      }
+    }
+    return prev;
+  }
+}
+
+utils.intercept(core.AttrNodeMap, 'removeNamedItem', dispatchAttrEvent('REMOVAL'));
+utils.intercept(core.AttrNodeMap, 'setNamedItem', dispatchAttrEvent('ADDITION'));
+
+core.CharacterData.prototype.__defineGetter__("_nodeValue", function() {
+  return this.__nodeValue;
+});
+core.CharacterData.prototype.__defineSetter__("_nodeValue", function(value) {
+  var oldValue = this.__nodeValue;
+  this.__nodeValue = value;
+  if (this._ownerDocument && this._parentNode && mutationEventsEnabled(this)) {
+    var ev = this._ownerDocument.createEvent("MutationEvents")
+    ev.initMutationEvent("DOMCharacterDataModified", true, false, this, oldValue, value, null, null);
+    this.dispatchEvent(ev);
+  }
+});
+
+core.Document.prototype.createEvent = function(eventType) {
+    switch (eventType) {
+        case "MutationEvents": return new events.MutationEvent(eventType);
+        case "UIEvents": return new events.UIEvent(eventType);
+        case "MouseEvents": return new events.MouseEvent(eventType);
+        case "HTMLEvents": return new events.Event(eventType);
+    }
+    return new events.Event(eventType);
+};
+
+exports.dom =
+{
+  level2 : {
+    core   : core,
+    events : events
+  }
+};
+
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level2/html.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level2/html.js
new file mode 100644
index 0000000..34a1cba
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level2/html.js
@@ -0,0 +1,1966 @@
+var core                  = require("./core").dom.level2.core,
+    events                = require("./core").dom.level2.events,
+    applyDocumentFeatures = require('../browser/documentfeatures').applyDocumentFeatures,
+    URL                   = require("url"),
+    Path                  = require('path'),
+    fs                    = require("fs"),
+    http                  = require('http'),
+    https                 = require('https');
+
+// modify cloned instance for more info check: https://github.com/tmpvar/jsdom/issues/325
+core = Object.create(core);
+
+// Setup the javascript language processor
+core.languageProcessors = {
+  javascript : require("./languages/javascript").javascript
+};
+
+// TODO its own package? Pull request to Node?
+function resolveHref(baseUrl, href) {
+  // When switching protocols, the path doesn't get canonicalized (i.e. .s and ..s are still left):
+  // https://github.com/joyent/node/issues/5453
+  var intermediate = URL.resolve(baseUrl, href);
+
+  // This canonicalizes the path, at the cost of overwriting the hash.
+  var nextStep = URL.resolve(intermediate, '#');
+
+  // So, insert the hash back in, if there was one.
+  var parsed = URL.parse(intermediate);
+  var fixed = nextStep.slice(0, -1) + (parsed.hash || '');
+
+  // Finally, fix file:/// URLs on Windows, where Node removes their drive letters:
+  // https://github.com/joyent/node/issues/5452
+  if (/^file\:\/\/\/[a-z]\:\//i.test(baseUrl) && /^file\:\/\/\//.test(fixed) && !/^file\:\/\/\/[a-z]\:\//i.test(fixed)) {
+    fixed = fixed.replace(/^file\:\/\/\//, baseUrl.substring(0, 11));
+  }
+
+  return fixed;
+}
+
+core.resourceLoader = {
+  load: function(element, href, callback) {
+    var ownerImplementation = element._ownerDocument.implementation;
+
+    if (ownerImplementation.hasFeature('FetchExternalResources', element.tagName.toLowerCase())) {
+      var full = this.resolve(element._ownerDocument, href);
+      var url = URL.parse(full);
+      if (ownerImplementation.hasFeature('SkipExternalResources', full)) {
+        return false;
+      }
+      if (url.hostname) {
+        this.download(url, element._ownerDocument._cookie, element._ownerDocument._cookieDomain, this.baseUrl(element._ownerDocument), this.enqueue(element, callback, full));
+      }
+      else {
+        this.readFile(url.pathname, this.enqueue(element, callback, full));
+      }
+    }
+  },
+  enqueue: function(element, callback, filename) {
+    var loader = this,
+        doc    = element.nodeType === core.Node.DOCUMENT_NODE ?
+                 element                :
+                 element._ownerDocument;
+
+    if (!doc._queue) {
+      return function() {};
+    }
+
+    return doc._queue.push(function(err, data) {
+      var ev = doc.createEvent('HTMLEvents');
+
+      if (!err) {
+        try {
+          callback.call(element, data, filename || doc.URL);
+          ev.initEvent('load', false, false);
+        }
+        catch(e) {
+          err = e;
+        }
+      }
+
+      if (err) {
+        ev.initEvent('error', false, false);
+        ev.error = err;
+      }
+
+      element.dispatchEvent(ev);
+    });
+  },
+
+  baseUrl: function(document) {
+    var baseElements = document.getElementsByTagName('base');
+    var baseUrl = document.URL;
+
+    if (baseElements.length > 0) {
+      var baseHref = baseElements.item(0).href;
+      if (baseHref) {
+        baseUrl = resolveHref(baseUrl, baseHref);
+      }
+    }
+
+    return baseUrl;
+  },
+  resolve: function(document, href) {
+    // if getAttribute returns null, there is no href
+    // lets resolve to an empty string (nulls are not expected farther up)
+    if (href === null) {
+      return '';
+    }
+
+    var baseUrl = this.baseUrl(document);
+
+    return resolveHref(baseUrl, href);
+  },
+  download: function(url, cookie, cookieDomain, referrer, callback) {
+    var path    = url.pathname + (url.search || ''),
+        options = {'method': 'GET', 'host': url.hostname, 'path': path},
+        request;
+    if (url.protocol === 'https:') {
+      options.port = url.port || 443;
+      request = https.request(options);
+    } else {
+      options.port = url.port || 80;
+      request = http.request(options);
+    }
+
+    // set header.
+    if (referrer) {
+        request.setHeader('Referer', referrer);
+    }
+    if (cookie) {
+      var host = url.host.split(':')[0];
+      if (host.indexOf(cookieDomain, host.length - cookieDomain.length) !== -1) {
+        request.setHeader('cookie', cookie);
+      }
+    }
+
+    request.on('response', function (response) {
+      var data = '';
+      function success () {
+        if ([301, 302, 303, 307].indexOf(response.statusCode) > -1) {
+          var redirect = URL.resolve(url, response.headers["location"]);
+          core.resourceLoader.download(URL.parse(redirect), cookie, cookieDomain, referrer, callback);
+        } else {
+          callback(null, data);
+        }
+      }
+      response.setEncoding('utf8');
+      response.on('data', function (chunk) {
+        data += chunk.toString();
+      });
+      response.on('end', function() {
+        // According to node docs, 'close' can fire after 'end', but not
+        // vice versa.  Remove 'close' listener so we don't call success twice.
+        response.removeAllListeners('close');
+        success();
+      });
+      response.on('close', function (err) {
+        if (err) {
+          callback(err);
+        } else {
+          success();
+        }
+      });
+    });
+
+    request.on('error', callback);
+    request.end();
+  },
+  readFile: function(url, callback) {
+    fs.readFile(url.replace(/^file:\/\//, "").replace(/^\/([a-z]):\//i, '$1:/').replace(/%20/g, ' '), 'utf8', callback);
+  }
+};
+
+function define(elementClass, def) {
+  var tagName = def.tagName,
+    tagNames = def.tagNames || (tagName? [tagName] : []),
+    parentClass = def.parentClass || core.HTMLElement,
+    attrs = def.attributes || [],
+    proto = def.proto || {};
+
+  var elem = core[elementClass] = function(document, name) {
+    parentClass.call(this, document, name || tagName.toUpperCase());
+    if (elem._init) {
+      elem._init.call(this);
+    }
+  };
+  elem._init = def.init;
+
+  elem.prototype = proto;
+  elem.prototype.__proto__ = parentClass.prototype;
+
+  attrs.forEach(function(n) {
+      var prop = n.prop || n,
+        attr = n.attr || prop.toLowerCase();
+
+      if (!n.prop || n.read !== false) {
+        elem.prototype.__defineGetter__(prop, function() {
+          var s = this.getAttribute(attr);
+          if (n.type && n.type === 'boolean') {
+            return s !== null;
+          }
+          if (n.type && n.type === 'long') {
+            return +s;
+          }
+          if (typeof n === 'object' && n.normalize) { // see GH-491
+            return n.normalize(s);
+          }
+          return s;
+        });
+      }
+
+      if (!n.prop || n.write !== false) {
+        elem.prototype.__defineSetter__(prop, function(val) {
+          if (!val) {
+            this.removeAttribute(attr);
+          }
+          else {
+            var s = val.toString();
+            if (n.normalize) {
+              s = n.normalize(s);
+            }
+            this.setAttribute(attr, s);
+          }
+        });
+      }
+  });
+
+  tagNames.forEach(function(tag) {
+    core.Document.prototype._elementBuilders[tag.toLowerCase()] = function(doc, s) {
+      var el = new elem(doc, s);
+
+      if (def.elementBuilder) {
+        return def.elementBuilder(el, doc, s);
+      }
+
+      return el;
+    };
+  });
+}
+
+
+
+core.HTMLCollection = function HTMLCollection(element, query) {
+  this._keys = [];
+  core.NodeList.call(this, element, query);
+};
+core.HTMLCollection.prototype = {
+  namedItem: function(name) {
+    // Try property shortcut; should work in most cases
+    if (Object.prototype.hasOwnProperty.call(this, name)) {
+      return this[name];
+    }
+
+    var results = this._toArray(),
+        l       = results.length,
+        node,
+        matchingName = null;
+
+    for (var i=0; i<l; i++) {
+      node = results[i];
+      if (node.getAttribute('id') === name) {
+        return node;
+      } else if (node.getAttribute('name') === name) {
+        matchingName = node;
+      }
+    }
+    return matchingName;
+  },
+  toString: function() {
+    return '[ jsdom HTMLCollection ]: contains ' + this.length + ' items';
+  },
+  _resetTo: function(array) {
+    var i, _this = this;
+
+    for (i = 0; i < this._keys.length; ++i) {
+      delete this[this._keys[i]];
+    }
+    this._keys = [];
+
+    core.NodeList.prototype._resetTo.apply(this, arguments);
+
+    function testAttr(node, attr) {
+      var val = node.getAttribute(attr);
+      if (val && !Object.prototype.hasOwnProperty.call(_this, val)) {
+        _this[val] = node;
+        _this._keys.push(val);
+      }
+    }
+    for (i = 0; i < array.length; ++i) {
+      testAttr(array[i], 'id');
+    }
+    for (i = 0; i < array.length; ++i) {
+      testAttr(array[i], 'name');
+    }
+  }
+};
+Object.defineProperty(core.HTMLCollection.prototype, 'constructor', {
+  value: core.NodeList,
+  writable: true,
+  configurable: true
+});
+
+core.HTMLCollection.prototype.__proto__ = core.NodeList.prototype;
+
+core.HTMLOptionsCollection = core.HTMLCollection;
+
+function closest(e, tagName) {
+  tagName = tagName.toUpperCase();
+  while (e) {
+    if (e.nodeName.toUpperCase() === tagName ||
+        (e.tagName && e.tagName.toUpperCase() === tagName))
+    {
+      return e;
+    }
+    e = e._parentNode;
+  }
+  return null;
+}
+
+function descendants(e, tagName, recursive) {
+  var owner = recursive ? e._ownerDocument || e : e;
+  return new core.HTMLCollection(owner, core.mapper(e, function(n) {
+    return n.nodeName === tagName && typeof n._publicId == 'undefined';
+  }, recursive));
+}
+
+function firstChild(e, tagName) {
+  if (!e) {
+    return null;
+  }
+  var c = descendants(e, tagName, false);
+  return c.length > 0 ? c[0] : null;
+}
+
+function ResourceQueue(paused) {
+  this.paused = !!paused;
+}
+ResourceQueue.prototype = {
+  push: function(callback) {
+    var q = this;
+    var item = {
+      prev: q.tail,
+      check: function() {
+        if (!q.paused && !this.prev && this.fired){
+          callback(this.err, this.data);
+          if (this.next) {
+            this.next.prev = null;
+            this.next.check();
+          }else{//q.tail===this
+	    q.tail = null;
+	  }
+        }
+      }
+    };
+    if (q.tail) {
+      q.tail.next = item;
+    }
+    q.tail = item;
+    return function(err, data) {
+      item.fired = 1;
+      item.err = err;
+      item.data = data;
+      item.check();
+    };
+  },
+  resume: function() {
+    if(!this.paused){
+      return;
+    }
+    this.paused = false;
+    var head = this.tail;
+    while(head && head.prev){
+      head = head.prev;
+    }
+    if(head){
+      head.check();
+    }
+  }
+};
+
+core.HTMLDocument = function HTMLDocument(options) {
+  options = options || {};
+  if (!options.contentType) {
+    options.contentType = 'text/html';
+  }
+  core.Document.call(this, options);
+  this._referrer = options.referrer;
+  this._cookie = options.cookie;
+  this._cookieDomain = options.cookieDomain || '127.0.0.1';
+  this._URL = options.url || '/';
+  this._documentRoot = options.documentRoot || Path.dirname(this._URL);
+  this._queue = new ResourceQueue(options.deferClose);
+  this.readyState = 'loading';
+
+  // Add level2 features
+  this.implementation.addFeature('core'  , '2.0');
+  this.implementation.addFeature('html'  , '2.0');
+  this.implementation.addFeature('xhtml' , '2.0');
+  this.implementation.addFeature('xml'   , '2.0');
+};
+
+core.HTMLDocument.prototype = {
+  _referrer : "",
+  get referrer() {
+    return this._referrer || '';
+  },
+  get domain() {
+    return "";
+  },
+  _URL : "",
+  get URL() {
+    return this._URL;
+  },
+  get images() {
+    return this.getElementsByTagName('IMG');
+  },
+  get applets() {
+    return new core.HTMLCollection(this, core.mapper(this, function(el) {
+      if (el && el.tagName) {
+        var upper = el.tagName.toUpperCase();
+        if (upper === "APPLET") {
+          return true;
+        } else if (upper === "OBJECT" &&
+          el.getElementsByTagName('APPLET').length > 0)
+        {
+          return true;
+        }
+      }
+    }));
+  },
+  get links() {
+    return new core.HTMLCollection(this, core.mapper(this, function(el) {
+      if (el && el.tagName) {
+        var upper = el.tagName.toUpperCase();
+        if (upper === "AREA" || (upper === "A" && el.href)) {
+          return true;
+        }
+      }
+    }));
+  },
+  get forms() {
+    return this.getElementsByTagName('FORM');
+  },
+  get anchors() {
+    return this.getElementsByTagName('A');
+  },
+  open  : function() {
+    this._childNodes = new core.NodeList();
+    this._documentElement = null;
+    this._modified();
+  },
+  close : function() {
+    this._queue.resume();
+    // Set the readyState to 'complete' once all resources are loaded.
+    // As a side-effect the document's load-event will be dispatched.
+    core.resourceLoader.enqueue(this, function() {
+      this.readyState = 'complete';
+      var ev = this.createEvent('HTMLEvents');
+      ev.initEvent('DOMContentLoaded', false, false);
+      this.dispatchEvent(ev);
+    })(null, true);
+  },
+
+  write : function(text) {
+    if (this._writeAfterElement) {
+      // If called from an script element directly (during the first tick),
+      // the new elements are inserted right after that element.
+      var tempDiv       = this.createElement('div');
+      tempDiv.innerHTML = text;
+
+      var child    = tempDiv.firstChild;
+      var previous = this._writeAfterElement;
+      var parent   = this._writeAfterElement.parentNode;
+
+      while (child) {
+        var node = child;
+        child    = child.nextSibling;
+        parent.insertBefore(node, previous.nextSibling);
+        previous = node;
+      }
+    } else if (this.readyState === "loading") {
+      // During page loading, document.write appends to the current element
+      // Find the last child that has ben added to the document.
+      var node = this;
+      while (node.lastChild && node.lastChild.nodeType === this.ELEMENT_NODE) {
+        node = node.lastChild;
+      }
+      node.innerHTML = text;
+    } else {
+      this.innerHTML = text;
+    }
+  },
+
+  writeln : function(text) {
+    this.write(text + '\n');
+  },
+
+  getElementsByName : function(elementName) {
+    return new core.HTMLCollection(this, core.mapper(this, function(el) {
+      return (el.getAttribute && el.getAttribute("name") === elementName);
+    }));
+  },
+
+  get title() {
+    var head = this.head,
+      title = head ? firstChild(head, 'TITLE') : null;
+    return title ? title.textContent : '';
+  },
+
+  set title(val) {
+    var title = firstChild(this.head, 'TITLE');
+    if (!title) {
+      title = this.createElement('TITLE');
+      var head = this.head;
+      if (!head) {
+        head = this.createElement('HEAD');
+        this.documentElement.insertBefore(head, this.documentElement.firstChild);
+      }
+      head.appendChild(title);
+    }
+    title.textContent = val;
+  },
+
+  get head() {
+    return firstChild(this.documentElement, 'HEAD');
+  },
+
+  set head(unused) { /* noop */ },
+
+  get body() {
+    var body = firstChild(this.documentElement, 'BODY');
+    if (!body) {
+      body = firstChild(this.documentElement, 'FRAMESET');
+    }
+    return body;
+  },
+
+  get documentElement() {
+    if (!this._documentElement) {
+      this._documentElement = firstChild(this, 'HTML');
+    }
+    return this._documentElement;
+  },
+
+  _cookie : "",
+  get cookie() { return this._cookie || ''; },
+  set cookie(val) { this._cookie = val; }
+};
+core.HTMLDocument.prototype.__proto__ = core.Document.prototype;
+
+define('HTMLElement', {
+  parentClass: core.Element,
+  proto : {
+    // Add default event behavior (click link to navigate, click button to submit
+    // form, etc). We start by wrapping dispatchEvent so we can forward events to
+    // the element's _eventDefault function (only events that did not incur
+    // preventDefault).
+    dispatchEvent : function (event) {
+      var outcome = core.Node.prototype.dispatchEvent.call(this, event)
+
+      if (!event._preventDefault     &&
+          event.target._eventDefaults[event.type] &&
+          typeof event.target._eventDefaults[event.type] === 'function')
+      {
+        event.target._eventDefaults[event.type](event)
+      }
+      return outcome;
+    },
+    getBoundingClientRect: function () {
+      return {
+        bottom: 0,
+        height: 0,
+        left: 0,
+        right: 0,
+        top: 0,
+        width: 0
+      };
+    },
+    _eventDefaults : {}
+  },
+  attributes: [
+    'id',
+    'title',
+    'lang',
+    'dir',
+    {prop: 'className', attr: 'class', normalize: function(s) { return s || ''; }}
+  ]
+});
+
+core.Document.prototype._defaultElementBuilder = function(document, tagName) {
+  return new core.HTMLElement(document, tagName);
+};
+
+//http://www.w3.org/TR/html5/forms.html#category-listed
+var listedElements = /button|fieldset|input|keygen|object|select|textarea/i;
+
+define('HTMLFormElement', {
+  tagName: 'FORM',
+  proto: {
+    get elements() {
+      return new core.HTMLCollection(this._ownerDocument, core.mapper(this, function(e) {
+        return listedElements.test(e.nodeName) ; // TODO exclude <input type="image">
+      }));
+    },
+    get length() {
+      return this.elements.length;
+    },
+    _dispatchSubmitEvent: function() {
+      var ev = this._ownerDocument.createEvent('HTMLEvents');
+      ev.initEvent('submit', true, true);
+      if (!this.dispatchEvent(ev)) {
+        this.submit();
+      };
+    },
+    submit: function() {
+    },
+    reset: function() {
+      this.elements._toArray().forEach(function(el) {
+        el.value = el.defaultValue;
+      });
+    }
+  },
+  attributes: [
+    'name',
+    {prop: 'acceptCharset', attr: 'accept-charset'},
+    'action',
+    'enctype',
+    'method',
+    'target'
+  ]
+});
+
+define('HTMLLinkElement', {
+  tagName: 'LINK',
+  proto: {
+    get href() {
+      return core.resourceLoader.resolve(this._ownerDocument, this.getAttribute('href'));
+    }
+  },
+  attributes: [
+    {prop: 'disabled', type: 'boolean'},
+    'charset',
+    'href',
+    'hreflang',
+    'media',
+    'rel',
+    'rev',
+    'target',
+    'type'
+  ]
+});
+
+define('HTMLMetaElement', {
+  tagName: 'META',
+  attributes: [
+    'content',
+    {prop: 'httpEquiv', attr: 'http-equiv'},
+    'name',
+    'scheme'
+  ]
+});
+
+define('HTMLHtmlElement', {
+  tagName: 'HTML',
+  attributes: [
+    'version'
+  ]
+});
+
+define('HTMLHeadElement', {
+  tagName: 'HEAD',
+  attributes: [
+    'profile'
+  ]
+});
+
+define('HTMLTitleElement', {
+  tagName: 'TITLE',
+  proto: {
+    get text() {
+      return this.innerHTML;
+    },
+    set text(s) {
+      this.innerHTML = s;
+    }
+  }
+});
+
+define('HTMLBaseElement', {
+  tagName: 'BASE',
+  attributes: [
+    'href',
+    'target'
+  ]
+});
+
+
+//**Deprecated**
+define('HTMLIsIndexElement', {
+  tagName : 'ISINDEX',
+  parentClass : core.Element,
+  proto : {
+    get form() {
+      return closest(this, 'FORM');
+    }
+  },
+  attributes : [
+    'prompt'
+  ]
+});
+
+
+define('HTMLStyleElement', {
+  tagName: 'STYLE',
+  attributes: [
+    {prop: 'disabled', type: 'boolean'},
+    'media',
+    'type',
+  ]
+});
+
+define('HTMLBodyElement', {
+  proto: (function() {
+    var proto = {};
+    // The body element's "traditional" event handlers are proxied to the
+    // window object.
+    // See: http://dev.w3.org/html5/spec/Overview.html#the-body-element
+    ['onafterprint', 'onbeforeprint', 'onbeforeunload', 'onblur', 'onerror',
+     'onfocus', 'onhashchange', 'onload', 'onmessage', 'onoffline', 'ononline',
+     'onpagehide', 'onpageshow', 'onpopstate', 'onresize', 'onscroll',
+     'onstorage', 'onunload'].forEach(function (name) {
+      proto.__defineSetter__(name, function (handler) {
+        this._ownerDocument.parentWindow[name] = handler;
+      });
+      proto.__defineGetter__(name, function () {
+        return this._ownerDocument.parentWindow[name];
+      });
+    });
+    return proto;
+  })(),
+  tagName: 'BODY',
+  attributes: [
+    'aLink',
+    'background',
+    'bgColor',
+    'link',
+    'text',
+    'vLink'
+  ]
+});
+
+define('HTMLSelectElement', {
+  tagName: 'SELECT',
+  proto: {
+    get options() {
+      return new core.HTMLOptionsCollection(this, core.mapper(this, function(n) {
+        return n.nodeName === 'OPTION';
+      }));
+    },
+
+    get length() {
+      return this.options.length;
+    },
+
+    get selectedIndex() {
+      return this.options._toArray().reduceRight(function(prev, option, i) {
+        return option.selected ? i : prev;
+      }, -1);
+    },
+
+    set selectedIndex(index) {
+      this.options._toArray().forEach(function(option, i) {
+        option.selected = i === index;
+      });
+    },
+
+    get value() {
+      var i = this.selectedIndex;
+      if (this.options.length && (i === -1)) {
+        i = 0;
+      }
+      if (i === -1) {
+        return '';
+      }
+      return this.options[i].value;
+    },
+
+    set value(val) {
+      var self = this;
+      this.options._toArray().forEach(function(option) {
+        if (option.value === val) {
+          option.selected = true;
+        } else {
+          if (!self.hasAttribute('multiple')) {
+            // Remove the selected bit from all other options in this group
+            // if the multiple attr is not present on the select
+            option.selected = false;
+          }
+        }
+      });
+    },
+
+    get form() {
+      return closest(this, 'FORM');
+    },
+
+    get type() {
+      return this.multiple ? 'select-multiple' : 'select-one';
+    },
+
+    add: function(opt, before) {
+      if (before) {
+        this.insertBefore(opt, before);
+      }
+      else {
+        this.appendChild(opt);
+      }
+    },
+
+    remove: function(index) {
+      var opts = this.options._toArray();
+      if (index >= 0 && index < opts.length) {
+        var el = opts[index];
+        el._parentNode.removeChild(el);
+      }
+    },
+
+    blur : function() {
+      this._ownerDocument.activeElement = this._ownerDocument.body;
+    },
+    focus : function() {
+      this._ownerDocument.activeElement = this;
+    }
+
+  },
+  attributes: [
+    {prop: 'disabled', type: 'boolean'},
+    {prop: 'multiple', type: 'boolean'},
+    'name',
+    {prop: 'size', type: 'long'},
+    {prop: 'tabIndex', type: 'long'},
+  ]
+});
+
+define('HTMLOptGroupElement', {
+  tagName: 'OPTGROUP',
+  attributes: [
+    {prop: 'disabled', type: 'boolean'},
+    'label'
+  ]
+});
+
+define('HTMLOptionElement', {
+  tagName: 'OPTION',
+  proto: {
+    _attrModified: function(name, value) {
+      if (name === 'selected') {
+        this.selected = this.defaultSelected;
+      }
+      core.HTMLElement.prototype._attrModified.call(this, arguments);
+    },
+    get form() {
+      return closest(this, 'FORM');
+    },
+    get defaultSelected() {
+      return this.getAttribute('selected') !== null;
+    },
+    set defaultSelected(s) {
+      if (s) this.setAttribute('selected', 'selected');
+      else this.removeAttribute('selected');
+    },
+    get text() {
+      return this.innerHTML;
+    },
+    get value() {
+      return (this.hasAttribute('value')) ? this.getAttribute('value') : this.innerHTML;
+    },
+    set value(val) {
+      this.setAttribute('value', val);
+    },
+    get index() {
+      return closest(this, 'SELECT').options._toArray().indexOf(this);
+    },
+    get selected() {
+      if (this._selected === undefined) {
+        this._selected = this.defaultSelected;
+      }
+
+      if (!this._selected && this.parentNode) {
+        var select = closest(this, 'SELECT');
+
+        if (select) {
+          var options = select.options;
+
+          if (options.item(0) === this && !select.hasAttribute('multiple')) {
+            var found = false, optArray = options._toArray();
+
+            for (var i = 1, l = optArray.length; i<l; i++) {
+              if (optArray[i]._selected) {
+                return false;
+              }
+            }
+            return true;
+          }
+        }
+      }
+
+      return this._selected;
+    },
+    set selected(s) {
+      // TODO: The 'selected' content attribute is the initial value of the
+      // IDL attribute, but the IDL attribute should not relfect the content
+      this._selected = !!s;
+      if (s) {
+        //Remove the selected bit from all other options in this select
+        var select = this._parentNode;
+        if (!select) return;
+        if (select.nodeName !== 'SELECT') {
+          select = select._parentNode;
+          if (!select) return;
+          if (select.nodeName !== 'SELECT') return;
+        }
+        if (!select.multiple) {
+          var o = select.options;
+          for (var i = 0; i < o.length; i++) {
+            if (o[i] !== this) {
+                o[i].selected = false;
+            }
+          }
+        }
+      }
+    }
+  },
+  attributes: [
+    {prop: 'disabled', type: 'boolean'},
+    'label'
+  ]
+});
+
+define('HTMLInputElement', {
+  tagName: 'INPUT',
+  init: function() {
+    if (!this.hasAttribute('type')) {
+      this.setAttribute('type', 'text');
+    }
+  },
+  proto: {
+    _initDefaultValue: function() {
+      if (this._defaultValue === undefined) {
+        var attr = this.getAttributeNode('value');
+        this._defaultValue = attr ? attr.value : null;
+      }
+      return this._defaultValue;
+    },
+    _initDefaultChecked: function() {
+      if (this._defaultChecked === undefined) {
+        this._defaultChecked = !!this.getAttribute('checked');
+      }
+      return this._defaultChecked;
+    },
+    get form() {
+      return closest(this, 'FORM');
+    },
+    get defaultValue() {
+      return this._initDefaultValue();
+    },
+    get defaultChecked() {
+      return this._initDefaultChecked();
+    },
+    get checked() {
+      return !!this._attributes.getNamedItem('checked');
+    },
+    set checked(checked) {
+      this._initDefaultChecked();
+      if (checked) {
+        this.setAttribute('checked', 'checked');
+        if (this.type === 'radio') {
+          var elements = this._ownerDocument.getElementsByName(this.name);
+          for (var i = 0; i < elements.length; i++) {
+            if (elements[i] !== this && elements[i].tagName === "INPUT" && elements[i].type === "radio") {
+              elements[i].checked = false;
+            }
+          }
+        }
+      } else {
+        this.removeAttribute('checked');
+      }
+    },
+    get value() {
+      return this.getAttribute('value');
+    },
+    set value(val) {
+      this._initDefaultValue();
+      if (val === null) {
+        this.removeAttribute('value');
+      }
+      else {
+        this.setAttribute('value', val);
+      }
+    },
+    blur : function() {
+      this._ownerDocument.activeElement = this._ownerDocument.body;
+    },
+    focus : function() {
+      this._ownerDocument.activeElement = this;
+    },
+    select: function() {
+    },
+
+    _dispatchClickEvent: function() {
+      var event = this._ownerDocument.createEvent("HTMLEvents");
+      event.initEvent("click", true, true);
+      this.dispatchEvent(event);
+    },
+
+    click: function() {
+      if (this.type === 'checkbox') {
+        this.checked = !this.checked;
+      }
+      else if (this.type === 'radio') {
+        this.checked = true;
+      }
+      else if (this.type === 'submit') {
+        var form = this.form;
+        if (form) {
+          form._dispatchSubmitEvent();
+        }
+      }
+      this._dispatchClickEvent();
+    }
+  },
+  attributes: [
+    'accept',
+    'accessKey',
+    'align',
+    'alt',
+    {prop: 'disabled', type: 'boolean'},
+    {prop: 'maxLength', type: 'long'},
+    'name',
+    {prop: 'readOnly', type: 'boolean'},
+    {prop: 'size', type: 'long'},
+    'src',
+    {prop: 'tabIndex', type: 'long'},
+    {prop: 'type', normalize: function(val) {
+        return val ? val.toLowerCase() : 'text';
+    }},
+    'useMap'
+  ]
+});
+
+define('HTMLTextAreaElement', {
+  tagName: 'TEXTAREA',
+  proto: {
+    _initDefaultValue: function() {
+      if (this._defaultValue === undefined) {
+        this._defaultValue = this.textContent;
+      }
+      return this._defaultValue;
+    },
+    get form() {
+      return closest(this, 'FORM');
+    },
+    get defaultValue() {
+      return this._initDefaultValue();
+    },
+    get value() {
+      return this.textContent;
+    },
+    set value(val) {
+      this._initDefaultValue();
+      this.textContent = val;
+    },
+    get type() {
+      return 'textarea';
+    },
+    blur : function() {
+      this._ownerDocument.activeElement = this._ownerDocument.body;
+    },
+    focus : function() {
+      this._ownerDocument.activeElement = this;
+    },
+    select: function() {
+    }
+  },
+  attributes: [
+    'accessKey',
+    {prop: 'cols', type: 'long'},
+    {prop: 'disabled', type: 'boolean'},
+    {prop: 'maxLength', type: 'long'},
+    'name',
+    {prop: 'readOnly', type: 'boolean'},
+    {prop: 'rows', type: 'long'},
+    {prop: 'tabIndex', type: 'long'}
+  ]
+});
+
+define('HTMLButtonElement', {
+  tagName: 'BUTTON',
+  proto: {
+    get form() {
+      return closest(this, 'FORM');
+    },
+    focus : function() {
+      this._ownerDocument.activeElement = this;
+    },
+    blur : function() {
+      this._ownerDocument.activeElement = this._ownerDocument.body;
+    }
+  },
+  attributes: [
+    'accessKey',
+    {prop: 'disabled', type: 'boolean'},
+    'name',
+    {prop: 'tabIndex', type: 'long'},
+    'type',
+    'value'
+  ]
+});
+
+define('HTMLLabelElement', {
+  tagName: 'LABEL',
+  proto: {
+    get form() {
+      return closest(this, 'FORM');
+    }
+  },
+  attributes: [
+    'accessKey',
+    {prop: 'htmlFor', attr: 'for'}
+  ]
+});
+
+define('HTMLFieldSetElement', {
+  tagName: 'FIELDSET',
+  proto: {
+    get form() {
+      return closest(this, 'FORM');
+    }
+  }
+});
+
+define('HTMLLegendElement', {
+  tagName: 'LEGEND',
+  proto: {
+    get form() {
+      return closest(this, 'FORM');
+    }
+  },
+  attributes: [
+    'accessKey',
+    'align'
+  ]
+});
+
+define('HTMLUListElement', {
+  tagName: 'UL',
+  attributes: [
+    {prop: 'compact', type: 'boolean'},
+    'type'
+  ]
+});
+
+define('HTMLOListElement', {
+  tagName: 'OL',
+  attributes: [
+    {prop: 'compact', type: 'boolean'},
+    {prop: 'start', type: 'long'},
+    'type'
+  ]
+});
+
+define('HTMLDListElement', {
+  tagName: 'DL',
+  attributes: [
+    {prop: 'compact', type: 'boolean'}
+  ]
+});
+
+define('HTMLDirectoryElement', {
+  tagName: 'DIR',
+  attributes: [
+    {prop: 'compact', type: 'boolean'}
+  ]
+});
+
+define('HTMLMenuElement', {
+  tagName: 'MENU',
+  attributes: [
+    {prop: 'compact', type: 'boolean'}
+  ]
+});
+
+define('HTMLLIElement', {
+  tagName: 'LI',
+  attributes: [
+    'type',
+    {prop: 'value', type: 'long'}
+  ]
+});
+
+define('HTMLCanvasElement', {
+  tagName: 'CANVAS',
+  attributes: [
+    'align'
+  ],
+  elementBuilder: function (element) {
+    // require node-canvas and catch the error if it blows up
+    try {
+      var canvas = new (require('canvas'))(0,0);
+      for (var attr in element) {
+        if (!canvas[attr]) {
+          canvas[attr] = element[attr];
+        }
+      }
+      return canvas;
+    } catch (e) {
+      return element;
+    }
+  }
+});
+
+define('HTMLDivElement', {
+  tagName: 'DIV',
+  attributes: [
+    'align'
+  ]
+});
+
+define('HTMLParagraphElement', {
+  tagName: 'P',
+  attributes: [
+    'align'
+  ]
+});
+
+define('HTMLHeadingElement', {
+  tagNames: ['H1','H2','H3','H4','H5','H6'],
+  attributes: [
+    'align'
+  ]
+});
+
+define('HTMLQuoteElement', {
+  tagNames: ['Q','BLOCKQUOTE'],
+  attributes: [
+    'cite'
+  ]
+});
+
+define('HTMLPreElement', {
+  tagName: 'PRE',
+  attributes: [
+    {prop: 'width', type: 'long'}
+  ]
+});
+
+define('HTMLBRElement', {
+  tagName: 'BR',
+  attributes: [
+    'clear'
+  ]
+});
+
+define('HTMLBaseFontElement', {
+  tagName: 'BASEFONT',
+  attributes: [
+    'color',
+    'face',
+    {prop: 'size', type: 'long'}
+  ]
+});
+
+define('HTMLFontElement', {
+  tagName: 'FONT',
+  attributes: [
+    'color',
+    'face',
+    'size'
+  ]
+});
+
+define('HTMLHRElement', {
+  tagName: 'HR',
+  attributes: [
+    'align',
+    {prop: 'noShade', type: 'boolean'},
+    'size',
+    'width'
+  ]
+});
+
+define('HTMLModElement', {
+  tagNames: ['INS', 'DEL'],
+  attributes: [
+    'cite',
+    'dateTime'
+  ]
+});
+
+define('HTMLAnchorElement', {
+  tagName: 'A',
+
+  proto: {
+    blur : function() {
+      this._ownerDocument.activeElement = this._ownerDocument.body;
+    },
+    focus : function() {
+      this._ownerDocument.activeElement = this;
+    },
+    get href() {
+      return core.resourceLoader.resolve(this._ownerDocument, this.getAttribute('href'));
+    },
+    get hostname() {
+      return URL.parse(this.href).hostname;
+    },
+    get host() {
+      return URL.parse(this.href).host;
+    },
+    get pathname() {
+      return URL.parse(this.href).pathname;
+    }
+  },
+  attributes: [
+    'accessKey',
+    'charset',
+    'coords',
+    {prop: 'href', type: 'string', read: false},
+    'hreflang',
+    'name',
+    'rel',
+    'rev',
+    'shape',
+    {prop: 'tabIndex', type: 'long'},
+    'target',
+    'type'
+  ]
+});
+
+define('HTMLImageElement', {
+  tagName: 'IMG',
+  proto: {
+    _attrModified: function(name, value, oldVal) {
+      if (name == 'src' && value !== oldVal) {
+        core.resourceLoader.enqueue(this, function() {})();
+      }
+    },
+    get src() {
+      return core.resourceLoader.resolve(this._ownerDocument, this.getAttribute('src'));
+    }
+  },
+  attributes: [
+    'name',
+    'align',
+    'alt',
+    'border',
+    {prop: 'height', type: 'long'},
+    {prop: 'hspace', type: 'long'},
+    {prop: 'isMap', type: 'boolean'},
+    'longDesc',
+    {prop: 'src', type: 'string', read: false},
+    'useMap',
+    {prop: 'vspace', type: 'long'},
+    {prop: 'width', type: 'long'}
+  ]
+});
+
+define('HTMLObjectElement', {
+  tagName: 'OBJECT',
+  proto: {
+    get form() {
+      return closest(this, 'FORM');
+    },
+    get contentDocument() {
+      return null;
+    }
+  },
+  attributes: [
+    'code',
+    'align',
+    'archive',
+    'border',
+    'codeBase',
+    'codeType',
+    'data',
+    {prop: 'declare', type: 'boolean'},
+    {prop: 'height',  type: 'long'},
+    {prop: 'hspace',  type: 'long'},
+    'name',
+    'standby',
+    {prop: 'tabIndex', type: 'long'},
+    'type',
+    'useMap',
+    {prop: 'vspace', type: 'long'},
+    {prop: 'width', type: 'long'}
+  ]
+});
+
+define('HTMLParamElement', {
+  tagName: 'PARAM',
+  attributes: [
+    'name',
+    'type',
+    'value',
+    'valueType'
+  ]
+});
+
+define('HTMLAppletElement', {
+  tagName: 'APPLET',
+  attributes: [
+    'align',
+    'alt',
+    'archive',
+    'code',
+    'codeBase',
+    'height',
+    {prop: 'hspace', type: 'long'},
+    'name',
+    'object',
+    {prop: 'vspace', type: 'long'},
+    'width'
+  ]
+});
+
+define('HTMLMapElement', {
+  tagName: 'MAP',
+  proto: {
+    get areas() {
+      return this.getElementsByTagName("AREA");
+    }
+  },
+  attributes: [
+    'name'
+  ]
+});
+
+define('HTMLAreaElement', {
+  tagName: 'AREA',
+  attributes: [
+    'accessKey',
+    'alt',
+    'coords',
+    'href',
+    {prop: 'noHref', type: 'boolean'},
+    'shape',
+    {prop: 'tabIndex', type: 'long'},
+    'target'
+  ]
+});
+
+define('HTMLScriptElement', {
+  tagName: 'SCRIPT',
+  init: function() {
+    this.addEventListener('DOMNodeInsertedIntoDocument', function() {
+      if (this.src) {
+        core.resourceLoader.load(this, this.src, this._eval);
+      }
+      else {
+        var src = this.sourceLocation || {},
+            filename = src.file || this._ownerDocument.URL;
+
+        if (src) {
+          filename += ':' + src.line + ':' + src.col;
+        }
+        filename += '<script>';
+
+        core.resourceLoader.enqueue(this, this._eval, filename)(null, this.text);
+      }
+    });
+  },
+  proto: {
+    _eval: function(text, filename) {
+      if (this._ownerDocument.implementation.hasFeature("ProcessExternalResources", "script") &&
+          this.language                                                                      &&
+          core.languageProcessors[this.language])
+      {
+        this._ownerDocument._writeAfterElement = this;
+        core.languageProcessors[this.language](this, text, filename);
+        delete this._ownerDocument._writeAfterElement;
+      }
+    },
+    get language() {
+      var type = this.type || "text/javascript";
+      return type.split("/").pop().toLowerCase();
+    },
+    get text() {
+      var i=0, children = this.childNodes, l = children.length, ret = [];
+
+      for (i; i<l; i++) {
+        ret.push(children.item(i).nodeValue);
+      }
+
+      return ret.join("");
+    },
+    set text(text) {
+      while (this.childNodes.length) {
+        this.removeChild(this.childNodes[0]);
+      }
+      this.appendChild(this._ownerDocument.createTextNode(text));
+    }
+  },
+  attributes : [
+    {prop: 'defer', 'type': 'boolean'},
+    'htmlFor',
+    'event',
+    'charset',
+    'type',
+    'src'
+  ]
+})
+
+define('HTMLTableElement', {
+  tagName: 'TABLE',
+  proto: {
+    get caption() {
+      return firstChild(this, 'CAPTION');
+    },
+    get tHead() {
+      return firstChild(this, 'THEAD');
+    },
+    get tFoot() {
+      return firstChild(this, 'TFOOT');
+    },
+    get rows() {
+      if (!this._rows) {
+        var table = this;
+        this._rows = new core.HTMLCollection(this._ownerDocument, function() {
+          var sections = [table.tHead].concat(table.tBodies._toArray(), table.tFoot).filter(function(s) { return !!s });
+
+          if (sections.length === 0) {
+            return core.mapDOMNodes(table, false, function(el) {
+              return el.tagName === 'TR';
+            });
+          }
+
+          return sections.reduce(function(prev, s) {
+            return prev.concat(s.rows._toArray());
+          }, []);
+
+        });
+      }
+      return this._rows;
+    },
+    get tBodies() {
+      if (!this._tBodies) {
+        this._tBodies = descendants(this, 'TBODY', false);
+      }
+      return this._tBodies;
+    },
+    createTHead: function() {
+      var el = this.tHead;
+      if (!el) {
+        el = this._ownerDocument.createElement('THEAD');
+        this.appendChild(el);
+      }
+      return el;
+    },
+    deleteTHead: function() {
+      var el = this.tHead;
+      if (el) {
+        el._parentNode.removeChild(el);
+      }
+    },
+    createTFoot: function() {
+      var el = this.tFoot;
+      if (!el) {
+        el = this._ownerDocument.createElement('TFOOT');
+        this.appendChild(el);
+      }
+      return el;
+    },
+    deleteTFoot: function() {
+      var el = this.tFoot;
+      if (el) {
+        el._parentNode.removeChild(el);
+      }
+    },
+    createCaption: function() {
+      var el = this.caption;
+      if (!el) {
+        el = this._ownerDocument.createElement('CAPTION');
+        this.appendChild(el);
+      }
+      return el;
+    },
+    deleteCaption: function() {
+      var c = this.caption;
+      if (c) {
+        c._parentNode.removeChild(c);
+      }
+    },
+    insertRow: function(index) {
+      var tr = this._ownerDocument.createElement('TR');
+      if (this.childNodes.length === 0) {
+        this.appendChild(this._ownerDocument.createElement('TBODY'));
+      }
+      var rows = this.rows._toArray();
+      if (index < -1 || index > rows.length) {
+        throw new core.DOMException(core.INDEX_SIZE_ERR);
+      }
+      if (index === -1 || (index === 0 && rows.length === 0)) {
+        this.tBodies.item(0).appendChild(tr);
+      }
+      else if (index === rows.length) {
+        var ref = rows[index-1];
+        ref._parentNode.appendChild(tr);
+      }
+      else {
+        var ref = rows[index];
+        ref._parentNode.insertBefore(tr, ref);
+      }
+      return tr;
+    },
+    deleteRow: function(index) {
+      var rows = this.rows._toArray(), l = rows.length;
+      if (index === -1) {
+        index = l-1;
+      }
+      if (index < 0 || index >= l) {
+        throw new core.DOMException(core.INDEX_SIZE_ERR);
+      }
+      var tr = rows[index];
+      tr._parentNode.removeChild(tr);
+    }
+  },
+  attributes: [
+    'align',
+    'bgColor',
+    'border',
+    'cellPadding',
+    'cellSpacing',
+    'frame',
+    'rules',
+    'summary',
+    'width'
+  ]
+});
+
+define('HTMLTableCaptionElement', {
+  tagName: 'CAPTION',
+  attributes: [
+    'align'
+  ]
+});
+
+define('HTMLTableColElement', {
+  tagNames: ['COL','COLGROUP'],
+  attributes: [
+    'align',
+    {prop: 'ch', attr: 'char'},
+    {prop: 'chOff', attr: 'charoff'},
+    {prop: 'span', type: 'long'},
+    'vAlign',
+    'width',
+  ]
+});
+
+define('HTMLTableSectionElement', {
+  tagNames: ['THEAD','TBODY','TFOOT'],
+  proto: {
+    get rows() {
+      if (!this._rows) {
+        this._rows = descendants(this, 'TR', false);
+      }
+      return this._rows;
+    },
+    insertRow: function(index) {
+      var tr = this._ownerDocument.createElement('TR');
+      var rows = this.rows._toArray();
+      if (index < -1 || index > rows.length) {
+        throw new core.DOMException(core.INDEX_SIZE_ERR);
+      }
+      if (index === -1 || index === rows.length) {
+        this.appendChild(tr);
+      }
+      else {
+        var ref = rows[index];
+        this.insertBefore(tr, ref);
+      }
+      return tr;
+    },
+    deleteRow: function(index) {
+      var rows = this.rows._toArray();
+      if (index === -1) {
+        index = rows.length-1;
+      }
+      if (index < 0 || index >= rows.length) {
+        throw new core.DOMException(core.INDEX_SIZE_ERR);
+      }
+      var tr = this.rows[index];
+      this.removeChild(tr);
+    }
+  },
+  attributes: [
+    'align',
+    {prop: 'ch', attr: 'char'},
+    {prop: 'chOff', attr: 'charoff'},
+    {prop: 'span', type: 'long'},
+    'vAlign',
+    'width',
+  ]
+});
+
+define('HTMLTableRowElement', {
+  tagName: 'TR',
+  proto: {
+    get cells() {
+      if (!this._cells) {
+        this._cells = new core.HTMLCollection(this, core.mapper(this, function(n) {
+          return n.nodeName === 'TD' || n.nodeName === 'TH';
+        }, false));
+      }
+      return this._cells;
+    },
+    get rowIndex() {
+      var table = closest(this, 'TABLE');
+      return table ? table.rows._toArray().indexOf(this) : -1;
+    },
+
+    get sectionRowIndex() {
+      return this._parentNode.rows._toArray().indexOf(this);
+    },
+    insertCell: function(index) {
+      var td = this._ownerDocument.createElement('TD');
+      var cells = this.cells._toArray();
+      if (index < -1 || index > cells.length) {
+        throw new core.DOMException(core.INDEX_SIZE_ERR);
+      }
+      if (index === -1 || index === cells.length) {
+        this.appendChild(td);
+      }
+      else {
+        var ref = cells[index];
+        this.insertBefore(td, ref);
+      }
+      return td;
+    },
+    deleteCell: function(index) {
+      var cells = this.cells._toArray();
+      if (index === -1) {
+        index = cells.length-1;
+      }
+      if (index < 0 || index >= cells.length) {
+        throw new core.DOMException(core.INDEX_SIZE_ERR);
+      }
+      var td = this.cells[index];
+      this.removeChild(td);
+    }
+  },
+  attributes: [
+    'align',
+    'bgColor',
+    {prop: 'ch', attr: 'char'},
+    {prop: 'chOff', attr: 'charoff'},
+    'vAlign'
+  ]
+});
+
+define('HTMLTableCellElement', {
+  tagNames: ['TH','TD'],
+  proto: {
+    _headers: null,
+    set headers(h) {
+      if (h === '') {
+        //Handle resetting headers so the dynamic getter returns a query
+        this._headers = null;
+        return;
+      }
+      if (!(h instanceof Array)) {
+        h = [h];
+      }
+      this._headers = h;
+    },
+    get headers() {
+      if (this._headers) {
+        return this._headers.join(' ');
+      }
+      var cellIndex = this.cellIndex,
+          headings  = [],
+          siblings  = this._parentNode.getElementsByTagName(this.tagName);
+
+      for (var i=0; i<siblings.length; i++) {
+        if (siblings.item(i).cellIndex >= cellIndex) {
+          break;
+        }
+        headings.push(siblings.item(i).id);
+      }
+      this._headers = headings;
+      return headings.join(' ');
+    },
+    get cellIndex() {
+      return closest(this, 'TR').cells._toArray().indexOf(this);
+    }
+  },
+  attributes: [
+    'abbr',
+    'align',
+    'axis',
+    'bgColor',
+    {prop: 'ch', attr: 'char'},
+    {prop: 'chOff', attr: 'charoff'},
+    {prop: 'colSpan', type: 'long'},
+    'height',
+    {prop: 'noWrap', type: 'boolean'},
+    {prop: 'rowSpan', type: 'long'},
+    'scope',
+    'vAlign',
+    'width'
+  ]
+});
+
+define('HTMLFrameSetElement', {
+  tagName: 'FRAMESET',
+  attributes: [
+    'cols',
+    'rows'
+  ]
+});
+
+function loadFrame (frame) {
+  if (frame._contentDocument) {
+    // We don't want to access document.parentWindow, since the getter will
+    // cause a new window to be allocated if it doesn't exist.  Probe the
+    // private variable instead.
+    if (frame._contentDocument._parentWindow) {
+      // close calls delete on its document.
+      frame._contentDocument.parentWindow.close();
+    } else {
+      delete frame._contentDocument;
+    }
+  }
+
+  var src = frame.src;
+  var parentDoc = frame._ownerDocument;
+  var url = core.resourceLoader.resolve(parentDoc, src);
+  var contentDoc = frame._contentDocument = new core.HTMLDocument({
+    url: url,
+    documentRoot: Path.dirname(url)
+  });
+  applyDocumentFeatures(contentDoc, parentDoc.implementation._features);
+
+  var parent = parentDoc.parentWindow;
+  var contentWindow = contentDoc.parentWindow;
+  contentWindow.parent = parent;
+  contentWindow.top = parent.top;
+
+  core.resourceLoader.load(frame, url, function(html, filename) {
+    contentDoc.write(html);
+    contentDoc.close();
+  });
+}
+
+define('HTMLFrameElement', {
+  tagName: 'FRAME',
+  init : function () {
+    // Set up the frames array.  window.frames really just returns a reference
+    // to the window object, so the frames array is just implemented as indexes
+    // on the window.
+    var parent = this._ownerDocument.parentWindow;
+    var frameID = parent._length++;
+    var self = this;
+    parent.__defineGetter__(frameID, function () {
+      return self.contentWindow;
+    });
+
+    // The contentDocument/contentWindow shouldn't be created until the frame
+    // is inserted:
+    // "When an iframe element is first inserted into a document, the user
+    //  agent must create a nested browsing context, and then process the
+    //  iframe attributes for the first time."
+    //  (http://dev.w3.org/html5/spec/Overview.html#the-iframe-element)
+    this._initInsertListener = this.addEventListener('DOMNodeInsertedIntoDocument', function () {
+      var parentDoc = self._ownerDocument;
+      // Calling contentDocument creates the Document if it doesn't exist.
+      var doc = self.contentDocument;
+      applyDocumentFeatures(doc, parentDoc.implementation._features);
+      var window = self.contentWindow;
+      window.parent = parent;
+      window.top = parent.top;
+    }, false);
+  },
+  proto: {
+    _attrModified: function(name, value, oldVal) {
+      core.HTMLElement.prototype._attrModified.call(this, name, value, oldVal);
+      var self = this;
+      if (name === 'name') {
+        // Remove named frame access.
+        if (oldVal) {
+          this._ownerDocument.parentWindow._frame(oldVal);
+        }
+        // Set up named frame access.
+        if (value) {
+          this._ownerDocument.parentWindow._frame(value, this);
+        }
+      } else if (name === 'src') {
+        // Page we don't fetch the page until the node is inserted. This at
+        // least seems to be the way Chrome does it.
+        if (!this._attachedToDocument) {
+          if (!this._waitingOnInsert) {
+            // First, remove the listener added in 'init'.
+            this.removeEventListener('DOMNodeInsertedIntoDocument',
+                                     this._initInsertListener, false)
+
+            // If we aren't already waiting on an insert, add a listener.
+            // This guards against src being set multiple times before the frame
+            // is inserted into the document - we don't want to register multiple
+            // callbacks.
+            this.addEventListener('DOMNodeInsertedIntoDocument', function loader () {
+              self.removeEventListener('DOMNodeInsertedIntoDocument', loader, false);
+              this._waitingOnInsert = false;
+              loadFrame(self);
+            }, false);
+            this._waitingOnInsert = true;
+          }
+        } else {
+          loadFrame(self);
+        }
+      }
+    },
+    _contentDocument : null,
+    get contentDocument() {
+      if (this._contentDocument == null) {
+        this._contentDocument = new core.HTMLDocument();
+      }
+      return this._contentDocument;
+    },
+    get contentWindow() {
+      return this.contentDocument.parentWindow;
+    }
+  },
+  attributes: [
+    'frameBorder',
+    'longDesc',
+    'marginHeight',
+    'marginWidth',
+    'name',
+    {prop: 'noResize', type: 'boolean'},
+    'scrolling',
+    {prop: 'src', type: 'string', write: false}
+  ]
+});
+
+define('HTMLIFrameElement', {
+  tagName: 'IFRAME',
+  parentClass: core.HTMLFrameElement,
+  attributes: [
+    'align',
+    'frameBorder',
+    'height',
+    'longDesc',
+    'marginHeight',
+    'marginWidth',
+    'name',
+    'scrolling',
+    'src',
+    'width'
+  ]
+});
+
+exports.define = define;
+exports.dom = {
+  level2 : {
+    html : core
+  }
+}
+
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level2/index.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level2/index.js
new file mode 100644
index 0000000..6754d25
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level2/index.js
@@ -0,0 +1,7 @@
+exports.dom = {
+  level2 : {
+    core   : require("./core").dom.level2.core,
+    events : require("./events").dom.level2.events,
+    html   : require("./html").dom.level2.html
+  }
+};
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level2/languages/javascript.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level2/languages/javascript.js
new file mode 100644
index 0000000..308724d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level2/languages/javascript.js
@@ -0,0 +1,13 @@
+exports.javascript = function(element, code, filename) {
+  var doc = element.ownerDocument, window = doc && doc.parentWindow;
+  if (window) {
+    try {
+      window.run(code, filename);
+    } catch (e) {
+      element.raise(
+        'error', 'Running ' + filename + ' failed.',
+        {error: e, filename: filename}
+      );
+    }
+  }
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level2/style.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level2/style.js
new file mode 100644
index 0000000..bb95737
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level2/style.js
@@ -0,0 +1,268 @@
+var core = require("./core").dom.level2.core,
+    html = require("./html").dom.level2.html,
+    utils = require("../utils"),
+    cssom = require("cssom"),
+    cssstyle = require("cssstyle"),
+    assert = require('assert');
+
+// What works now:
+// - Accessing the rules defined in individual stylesheets
+// - Modifications to style content attribute are reflected in style property
+// - Modifications to style property are reflected in style content attribute
+// TODO
+// - Modifications to style element's textContent are reflected in sheet property.
+// - Modifications to style element's sheet property are reflected in textContent.
+// - Modifications to link.href property are reflected in sheet property.
+// - Less-used features of link: disabled
+// - Less-used features of style: disabled, scoped, title
+// - CSSOM-View
+//   - getComputedStyle(): requires default stylesheet, cascading, inheritance,
+//     filtering by @media (screen? print?), layout for widths/heights
+// - Load events are not in the specs, but apparently some browsers
+//   implement something. Should onload only fire after all @imports have been
+//   loaded, or only the primary sheet?
+
+core.StyleSheet = cssom.StyleSheet;
+core.MediaList = cssom.MediaList;
+core.CSSStyleSheet = cssom.CSSStyleSheet;
+core.CSSRule = cssom.CSSRule;
+core.CSSStyleRule = cssom.CSSStyleRule;
+core.CSSMediaRule = cssom.CSSMediaRule;
+core.CSSImportRule = cssom.CSSImportRule;
+core.CSSStyleDeclaration = cssstyle.CSSStyleDeclaration;
+
+// Relavant specs
+// http://www.w3.org/TR/DOM-Level-2-Style (2000)
+// http://www.w3.org/TR/cssom-view/ (2008)
+// http://dev.w3.org/csswg/cssom/ (2010) Meant to replace DOM Level 2 Style
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/ HTML5, of course
+// http://dev.w3.org/csswg/css-style-attr/  not sure what's new here
+
+// Objects that aren't in cssom library but should be:
+//   CSSRuleList  (cssom just uses array)
+//   CSSFontFaceRule
+//   CSSPageRule
+
+// These rules don't really make sense to implement, so CSSOM draft makes them
+// obsolete.
+//   CSSCharsetRule
+//   CSSUnknownRule
+
+// These objects are considered obsolete by CSSOM draft, although modern
+// browsers implement them.
+//   CSSValue
+//   CSSPrimitiveValue
+//   CSSValueList
+//   RGBColor
+//   Rect
+//   Counter
+
+// StyleSheetList -
+// http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-StyleSheetList
+// added a push method to help manage the length
+core.StyleSheetList = function() {
+  this._length = 0;
+};
+core.StyleSheetList.prototype = {
+  item: function (i) {
+    return this[i];
+  },
+  push: function (sheet) {
+    this[this._length] = sheet;
+    this._length++;
+  },
+  get length() {
+    return this._length;
+  }
+};
+
+core.Document.prototype.__defineGetter__('styleSheets', function() {
+  if (!this._styleSheets) {
+    this._styleSheets = new core.StyleSheetList();
+  }
+  // TODO: each style and link element should register its sheet on creation
+  // nad remove it on removal.
+  return this._styleSheets;
+});
+
+
+/**
+ * @this {html.HTMLLinkElement|html.HTMLStyleElement}
+ * @param {string} url
+ * @param {cssom.CSSStyleSheet} sheet
+ * @see http://dev.w3.org/csswg/cssom/#requirements-on-user-agents-implementing0
+ */
+function fetchStylesheet(url, sheet) {
+  html.resourceLoader.load(this, url, function(data, filename) {
+    // TODO: abort if the content-type is not text/css, and the document is
+    // in strict mode
+    sheet.href = html.resourceLoader.resolve(this.ownerDocument, url);
+    evaluateStylesheet.call(this, data, sheet, url);
+  });
+}
+/**
+ * @this {html.HTMLLinkElement|html.HTMLStyleElement}
+ * @param {string} data
+ * @param {cssom.CSSStyleSheet} sheet
+ * @param {string} baseUrl
+ */
+function evaluateStylesheet(data, sheet, baseUrl) {
+  // this is the element
+  var newStyleSheet = cssom.parse(data);
+  var spliceArgs = newStyleSheet.cssRules;
+  spliceArgs.unshift(0, sheet.cssRules.length);
+  Array.prototype.splice.apply(sheet.cssRules, spliceArgs);
+  scanForImportRules.call(this, sheet.cssRules, baseUrl);
+  this.ownerDocument.styleSheets.push(sheet);
+}
+/**
+ * @this {html.HTMLLinkElement|html.HTMLStyleElement}
+ * @param {cssom.CSSStyleSheet} sheet
+ * @param {string} baseUrl
+ */
+function scanForImportRules(cssRules, baseUrl) {
+  if (!cssRules) return;
+  for (var i = 0; i < cssRules.length; ++i) {
+    if (cssRules[i].cssRules) {
+      // @media rule: keep searching inside it.
+      scanForImportRules.call(this, cssRules[i].cssRules, baseUrl);
+    } else if (cssRules[i].href) {
+      // @import rule: fetch the resource and evaluate it.
+      // See http://dev.w3.org/csswg/cssom/#css-import-rule
+      //     If loading of the style sheet fails its cssRules list is simply
+      //     empty. I.e. an @import rule always has an associated style sheet.
+      fetchStylesheet.call(this, cssRules[i].href, this.sheet);
+    }
+  }
+}
+
+/**
+ * @param {string} data
+ * @param {cssstyle.CSSStyleDeclaration} style
+ */
+function evaluateStyleAttribute(data) {
+  // this is the element.
+
+}
+
+/**
+ * Subclass of core.Attr that reflects the current cssText.
+ */
+function StyleAttr(node, value) {
+  this._node = node;
+  core.Attr.call(this, node.ownerDocument, 'style');
+  if (!this._node._ignoreValueOfStyleAttr) {
+    this.nodeValue = value;
+  }
+}
+StyleAttr.prototype = {
+  get nodeValue() {
+    if (typeof this._node._style === 'string') {
+      return this._node._style;
+    } else {
+      return this._node.style.cssText;
+    }
+  },
+  set nodeValue(value) {
+    this._node._style = value;
+  }
+};
+StyleAttr.prototype.__proto__ = core.Attr.prototype;
+
+/**
+ * Overwrite core.AttrNodeMap#setNamedItem to create a StyleAttr instance
+ * instead of a core.Attr if the name equals 'style'.
+ */
+utils.intercept(core.AttrNodeMap, 'setNamedItem', function(_super, args, attr) {
+  if (attr.name == 'style') {
+    attr = new StyleAttr(this._parentNode, attr.nodeValue);
+  }
+  return _super.call(this, attr);
+});
+
+/**
+ * Lazily create a CSSStyleDeclaration.
+ */
+html.HTMLElement.prototype.__defineGetter__('style', function() {
+  if (typeof this._style === 'string') {
+    // currently, cssom's parse doesn't really work if you pass in
+    // {state: 'name'}, so instead we just build a dummy sheet.
+    var styleSheet = cssom.parse('dummy{' + this._style + '}');
+    this._style = new cssstyle.CSSStyleDeclaration();
+    if (styleSheet.cssRules.length > 0 && styleSheet.cssRules[0].style) {
+      var newStyle = styleSheet.cssRules[0].style;
+      for (var i = 0; i < newStyle.length; ++i) {
+        var prop = newStyle[i];
+        this._style.setProperty(
+            prop,
+            newStyle.getPropertyValue(prop),
+            newStyle.getPropertyPriority(prop));
+      }
+    }
+  }
+  if (!this._style) {
+    this._style = new cssstyle.CSSStyleDeclaration();
+
+  }
+  if (!this.getAttributeNode('style')) {
+    // Tell the StyleAttr constructor to not overwrite this._style
+    this._ignoreValueOfStyleAttr = true;
+    this.setAttribute('style');
+    this._ignoreValueOfStyleAttr = false;
+  }
+  return this._style;
+});
+
+assert.equal(undefined, html.HTMLLinkElement._init);
+html.HTMLLinkElement._init = function() {
+  this.addEventListener('DOMNodeInsertedIntoDocument', function() {
+    if (!/(?:[ \t\n\r\f]|^)stylesheet(?:[ \t\n\r\f]|$)/i.test(this.rel)) {
+      // rel is a space-separated list of tokens, and the original rel types
+      // are case-insensitive.
+      return;
+    }
+    if (this.href) {
+      fetchStylesheet.call(this, this.href, this.sheet);
+    }
+  });
+  this.addEventListener('DOMNodeRemovedFromDocument', function() {
+  });
+};
+/**
+ * @this {HTMLStyleElement|HTMLLinkElement}
+ */
+var getOrCreateSheet = function() {
+  if (!this._cssStyleSheet) {
+    this._cssStyleSheet = new cssom.CSSStyleSheet();
+  }
+  return this._cssStyleSheet;
+};
+html.HTMLLinkElement.prototype.__defineGetter__('sheet', getOrCreateSheet);
+
+assert.equal(undefined, html.HTMLStyleElement._init);
+html.HTMLStyleElement._init = function() {
+  //console.log('init style')
+  this.addEventListener('DOMNodeInsertedIntoDocument', function() {
+    //console.log('style inserted')
+    //console.log('sheet: ', this.sheet);
+    if (this.type && this.type !== 'text/css') {
+      //console.log('bad type: ' + this.type)
+      return;
+    }
+    var content = '';
+    Array.prototype.forEach.call(this.childNodes, function (child) {
+      if (child.nodeType === child.TEXT_NODE) { // text node
+        content += child.nodeValue;
+      }
+    });
+    evaluateStylesheet.call(this, content, this.sheet, this._ownerDocument.URL);
+  });
+};
+html.HTMLStyleElement.prototype.__defineGetter__('sheet', getOrCreateSheet);
+
+exports.dom = {
+  level2 : {
+    html : html,
+    core : core
+  }
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level3/core.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level3/core.js
new file mode 100644
index 0000000..c9221e7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level3/core.js
@@ -0,0 +1,658 @@
+var core          = require("../level2/core").dom.level2.core,
+    HtmlToDom     = require('../browser/htmltodom').HtmlToDom,
+    domToHtml     = require('../browser/domtohtml').domToHtml,
+    htmlencoding  = require('../browser/htmlencoding'),
+    HTMLEncode    = htmlencoding.HTMLEncode,
+    HTMLDecode    = htmlencoding.HTMLDecode;
+
+// modify cloned instance for more info check: https://github.com/tmpvar/jsdom/issues/325
+core = Object.create(core);
+
+/*
+  valuetype DOMString sequence<unsigned short>;
+  typedef   unsigned long long DOMTimeStamp;
+  typedef   any DOMUserData;
+  typedef   Object DOMObject;
+
+*/
+// ExceptionCode
+core.VALIDATION_ERR                 = 16;
+core.TYPE_MISMATCH_ERR              = 17;
+
+/*
+  // Introduced in DOM Level 3:
+  interface NameList {
+    DOMString          getName(in unsigned long index);
+    DOMString          getNamespaceURI(in unsigned long index);
+    readonly attribute unsigned long   length;
+    boolean            contains(in DOMString str);
+    boolean            containsNS(in DOMString namespaceURI,
+                                  in DOMString name);
+  };
+
+  // Introduced in DOM Level 3:
+  interface DOMImplementationList {
+    DOMImplementation  item(in unsigned long index);
+    readonly attribute unsigned long   length;
+  };
+
+  // Introduced in DOM Level 3:
+  interface DOMImplementationSource {
+    DOMImplementation  getDOMImplementation(in DOMString features);
+    DOMImplementationList getDOMImplementationList(in DOMString features);
+  };
+*/
+
+
+core.DOMImplementation.prototype.getFeature = function(feature, version)  {
+
+};
+
+/*
+  interface Node {
+    // Modified in DOM Level 3:
+    Node               insertBefore(in Node newChild,
+                                    in Node refChild)
+                                        raises(DOMException);
+    // Modified in DOM Level 3:
+    Node               replaceChild(in Node newChild,
+                                    in Node oldChild)
+                                        raises(DOMException);
+    // Modified in DOM Level 3:
+    Node               removeChild(in Node oldChild)
+                                        raises(DOMException);
+    // Modified in DOM Level 3:
+    Node               appendChild(in Node newChild)
+                                        raises(DOMException);
+    boolean            hasChildNodes();
+    Node               cloneNode(in boolean deep);
+    // Modified in DOM Level 3:
+    void               normalize();
+    // Introduced in DOM Level 3:
+    readonly attribute DOMString       baseURI;
+*/
+
+// Compare Document Position
+var DOCUMENT_POSITION_DISCONNECTED = core.Node.prototype.DOCUMENT_POSITION_DISCONNECTED = 0x01;
+var DOCUMENT_POSITION_PRECEDING    = core.Node.prototype.DOCUMENT_POSITION_PRECEDING    = 0x02;
+var DOCUMENT_POSITION_FOLLOWING    = core.Node.prototype.DOCUMENT_POSITION_FOLLOWING    = 0x04;
+var DOCUMENT_POSITION_CONTAINS     = core.Node.prototype.DOCUMENT_POSITION_CONTAINS     = 0x08;
+var DOCUMENT_POSITION_CONTAINED_BY = core.Node.prototype.DOCUMENT_POSITION_CONTAINED_BY = 0x10;
+var DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = core.Node.prototype.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;
+var DOCUMENT_TYPE_NODE = core.Node.prototype.DOCUMENT_TYPE_NODE;
+
+core.Node.prototype.compareDocumentPosition = function compareDocumentPosition( otherNode ) {
+  if( !(otherNode instanceof core.Node) ) {
+    throw Error("Comparing position against non-Node values is not allowed")
+  }
+  var thisOwner, otherOwner;
+
+  if( this.nodeType === this.DOCUMENT_NODE)
+    thisOwner = this
+  else
+    thisOwner = this.ownerDocument
+
+  if( otherNode.nodeType === this.DOCUMENT_NODE)
+    otherOwner = otherNode
+  else
+    otherOwner = otherNode.ownerDocument
+
+  if( this === otherNode ) return 0
+  if( this === otherNode.ownerDocument ) return DOCUMENT_POSITION_FOLLOWING + DOCUMENT_POSITION_CONTAINED_BY
+  if( this.ownerDocument === otherNode ) return DOCUMENT_POSITION_PRECEDING + DOCUMENT_POSITION_CONTAINS
+  if( thisOwner !== otherOwner ) return DOCUMENT_POSITION_DISCONNECTED
+
+  // Text nodes for attributes does not have a _parentNode. So we need to find them as attribute child.
+  if( this.nodeType === this.ATTRIBUTE_NODE && this._childNodes && this._childNodes._toArray().indexOf(otherNode) !== -1)
+    return DOCUMENT_POSITION_FOLLOWING + DOCUMENT_POSITION_CONTAINED_BY
+
+  if( otherNode.nodeType === this.ATTRIBUTE_NODE && otherNode._childNodes && otherNode._childNodes._toArray().indexOf(this) !== -1)
+    return DOCUMENT_POSITION_PRECEDING + DOCUMENT_POSITION_CONTAINS
+
+  var point = this
+  var parents = [ ]
+  var previous = null
+  while( point ) {
+    if( point == otherNode ) return DOCUMENT_POSITION_PRECEDING + DOCUMENT_POSITION_CONTAINS
+    parents.push( point )
+    point = point._parentNode
+  }
+  point = otherNode
+  previous = null
+  while( point ) {
+    if( point == this ) return DOCUMENT_POSITION_FOLLOWING + DOCUMENT_POSITION_CONTAINED_BY
+    var location_index = parents.indexOf( point )
+    if( location_index !== -1) {
+     var smallest_common_ancestor = parents[ location_index ]
+     var this_index = smallest_common_ancestor._childNodes._toArray().indexOf( parents[location_index - 1] )
+     var other_index = smallest_common_ancestor._childNodes._toArray().indexOf( previous )
+     if( this_index > other_index ) {
+           return DOCUMENT_POSITION_PRECEDING
+     }
+     else {
+       return DOCUMENT_POSITION_FOLLOWING
+     }
+    }
+    previous = point
+    point = point._parentNode
+  }
+  return DOCUMENT_POSITION_DISCONNECTED
+};
+/*
+    // Introduced in DOM Level 3:
+             attribute DOMString       textContent;
+                                        // raises(DOMException) on setting
+                                        // raises(DOMException) on retrieval
+*/
+core.Node.prototype.isSameNode = function(other) {
+  return (other === this);
+};
+
+// @see http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html#Node3-textContent
+core.Node.prototype.__defineGetter__('textContent', function() {
+  switch (this.nodeType) {
+    case this.COMMENT_NODE:
+    case this.CDATA_SECTION_NODE:
+    case this.PROCESSING_INSTRUCTION_NODE:
+    case this.TEXT_NODE:
+      return this.nodeValue;
+
+    case this.ATTRIBUTE_NODE:
+    case this.DOCUMENT_FRAGMENT_NODE:
+    case this.ELEMENT_NODE:
+    case this.ENTITY_NODE:
+    case this.ENTITY_REFERENCE_NODE:
+      var out = '';
+      for (var i = 0 ; i < this.childNodes.length ; ++i) {
+        if (this.childNodes[i].nodeType !== this.COMMENT_NODE &&
+            this.childNodes[i].nodeType !== this.PROCESSING_INSTRUCTION_NODE) {
+          out += this.childNodes[i].textContent || '';
+        }
+      }
+      return out;
+
+    default:
+      return null;
+  }
+});
+
+core.Node.prototype.__defineSetter__('textContent', function(txt) {
+  for (var i = this.childNodes.length; --i >=0;) {
+    this.removeChild(this.childNodes.item(i));
+  }
+  if (txt !== "" && txt != null) {
+    this.appendChild(this._ownerDocument.createTextNode(txt));
+  }
+  return txt;
+});
+
+/*
+    // Introduced in DOM Level 3:
+    DOMString          lookupPrefix(in DOMString namespaceURI);
+    // Introduced in DOM Level 3:
+    boolean            isDefaultNamespace(in DOMString namespaceURI);
+    // Introduced in DOM Level 3:
+    DOMString          lookupNamespaceURI(in DOMString prefix);
+*/
+// Introduced in DOM Level 3:
+core.Node.prototype.isEqualNode = function(other) {
+  var self = this;
+  var diffValues = function() {
+    for (var i=0;i<arguments.length;i++) {
+      var k = arguments[i];
+      if (self[k] != other[k]) return(true);
+    }
+    return(false);
+  };
+  var diffNamedNodeMaps = function(snnm, onnm) {
+    if ((snnm == null) && (onnm == null)) return(false);
+    if ((snnm == null) || (onnm == null)) return(true);
+    if (snnm.length != onnm.length) return(true);
+    var js = [];
+    for (var j=0;j<onnm.length;j++) { js[j] = j }
+    for (var i=0;i<snnm.length;i++) {
+      var found=false;
+      for (var j=0;j<js.length;j++) {
+        if (snnm.item(i).isEqualNode(onnm.item(js[j]))) {
+          found = true;
+          // in order to be 100% accurate, we remove index values from consideration once they've matched
+          js.splice(j,1);
+          break;
+        }
+      }
+      if (!found) return(true);
+    }
+    return(false);
+  };
+  var diffNodeLists = function(snl, onl) {
+    if ((snl == null) && (onl == null)) return(false);
+    if ((snl == null) || (onl == null)) return(true);
+    if (snl.length != onl.length) return(true);
+    for (var i=0;i<snl.length;i++) {
+      if (!snl.item(i).isEqualNode(onl.item(i))) return(true);
+    }
+    return(false);
+  };
+  if (!other) return(false);
+  if (this.isSameNode(other)) return(true);
+  if (this.nodeType != other.nodeType) return(false);
+  if (diffValues('nodeName', 'localName', 'namespaceURI', 'prefix', 'nodeValue')) return(false);
+  if (diffNamedNodeMaps(this.attributes, other.attributes)) return(false);
+  if (diffNodeLists(this.childNodes, other.childNodes)) return(false);
+  if (this.nodeType == DOCUMENT_TYPE_NODE) {
+    if (diffValues('publicId', 'systemId', 'internalSubset')) return(false);
+    if (diffNamedNodeMaps(this.entities, other.entities)) return(false);
+    if (diffNamedNodeMaps(this.notations, other.notations)) return(false);
+  }
+  return (true);
+};
+/*
+    // Introduced in DOM Level 3:
+    DOMObject          getFeature(in DOMString feature,
+                                  in DOMString version);
+*/
+// Introduced in DOM Level 3:
+core.Node.prototype.setUserData = function(key, data, handler) {
+  var r = this[key] || null;
+  this[key] = data;
+  return(r);
+};
+
+// Introduced in DOM Level 3:
+core.Node.prototype.getUserData = function(key) {
+  var r = this[key] || null;
+  return(r);
+};
+/*
+  interface NodeList {
+    Node               item(in unsigned long index);
+    readonly attribute unsigned long   length;
+  };
+
+  interface NamedNodeMap {
+    Node               getNamedItem(in DOMString name);
+    Node               setNamedItem(in Node arg)
+                                        raises(DOMException);
+    Node               removeNamedItem(in DOMString name)
+                                        raises(DOMException);
+    Node               item(in unsigned long index);
+    readonly attribute unsigned long   length;
+    // Introduced in DOM Level 2:
+    Node               getNamedItemNS(in DOMString namespaceURI,
+                                      in DOMString localName)
+                                        raises(DOMException);
+    // Introduced in DOM Level 2:
+    Node               setNamedItemNS(in Node arg)
+                                        raises(DOMException);
+    // Introduced in DOM Level 2:
+    Node               removeNamedItemNS(in DOMString namespaceURI,
+                                         in DOMString localName)
+                                        raises(DOMException);
+  };
+
+  interface CharacterData : Node {
+             attribute DOMString       data;
+                                        // raises(DOMException) on setting
+                                        // raises(DOMException) on retrieval
+
+    readonly attribute unsigned long   length;
+    DOMString          substringData(in unsigned long offset,
+                                     in unsigned long count)
+                                        raises(DOMException);
+    void               appendData(in DOMString arg)
+                                        raises(DOMException);
+    void               insertData(in unsigned long offset,
+                                  in DOMString arg)
+                                        raises(DOMException);
+    void               deleteData(in unsigned long offset,
+                                  in unsigned long count)
+                                        raises(DOMException);
+    void               replaceData(in unsigned long offset,
+                                   in unsigned long count,
+                                   in DOMString arg)
+                                        raises(DOMException);
+  };
+
+  interface Attr : Node {
+    readonly attribute DOMString       name;
+    readonly attribute boolean         specified;
+             attribute DOMString       value;
+                                        // raises(DOMException) on setting
+
+    // Introduced in DOM Level 2:
+    readonly attribute Element         ownerElement;
+    // Introduced in DOM Level 3:
+    readonly attribute TypeInfo        schemaTypeInfo;
+
+*/
+    // Introduced in DOM Level 3:
+core.Attr.prototype.__defineGetter__('isId', function() {
+  return (this.name.toLowerCase() === 'id');
+});
+/*
+  };
+
+  interface Element : Node {
+    readonly attribute DOMString       tagName;
+    DOMString          getAttribute(in DOMString name);
+    void               setAttribute(in DOMString name,
+                                    in DOMString value)
+                                        raises(DOMException);
+    void               removeAttribute(in DOMString name)
+                                        raises(DOMException);
+    Attr               getAttributeNode(in DOMString name);
+    Attr               setAttributeNode(in Attr newAttr)
+                                        raises(DOMException);
+    Attr               removeAttributeNode(in Attr oldAttr)
+                                        raises(DOMException);
+    NodeList           getElementsByTagName(in DOMString name);
+    // Introduced in DOM Level 2:
+    DOMString          getAttributeNS(in DOMString namespaceURI,
+                                      in DOMString localName)
+                                        raises(DOMException);
+    // Introduced in DOM Level 2:
+    void               setAttributeNS(in DOMString namespaceURI,
+                                      in DOMString qualifiedName,
+                                      in DOMString value)
+                                        raises(DOMException);
+    // Introduced in DOM Level 2:
+    void               removeAttributeNS(in DOMString namespaceURI,
+                                         in DOMString localName)
+                                        raises(DOMException);
+    // Introduced in DOM Level 2:
+    Attr               getAttributeNodeNS(in DOMString namespaceURI,
+                                          in DOMString localName)
+                                        raises(DOMException);
+    // Introduced in DOM Level 2:
+    Attr               setAttributeNodeNS(in Attr newAttr)
+                                        raises(DOMException);
+    // Introduced in DOM Level 2:
+    NodeList           getElementsByTagNameNS(in DOMString namespaceURI,
+                                              in DOMString localName)
+                                        raises(DOMException);
+    // Introduced in DOM Level 2:
+    boolean            hasAttribute(in DOMString name);
+    // Introduced in DOM Level 2:
+    boolean            hasAttributeNS(in DOMString namespaceURI,
+                                      in DOMString localName)
+                                        raises(DOMException);
+    // Introduced in DOM Level 3:
+    readonly attribute TypeInfo        schemaTypeInfo;
+    // Introduced in DOM Level 3:
+    void               setIdAttribute(in DOMString name,
+                                      in boolean isId)
+                                        raises(DOMException);
+    // Introduced in DOM Level 3:
+    void               setIdAttributeNS(in DOMString namespaceURI,
+                                        in DOMString localName,
+                                        in boolean isId)
+                                        raises(DOMException);
+    // Introduced in DOM Level 3:
+    void               setIdAttributeNode(in Attr idAttr,
+                                          in boolean isId)
+                                        raises(DOMException);
+  };
+
+  interface Text : CharacterData {
+    Text               splitText(in unsigned long offset)
+                                        raises(DOMException);
+    // Introduced in DOM Level 3:
+    readonly attribute boolean         isElementContentWhitespace;
+    // Introduced in DOM Level 3:
+    readonly attribute DOMString       wholeText;
+    // Introduced in DOM Level 3:
+    Text               replaceWholeText(in DOMString content)
+                                        raises(DOMException);
+  };
+
+  interface Comment : CharacterData {
+  };
+
+  // Introduced in DOM Level 3:
+  interface TypeInfo {
+    readonly attribute DOMString       typeName;
+    readonly attribute DOMString       typeNamespace;
+
+    // DerivationMethods
+    const unsigned long       DERIVATION_RESTRICTION         = 0x00000001;
+    const unsigned long       DERIVATION_EXTENSION           = 0x00000002;
+    const unsigned long       DERIVATION_UNION               = 0x00000004;
+    const unsigned long       DERIVATION_LIST                = 0x00000008;
+
+    boolean            isDerivedFrom(in DOMString typeNamespaceArg,
+                                     in DOMString typeNameArg,
+                                     in unsigned long derivationMethod);
+  };
+*/
+// Introduced in DOM Level 3:
+core.UserDataHandler = function() {};
+core.UserDataHandler.prototype.NODE_CLONED   = 1;
+core.UserDataHandler.prototype.NODE_IMPORTED = 2;
+core.UserDataHandler.prototype.NODE_DELETED  = 3;
+core.UserDataHandler.prototype.NODE_RENAMED  = 4;
+core.UserDataHandler.prototype.NODE_ADOPTED  = 5;
+core.UserDataHandler.prototype.handle = function(operation, key, data, src, dst) {};
+
+// Introduced in DOM Level 3:
+core.DOMError = function(severity, message, type, relatedException, relatedData, location) {
+  this._severity         = severity;
+  this._message          = message;
+  this._type             = type;
+  this._relatedException = relatedException;
+  this._relatedData      = relatedData;
+  this._location         = location;
+};
+core.DOMError.prototype = {};
+core.DOMError.prototype.SEVERITY_WARNING     = 1;
+core.DOMError.prototype.SEVERITY_ERROR       = 2;
+core.DOMError.prototype.SEVERITY_FATAL_ERROR = 3;
+core.DOMError.prototype.__defineGetter__('severity', function() {
+  return this._severity;
+});
+core.DOMError.prototype.__defineGetter__('message', function() {
+  return this._message;
+});
+core.DOMError.prototype.__defineGetter__('type', function() {
+  return this._type;
+});
+core.DOMError.prototype.__defineGetter__('relatedException', function() {
+  return this._relatedException;
+});
+core.DOMError.prototype.__defineGetter__('relatedData', function() {
+  return this._relatedData;
+});
+core.DOMError.prototype.__defineGetter__('location', function() {
+  return this._location;
+});
+
+/*
+  // Introduced in DOM Level 3:
+  interface DOMErrorHandler {
+    boolean            handleError(in DOMError error);
+  };
+
+  // Introduced in DOM Level 3:
+  interface DOMLocator {
+    readonly attribute long            lineNumber;
+    readonly attribute long            columnNumber;
+    readonly attribute long            byteOffset;
+    readonly attribute long            utf16Offset;
+    readonly attribute Node            relatedNode;
+    readonly attribute DOMString       uri;
+  };
+*/
+
+// Introduced in DOM Level 3:
+core.DOMConfiguration = function(){
+  var possibleParameterNames = {
+    'canonical-form': [false, true], // extra rules for true
+    'cdata-sections': [true, false],
+    'check-character-normalization': [false, true],
+    'comments': [true, false],
+    'datatype-normalization': [false, true],
+    'element-content-whitespace': [true, false],
+    'entities': [true, false],
+    // 'error-handler': [],
+    'infoset': [undefined, true, false], // extra rules for true
+    'namespaces': [true, false],
+    'namespace-declarations': [true, false], // only checked if namespaces is true
+    'normalize-characters': [false, true],
+    // 'schema-location': [],
+    // 'schema-type': [],
+    'split-cdata-sections': [true, false],
+    'validate': [false, true],
+    'validate-if-schema': [false, true],
+    'well-formed': [true, false]
+  }
+};
+
+core.DOMConfiguration.prototype = {
+  setParameter: function(name, value) {},
+  getParameter: function(name) {},
+  canSetParameter: function(name, value) {},
+  parameterNames: function() {}
+};
+
+//core.Document.prototype._domConfig = new core.DOMConfiguration();
+core.Document.prototype.__defineGetter__('domConfig', function() {
+  return this._domConfig || new core.DOMConfiguration();;
+});
+
+// Introduced in DOM Level 3:
+core.DOMStringList = function() {};
+
+core.DOMStringList.prototype = {
+  item: function() {},
+  length: function() {},
+  contains: function() {}
+};
+
+
+/*
+  interface CDATASection : Text {
+  };
+
+  interface DocumentType : Node {
+    readonly attribute DOMString       name;
+    readonly attribute NamedNodeMap    entities;
+    readonly attribute NamedNodeMap    notations;
+    // Introduced in DOM Level 2:
+    readonly attribute DOMString       publicId;
+    // Introduced in DOM Level 2:
+    readonly attribute DOMString       systemId;
+    // Introduced in DOM Level 2:
+    readonly attribute DOMString       internalSubset;
+  };
+
+  interface Notation : Node {
+    readonly attribute DOMString       publicId;
+    readonly attribute DOMString       systemId;
+  };
+
+  interface Entity : Node {
+    readonly attribute DOMString       publicId;
+    readonly attribute DOMString       systemId;
+    readonly attribute DOMString       notationName;
+    // Introduced in DOM Level 3:
+    readonly attribute DOMString       inputEncoding;
+    // Introduced in DOM Level 3:
+    readonly attribute DOMString       xmlEncoding;
+    // Introduced in DOM Level 3:
+    readonly attribute DOMString       xmlVersion;
+  };
+
+  interface EntityReference : Node {
+  };
+
+  interface ProcessingInstruction : Node {
+    readonly attribute DOMString       target;
+             attribute DOMString       data;
+                                        // raises(DOMException) on setting
+
+  };
+
+  interface DocumentFragment : Node {
+  };
+
+  interface Document : Node {
+    // Modified in DOM Level 3:
+    readonly attribute DocumentType    doctype;
+    readonly attribute DOMImplementation implementation;
+    readonly attribute Element         documentElement;
+    Element            createElement(in DOMString tagName)
+                                        raises(DOMException);
+    DocumentFragment   createDocumentFragment();
+    Text               createTextNode(in DOMString data);
+    Comment            createComment(in DOMString data);
+    CDATASection       createCDATASection(in DOMString data)
+                                        raises(DOMException);
+    ProcessingInstruction createProcessingInstruction(in DOMString target,
+                                                      in DOMString data)
+                                        raises(DOMException);
+    Attr               createAttribute(in DOMString name)
+                                        raises(DOMException);
+    EntityReference    createEntityReference(in DOMString name)
+                                        raises(DOMException);
+    NodeList           getElementsByTagName(in DOMString tagname);
+    // Introduced in DOM Level 2:
+    Node               importNode(in Node importedNode,
+                                  in boolean deep)
+                                        raises(DOMException);
+    // Introduced in DOM Level 2:
+    Element            createElementNS(in DOMString namespaceURI,
+                                       in DOMString qualifiedName)
+                                        raises(DOMException);
+    // Introduced in DOM Level 2:
+    Attr               createAttributeNS(in DOMString namespaceURI,
+                                         in DOMString qualifiedName)
+                                        raises(DOMException);
+    // Introduced in DOM Level 2:
+    NodeList           getElementsByTagNameNS(in DOMString namespaceURI,
+                                              in DOMString localName);
+    // Introduced in DOM Level 2:
+    Element            getElementById(in DOMString elementId);
+*/
+
+// Introduced in DOM Level 3:
+core.Document.prototype._inputEncoding = null;
+core.Document.prototype.__defineGetter__('inputEncoding', function() {
+  return this._inputEncoding;
+});
+/*
+    // Introduced in DOM Level 3:
+    readonly attribute DOMString       xmlEncoding;
+    // Introduced in DOM Level 3:
+             attribute boolean         xmlStandalone;
+                                        // raises(DOMException) on setting
+
+    // Introduced in DOM Level 3:
+             attribute DOMString       xmlVersion;
+                                        // raises(DOMException) on setting
+
+    // Introduced in DOM Level 3:
+             attribute boolean         strictErrorChecking;
+    // Introduced in DOM Level 3:
+             attribute DOMString       documentURI;
+    // Introduced in DOM Level 3:
+    Node               adoptNode(in Node source)
+                                        raises(DOMException);
+    // Introduced in DOM Level 3:
+    readonly attribute DOMConfiguration domConfig;
+    // Introduced in DOM Level 3:
+    void               normalizeDocument();
+    // Introduced in DOM Level 3:
+    Node               renameNode(in Node n,
+                                  in DOMString namespaceURI,
+                                  in DOMString qualifiedName)
+                                        raises(DOMException);
+  };
+};
+
+#endif // _DOM_IDL_
+*/
+
+exports.dom = {
+  level3 : {
+    core: core
+  }
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level3/events.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level3/events.js
new file mode 100644
index 0000000..6dcb87d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level3/events.js
@@ -0,0 +1,299 @@
+var events = require("../level2/events").dom.level2.events;
+
+// modify cloned instance for more info check: https://github.com/tmpvar/jsdom/issues/325
+events = Object.create(events);
+
+/*
+
+// File: events.idl
+
+#ifndef _EVENTS_IDL_
+#define _EVENTS_IDL_
+
+#include "dom.idl"
+#include "views.idl"
+
+#pragma prefix "dom.w3c.org"
+module events
+{
+
+  typedef dom::DOMString DOMString;
+  typedef dom::DOMTimeStamp DOMTimeStamp;
+  typedef dom::DOMObject DOMObject;
+  typedef dom::Node Node;
+
+  interface EventTarget;
+  interface EventListener;
+
+  // Introduced in DOM Level 2:
+  exception EventException {
+    unsigned short   code;
+  };
+  // EventExceptionCode
+  const unsigned short      UNSPECIFIED_EVENT_TYPE_ERR     = 0;
+  // Introduced in DOM Level 3:
+  const unsigned short      DISPATCH_REQUEST_ERR           = 1;
+
+
+  // Introduced in DOM Level 2:
+  interface Event {
+
+    // PhaseType
+    const unsigned short      CAPTURING_PHASE                = 1;
+    const unsigned short      AT_TARGET                      = 2;
+    const unsigned short      BUBBLING_PHASE                 = 3;
+
+    readonly attribute DOMString       type;
+    readonly attribute EventTarget     target;
+    readonly attribute EventTarget     currentTarget;
+    readonly attribute unsigned short  eventPhase;
+    readonly attribute boolean         bubbles;
+    readonly attribute boolean         cancelable;
+    readonly attribute DOMTimeStamp    timeStamp;
+    void               stopPropagation();
+    void               preventDefault();
+    void               initEvent(in DOMString eventTypeArg,
+                                 in boolean canBubbleArg,
+                                 in boolean cancelableArg);
+    // Introduced in DOM Level 3:
+    readonly attribute DOMString       namespaceURI;
+    // Introduced in DOM Level 3:
+    boolean            isCustom();
+    // Introduced in DOM Level 3:
+    void               stopImmediatePropagation();
+    // Introduced in DOM Level 3:
+    boolean            isDefaultPrevented();
+    // Introduced in DOM Level 3:
+    void               initEventNS(in DOMString namespaceURIArg,
+                                   in DOMString eventTypeArg,
+                                   in boolean canBubbleArg,
+                                   in boolean cancelableArg);
+  };
+
+  // Introduced in DOM Level 2:
+  interface EventTarget {
+    void               addEventListener(in DOMString type,
+                                        in EventListener listener,
+                                        in boolean useCapture);
+    void               removeEventListener(in DOMString type,
+                                           in EventListener listener,
+                                           in boolean useCapture);
+    // Modified in DOM Level 3:
+    boolean            dispatchEvent(in Event evt)
+                                        raises(EventException);
+    // Introduced in DOM Level 3:
+    void               addEventListenerNS(in DOMString namespaceURI,
+                                          in DOMString type,
+                                          in EventListener listener,
+                                          in boolean useCapture,
+                                          in DOMObject evtGroup);
+    // Introduced in DOM Level 3:
+    void               removeEventListenerNS(in DOMString namespaceURI,
+                                             in DOMString type,
+                                             in EventListener listener,
+                                             in boolean useCapture);
+    // Introduced in DOM Level 3:
+    boolean            willTriggerNS(in DOMString namespaceURI,
+                                     in DOMString type);
+    // Introduced in DOM Level 3:
+    boolean            hasEventListenerNS(in DOMString namespaceURI,
+                                          in DOMString type);
+  };
+
+  // Introduced in DOM Level 2:
+  interface EventListener {
+    void               handleEvent(in Event evt);
+  };
+
+  // Introduced in DOM Level 2:
+  interface DocumentEvent {
+    Event              createEvent(in DOMString eventType)
+                                        raises(dom::DOMException);
+    // Introduced in DOM Level 3:
+    boolean            canDispatch(in DOMString namespaceURI,
+                                   in DOMString type);
+  };
+
+  // Introduced in DOM Level 3:
+  interface CustomEvent : Event {
+    void               setDispatchState(in EventTarget target,
+                                        in unsigned short phase);
+    boolean            isPropagationStopped();
+    boolean            isImmediatePropagationStopped();
+  };
+
+  // Introduced in DOM Level 2:
+  interface UIEvent : Event {
+    readonly attribute views::AbstractView view;
+    readonly attribute long            detail;
+    void               initUIEvent(in DOMString typeArg,
+                                   in boolean canBubbleArg,
+                                   in boolean cancelableArg,
+                                   in views::AbstractView viewArg,
+                                   in long detailArg);
+    // Introduced in DOM Level 3:
+    void               initUIEventNS(in DOMString namespaceURI,
+                                     in DOMString typeArg,
+                                     in boolean canBubbleArg,
+                                     in boolean cancelableArg,
+                                     in views::AbstractView viewArg,
+                                     in long detailArg);
+  };
+
+  // Introduced in DOM Level 3:
+  interface TextEvent : UIEvent {
+    readonly attribute DOMString       data;
+    void               initTextEvent(in DOMString typeArg,
+                                     in boolean canBubbleArg,
+                                     in boolean cancelableArg,
+                                     in views::AbstractView viewArg,
+                                     in DOMString dataArg);
+    void               initTextEventNS(in DOMString namespaceURI,
+                                       in DOMString type,
+                                       in boolean canBubbleArg,
+                                       in boolean cancelableArg,
+                                       in views::AbstractView viewArg,
+                                       in DOMString dataArg);
+  };
+
+  // Introduced in DOM Level 2:
+  interface MouseEvent : UIEvent {
+    readonly attribute long            screenX;
+    readonly attribute long            screenY;
+    readonly attribute long            clientX;
+    readonly attribute long            clientY;
+    readonly attribute boolean         ctrlKey;
+    readonly attribute boolean         shiftKey;
+    readonly attribute boolean         altKey;
+    readonly attribute boolean         metaKey;
+    readonly attribute unsigned short  button;
+    readonly attribute EventTarget     relatedTarget;
+    void               initMouseEvent(in DOMString typeArg,
+                                      in boolean canBubbleArg,
+                                      in boolean cancelableArg,
+                                      in views::AbstractView viewArg,
+                                      in long detailArg,
+                                      in long screenXArg,
+                                      in long screenYArg,
+                                      in long clientXArg,
+                                      in long clientYArg,
+                                      in boolean ctrlKeyArg,
+                                      in boolean altKeyArg,
+                                      in boolean shiftKeyArg,
+                                      in boolean metaKeyArg,
+                                      in unsigned short buttonArg,
+                                      in EventTarget relatedTargetArg);
+    // Introduced in DOM Level 3:
+    boolean            getModifierState(in DOMString keyIdentifierArg);
+    // Introduced in DOM Level 3:
+    void               initMouseEventNS(in DOMString namespaceURI,
+                                        in DOMString typeArg,
+                                        in boolean canBubbleArg,
+                                        in boolean cancelableArg,
+                                        in views::AbstractView viewArg,
+                                        in long detailArg,
+                                        in long screenXArg,
+                                        in long screenYArg,
+                                        in long clientXArg,
+                                        in long clientYArg,
+                                        in unsigned short buttonArg,
+                                        in EventTarget relatedTargetArg,
+                                        in DOMString modifiersList);
+  };
+
+  // Introduced in DOM Level 3:
+  interface KeyboardEvent : UIEvent {
+
+    // KeyLocationCode
+    const unsigned long       DOM_KEY_LOCATION_STANDARD      = 0x00;
+    const unsigned long       DOM_KEY_LOCATION_LEFT          = 0x01;
+    const unsigned long       DOM_KEY_LOCATION_RIGHT         = 0x02;
+    const unsigned long       DOM_KEY_LOCATION_NUMPAD        = 0x03;
+
+    readonly attribute DOMString       keyIdentifier;
+    readonly attribute unsigned long   keyLocation;
+    readonly attribute boolean         ctrlKey;
+    readonly attribute boolean         shiftKey;
+    readonly attribute boolean         altKey;
+    readonly attribute boolean         metaKey;
+    boolean            getModifierState(in DOMString keyIdentifierArg);
+    void               initKeyboardEvent(in DOMString typeArg,
+                                         in boolean canBubbleArg,
+                                         in boolean cancelableArg,
+                                         in views::AbstractView viewArg,
+                                         in DOMString keyIdentifierArg,
+                                         in unsigned long keyLocationArg,
+                                         in DOMString modifiersList);
+    void               initKeyboardEventNS(in DOMString namespaceURI,
+                                           in DOMString typeArg,
+                                           in boolean canBubbleArg,
+                                           in boolean cancelableArg,
+                                           in views::AbstractView viewArg,
+                                           in DOMString keyIdentifierArg,
+                                           in unsigned long keyLocationArg,
+                                           in DOMString modifiersList);
+  };
+
+  // Introduced in DOM Level 2:
+  interface MutationEvent : Event {
+
+    // attrChangeType
+    const unsigned short      MODIFICATION                   = 1;
+    const unsigned short      ADDITION                       = 2;
+    const unsigned short      REMOVAL                        = 3;
+
+    readonly attribute Node            relatedNode;
+    readonly attribute DOMString       prevValue;
+    readonly attribute DOMString       newValue;
+    readonly attribute DOMString       attrName;
+    readonly attribute unsigned short  attrChange;
+    void               initMutationEvent(in DOMString typeArg,
+                                         in boolean canBubbleArg,
+                                         in boolean cancelableArg,
+                                         in Node relatedNodeArg,
+                                         in DOMString prevValueArg,
+                                         in DOMString newValueArg,
+                                         in DOMString attrNameArg,
+                                         in unsigned short attrChangeArg);
+    // Introduced in DOM Level 3:
+    void               initMutationEventNS(in DOMString namespaceURI,
+                                           in DOMString typeArg,
+                                           in boolean canBubbleArg,
+                                           in boolean cancelableArg,
+                                           in Node relatedNodeArg,
+                                           in DOMString prevValueArg,
+                                           in DOMString newValueArg,
+                                           in DOMString attrNameArg,
+                                           in unsigned short attrChangeArg);
+  };
+
+  // Introduced in DOM Level 3:
+  interface MutationNameEvent : MutationEvent {
+    readonly attribute DOMString       prevNamespaceURI;
+    readonly attribute DOMString       prevNodeName;
+    // Introduced in DOM Level 3:
+    void               initMutationNameEvent(in DOMString typeArg,
+                                             in boolean canBubbleArg,
+                                             in boolean cancelableArg,
+                                             in Node relatedNodeArg,
+                                             in DOMString prevNamespaceURIArg,
+                                             in DOMString prevNodeNameArg);
+    // Introduced in DOM Level 3:
+    void               initMutationNameEventNS(in DOMString namespaceURI,
+                                               in DOMString typeArg,
+                                               in boolean canBubbleArg,
+                                               in boolean cancelableArg,
+                                               in Node relatedNodeArg,
+                                               in DOMString prevNamespaceURIArg,
+                                               in DOMString prevNodeNameArg);
+  };
+};
+
+#endif // _EVENTS_IDL_
+*/
+
+exports.dom = {
+  level3 : {
+    events:  events
+  }
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level3/html.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level3/html.js
new file mode 100644
index 0000000..110c865
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level3/html.js
@@ -0,0 +1,9 @@
+var core = require("./core").dom.level3.core,
+    html = require("../level2/html").dom.level2.html
+
+exports.dom = {
+  level3 : {
+    html : html,
+    core : core
+  }
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level3/index.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level3/index.js
new file mode 100644
index 0000000..03bf073
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level3/index.js
@@ -0,0 +1,10 @@
+module.exports.dom = {
+  level3 : {
+    core   : require("./core").dom.level3.core,
+    xpath  : require("./xpath"),
+    events : require("./events").dom.level3.events,
+    html   : require("./html").dom.level3.html,
+  }
+};
+
+module.exports.dom.ls = require('./ls').dom.level3.ls;
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level3/ls.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level3/ls.js
new file mode 100644
index 0000000..5d9f8f2
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level3/ls.js
@@ -0,0 +1,221 @@
+// w3c Load/Save functionality: http://www.w3.org/TR/2004/REC-DOM-Level-3-LS-20040407/
+
+var core = require('./core').dom.level3.core;
+var events = require('./events').dom.level3.events;;
+
+var ls = {};
+
+// TODO: what is this?
+//typedef dom::DOMConfiguration DOMConfiguration;
+
+ls.LSException = function LSException(code) {
+  this.code = code;
+};
+
+ls.LSException.prototype = {
+  // LSExceptionCode
+  PARSE_ERR                       : 81,
+  SERIALIZE_ERR                   : 82
+};
+
+ls.DOMImplementationLS = function DOMImplementationLS() {
+
+};
+
+var DOMImplementationExtension = {
+
+  // DOMImplementationLSMode
+  MODE_SYNCHRONOUS  : 1,
+  MODE_ASYNCHRONOUS : 2,
+
+  // raises(dom::DOMException);
+  createLSParser : function(/* int */ mode, /* string */ schemaType) {
+    return new ls.LSParser(mode, schemaType);
+  },
+
+  createLSSerializer : function() {
+    return new ls.LSSerializer();
+  },
+
+  createLSInput : function() {
+    return new ls.LSInput();
+  },
+
+  createLSOutput : function() {
+    return new ls.LSOutput();
+  }
+};
+
+Object.keys(DOMImplementationExtension).forEach(function(k, v) {
+  core.DOMImplementation.prototype[k] = DOMImplementationExtension[k];
+});
+
+ls.DOMImplementationLS.prototype = DOMImplementationExtension; 
+
+core.Document.getFeature = function() {
+  return DOMImplementationExtension;
+};
+
+ls.LSParser = function LSParser() {
+  this._domConfig = new core.DOMConfiguration();
+};
+ls.LSParser.prototype = {
+  get domConfig() { return this._domConfig; },
+  get filter() { return this._filter || null; },
+  set filter(value) { this._filter = value; },
+  get async() { return this._async; },
+  get busy() { return this._busy; },
+
+  // raises(dom::DOMException, LSException);
+  parse : function (/* LSInput */ input) {
+    var doc = new core.Document();
+    doc._inputEncoding = 'UTF-16';
+    return doc;
+  },
+
+  // raises(dom::DOMException, LSException);
+  parseURI : function(/* string */ uri) {
+    return new core.Document();
+  },
+
+  // ACTION_TYPES
+  ACTION_APPEND_AS_CHILDREN       : 1,
+  ACTION_REPLACE_CHILDREN         : 2,
+  ACTION_INSERT_BEFORE            : 3,
+  ACTION_INSERT_AFTER             : 4,
+  ACTION_REPLACE                  : 5,
+
+  // @returns Node
+  // @raises DOMException, LSException
+  parseWithContext                : function(/* LSInput */ input, /* Node */ contextArg, /* int */ action) {
+    return new core.Node();
+  },
+
+  abort                           : function() {
+    // TODO: implement
+  }
+};
+
+ls.LSInput = function LSInput() {};
+ls.LSInput.prototype = {
+  get characterStream() { return this._characterStream || null; },
+  set characterStream(value) { this._characterStream = value; },
+  get byteStream() { return this._byteStream || null; },
+  set byteStream(value) { this._byteStream = value; },
+  get stringData() { return this._stringData || null; },
+  set stringData(value) { this._stringData = value; },
+  get systemId() { return this._systemId || null; },
+  set systemId(value) { this._systemId = value; },
+  get publicId() { return this._publicId || null; },
+  set publicId(value) { this._publicId = value; },
+  get baseURI() { return this._baseURI || null; },
+  set baseURI(value) { this._baseURI = value; },
+  get encoding() { return this._encoding || null; },
+  set encoding(value) { this._encoding = value; },
+  get certifiedText() { return this._certifiedText || null; },
+  set certifiedText(value) { this._certifiedText = value; },
+};
+
+ls.LSResourceResolver = function LSResourceResolver() {};
+
+// @returns LSInput
+ls.LSResourceResolver.prototype.resolveResource = function(type, namespaceURI, publicId, systemId, baseURI) {
+  return new ls.LSInput();
+};
+
+ls.LSParserFilter = function LSParserFilter() {};
+ls.LSParserFilter.prototype = {
+
+  // Constants returned by startElement and acceptNode
+  FILTER_ACCEPT                   : 1,
+  FILTER_REJECT                   : 2,
+  FILTER_SKIP                     : 3,
+  FILTER_INTERRUPT                : 4,
+
+  get whatToShow() { return this._whatToShow; },
+
+  // @returns int
+  startElement : function(/* Element */ elementArg) {
+    return 0;
+  },
+
+  // @returns int
+  acceptNode : function(/* Node */ nodeArg) {
+    return nodeArg;
+  }
+};
+
+ls.LSSerializer = function LSSerializer() {
+  this._domConfig = new core.DOMConfiguration();
+};
+ls.LSSerializer.prototype = {
+  get domConfig() { return this._domConfig; },
+  get newLine() { return this._newLine || null; },
+  set newLine(value) { this._newLine = value; },
+  get filter() { return this._filter || null; },
+  set filter(value) { this._filter = value; },
+
+  // @returns boolean
+  // @raises LSException
+  write : function(/* Node */ nodeArg, /* LSOutput */ destination) {
+   return true;
+  },
+
+  // @returns boolean
+  // @raises LSException
+  writeToURI : function(/* Node */ nodeArg, /* string */ uri) {
+   return true;
+  },
+
+  // @returns string
+  // @raises DOMException, LSException
+  writeToString : function(/* Node */ nodeArg) {
+    return "";
+  }
+};
+
+ls.LSOutput = function LSOutput() {};
+ls.LSOutput.prototype = {
+  get characterStream() { return this._characterStream || null; },
+  set characterStream(value) { this._characterStream = value; },
+  get byteStream() { return this._byteStream || null; },
+  set byteStream(value) { this._byteStream = value; },
+  get systemId() { return this._systemId || null; },
+  set systemId(value) { this._systemId = value; },
+  get encoding() { return this._encoding || null; },
+  set encoding(value) { this._encoding = value; },
+};
+
+ls.LSProgressEvent = function LSProgressEvent() {};
+ls.LSProgressEvent.prototype = {
+  get input() { return this._input; },
+  get position() { return this._position; },
+  get totalSize() { return this._totalSize; },
+};
+
+ls.LSProgressEvent.prototype.__proto__ = events.Event;
+
+ls.LSLoadEvent = function LSLoadEvent() {};
+ls.LSLoadEvent.prototype = {
+  get newDocument() { return this._newDocument; },
+  get input() { return this._input; },
+};
+
+ls.LSLoadEvent.prototype.__proto__ = events.Event;
+
+
+// TODO: do traversal
+ls.LSSerializerFilter = function LSSerializerFilter() {};
+ls.LSSerializerFilter.prototype = {
+  get whatToShow() { return this._whatToShow; },
+};
+
+// ls.LSSerializerFilter.prototype.__proto__ = level2.traversal.NodeFiler;
+
+// Export
+module.exports.dom = {
+  level3 : {
+    ls : ls 
+  }
+};
+
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level3/xpath.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level3/xpath.js
new file mode 100644
index 0000000..a45ec68
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/level3/xpath.js
@@ -0,0 +1,1858 @@
+/** Here is yet another implementation of XPath 1.0 in Javascript.
+ *
+ * My goal was to make it relatively compact, but as I fixed all the axis bugs
+ * the axes became more and more complicated. :-(.
+ *
+ * I have not implemented namespaces or case-sensitive axes for XML yet.
+ *
+ * How to test it in Chrome: You can make a Chrome extension that replaces
+ * the WebKit XPath parser with this one. But it takes a bit of effort to
+ * get around isolated world and same-origin restrictions:
+ * manifest.json:
+    {
+      "name": "XPathTest",
+      "version": "0.1",
+      "content_scripts": [{
+        "matches": ["http://localhost/*"],  // or wildcard host
+        "js": ["xpath.js", "injection.js"],
+        "all_frames": true, "run_at": "document_start"
+      }]
+    }
+ * injection.js:
+    // goal: give my xpath object to the website's JS context.
+    var script = document.createElement('script');
+    script.textContent =
+        "document.addEventListener('xpathextend', function(e) {\n" +
+        "  console.log('extending document with xpath...');\n" +
+        "  e.detail(window);" +
+        "});";
+    document.documentElement.appendChild(script);
+    document.documentElement.removeChild(script);
+    var evt = document.createEvent('CustomEvent');
+    evt.initCustomEvent('xpathextend', true, true, this.xpath.extend);
+    document.dispatchEvent(evt);
+ */
+(function() {
+  var core;
+  var xpath;
+  if ('function' === typeof require) {
+    core = require("../level3/core").dom.level3.core;
+    xpath = exports;
+  } else {
+    core = this;
+    xpath = {};
+  }
+
+
+  /***************************************************************************
+   *                            Tokenization                                 *
+   ***************************************************************************/
+  /**
+   * The XPath lexer is basically a single regular expression, along with
+   * some helper functions to pop different types.
+   */
+  var Stream = xpath.Stream = function Stream(str) {
+    this.original = this.str = str;
+    this.peeked = null;
+    // TODO: not really needed, but supposedly tokenizer also disambiguates
+    // a * b vs. node test *
+    this.prev = null;  // for debugging
+    this.prevprev = null;
+  }
+  Stream.prototype = {
+    peek: function() {
+      if (this.peeked) return this.peeked;
+      var m = this.re.exec(this.str);
+      if (!m) return null;
+      this.str = this.str.substr(m[0].length);
+      return this.peeked = m[1];
+    },
+    /** Peek 2 tokens ahead. */
+    peek2: function() {
+      this.peek();  // make sure this.peeked is set
+      var m = this.re.exec(this.str);
+      if (!m) return null;
+      return m[1];
+    },
+    pop: function() {
+      var r = this.peek();
+      this.peeked = null;
+      this.prevprev = this.prev;
+      this.prev = r;
+      return r;
+    },
+    trypop: function(tokens) {
+      var tok = this.peek();
+      if (tok === tokens) return this.pop();
+      if (Array.isArray(tokens)) {
+        for (var i = 0; i < tokens.length; ++i) {
+          var t = tokens[i];
+          if (t == tok) return this.pop();;
+        }
+      }
+    },
+    trypopfuncname: function() {
+      var tok = this.peek();
+      if (!this.isQnameRe.test(tok))
+        return null;
+      switch (tok) {
+        case 'comment': case 'text': case 'processing-instruction': case 'node':
+          return null;
+      }
+      if ('(' != this.peek2()) return null;
+      return this.pop();
+    },
+    trypopaxisname: function() {
+      var tok = this.peek();
+      switch (tok) {
+        case 'ancestor': case 'ancestor-or-self': case 'attribute':
+        case 'child': case 'descendant': case 'descendant-or-self':
+        case 'following': case 'following-sibling': case 'namespace':
+        case 'parent': case 'preceding': case 'preceding-sibling': case 'self':
+          if ('::' == this.peek2()) return this.pop();
+      }
+      return null;
+    },
+    trypopnametest: function() {
+      var tok = this.peek();
+      if ('*' === tok || this.startsWithNcNameRe.test(tok)) return this.pop();
+      return null;
+    },
+    trypopliteral: function() {
+      var tok = this.peek();
+      if (null == tok) return null;
+      var first = tok.charAt(0);
+      var last = tok.charAt(tok.length - 1);
+      if ('"' === first && '"' === last ||
+          "'" === first && "'" === last) {
+        this.pop();
+        return tok.substr(1, tok.length - 2);
+      }
+    },
+    trypopnumber: function() {
+      var tok = this.peek();
+      if (this.isNumberRe.test(tok)) return parseFloat(this.pop());
+      else return null;
+    },
+    trypopvarref: function() {
+      var tok = this.peek();
+      if (null == tok) return null;
+      if ('$' === tok.charAt(0)) return this.pop().substr(1);
+      else return null;
+    },
+    position: function() {
+      return this.original.length - this.str.length;
+    }
+  };
+  (function() {
+    // http://www.w3.org/TR/REC-xml-names/#NT-NCName
+    var nameStartCharsExceptColon =
+        'A-Z_a-z\xc0-\xd6\xd8-\xf6\xF8-\u02FF\u0370-\u037D\u037F-\u1FFF' +
+        '\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF' +
+        '\uFDF0-\uFFFD';  // JS doesn't support [#x10000-#xEFFFF]
+    var nameCharExceptColon = nameStartCharsExceptColon +
+        '\\-\\.0-9\xb7\u0300-\u036F\u203F-\u2040';
+    var ncNameChars = '[' + nameStartCharsExceptColon +
+        '][' + nameCharExceptColon + ']*'
+    // http://www.w3.org/TR/REC-xml-names/#NT-QName
+    var qNameChars = ncNameChars + '(?::' + ncNameChars + ')?';
+    var otherChars = '\\.\\.|[\\(\\)\\[\\].@,]|::';  // .. must come before [.]
+    var operatorChars =
+        'and|or|mod|div|' +
+        '//|!=|<=|>=|[*/|+\\-=<>]';  // //, !=, <=, >= before individual ones.
+    var literal = '"[^"]*"|' + "'[^']*'";
+    var numberChars = '[0-9]+(?:\\.[0-9]*)?|\\.[0-9]+';
+    var variableReference = '\\$' + qNameChars;
+    var nameTestChars = '\\*|' + ncNameChars + ':\\*|' + qNameChars;
+    var optionalSpace = '[ \t\r\n]*';  // stricter than regexp \s.
+    var nodeType = 'comment|text|processing-instruction|node';
+    var re = new RegExp(
+        // numberChars before otherChars so that leading-decimal doesn't become .
+        '^' + optionalSpace + '(' + numberChars + '|' + otherChars + '|' +
+        nameTestChars + '|' + operatorChars + '|' + literal + '|' +
+        variableReference + ')'
+        // operatorName | nodeType | functionName | axisName are lumped into
+        // qName for now; we'll check them on pop.
+    );
+    Stream.prototype.re = re;
+    Stream.prototype.startsWithNcNameRe = new RegExp('^' + ncNameChars);
+    Stream.prototype.isQnameRe = new RegExp('^' + qNameChars + '$');
+    Stream.prototype.isNumberRe = new RegExp('^' + numberChars + '$');
+  })();
+
+  /***************************************************************************
+   *                               Parsing                                   *
+   ***************************************************************************/
+  var parse = xpath.parse = function parse(stream, a) {
+    var r = orExpr(stream,a);
+    var x, unparsed = [];
+    while (x = stream.pop()) {
+      unparsed.push(x);
+    }
+    if (unparsed.length)
+      throw new XPathException(XPathException.INVALID_EXPRESSION_ERR,
+                               'Position ' + stream.position() +
+                               ': Unparsed tokens: ' + unparsed.join(' '));
+    return r;
+  }
+
+  /**
+   * binaryL  ::= subExpr
+   *            | binaryL op subExpr
+   * so a op b op c becomes ((a op b) op c)
+   */
+  function binaryL(subExpr, stream, a, ops) {
+    var lhs = subExpr(stream, a);
+    if (lhs == null) return null;
+    var op;
+    while (op = stream.trypop(ops)) {
+      var rhs = subExpr(stream, a);
+      if (rhs == null)
+        throw new XPathException(XPathException.INVALID_EXPRESSION_ERR,
+                                 'Position ' + stream.position() +
+                                 ': Expected something after ' + op);
+      lhs = a.node(op, lhs, rhs);
+    }
+    return lhs;
+  }
+  /**
+   * Too bad this is never used. If they made a ** operator (raise to power),
+   ( we would use it.
+   * binaryR  ::= subExpr
+   *            | subExpr op binaryR
+   * so a op b op c becomes (a op (b op c))
+   */
+  function binaryR(subExpr, stream, a, ops) {
+    var lhs = subExpr(stream, a);
+    if (lhs == null) return null;
+    var op = stream.trypop(ops);
+    if (op) {
+      var rhs = binaryR(stream, a);
+      if (rhs == null)
+        throw new XPathException(XPathException.INVALID_EXPRESSION_ERR,
+                                 'Position ' + stream.position() +
+                                 ': Expected something after ' + op);
+      return a.node(op, lhs, rhs);
+    } else {
+      return lhs;// TODO
+    }
+  }
+  /** [1] LocationPath::= RelativeLocationPath | AbsoluteLocationPath
+   * e.g. a, a/b, //a/b
+   */
+  function locationPath(stream, a) {
+    return absoluteLocationPath(stream, a) ||
+           relativeLocationPath(null, stream, a);
+  }
+  /** [2] AbsoluteLocationPath::= '/' RelativeLocationPath? | AbbreviatedAbsoluteLocationPath
+   *  [10] AbbreviatedAbsoluteLocationPath::= '//' RelativeLocationPath
+   */
+  function absoluteLocationPath(stream, a) {
+    var op = stream.peek();
+    if ('/' === op || '//' === op) {
+      var lhs = a.node('Root');
+      return relativeLocationPath(lhs, stream, a, true);
+    } else {
+      return null;
+    }
+  }
+  /** [3] RelativeLocationPath::= Step | RelativeLocationPath '/' Step |
+   *                            | AbbreviatedRelativeLocationPath
+   *  [11] AbbreviatedRelativeLocationPath::= RelativeLocationPath '//' Step
+   * e.g. p/a, etc.
+   */
+  function relativeLocationPath(lhs, stream, a, isOnlyRootOk) {
+    if (null == lhs) {
+      lhs = step(stream, a);
+      if (null == lhs) return lhs;
+    }
+    var op;
+    while (op = stream.trypop(['/', '//'])) {
+      if ('//' === op) {
+        lhs = a.node('/', lhs,
+                     a.node('Axis', 'descendant-or-self', 'node', undefined));
+      }
+      var rhs = step(stream, a);
+      if (null == rhs && '/' === op && isOnlyRootOk) return lhs;
+      else isOnlyRootOk = false;
+      if (null == rhs)
+        throw new XPathException(XPathException.INVALID_EXPRESSION_ERR,
+                                 'Position ' + stream.position() +
+                                 ': Expected step after ' + op);
+      lhs = a.node('/', lhs, rhs);
+    }
+    return lhs;
+  }
+  /** [4] Step::= AxisSpecifier NodeTest Predicate* | AbbreviatedStep
+   *  [12] AbbreviatedStep::= '.' | '..'
+   * e.g. @href, self::p, p, a[@href], ., ..
+   */
+  function step(stream, a) {
+    var abbrStep = stream.trypop(['.', '..']);
+    if ('.' === abbrStep)  // A location step of . is short for self::node().
+      return a.node('Axis', 'self', 'node');
+    if ('..' === abbrStep)  // A location step of .. is short for parent::node()
+      return a.node('Axis', 'parent', 'node');
+
+    var axis = axisSpecifier(stream, a);
+    var nodeType = nodeTypeTest(stream, a);
+    var nodeName;
+    if (null == nodeType) nodeName = nodeNameTest(stream, a);
+    if (null == axis && null == nodeType && null == nodeName) return null;
+    if (null == nodeType && null == nodeName)
+        throw new XPathException(
+            XPathException.INVALID_EXPRESSION_ERR,
+            'Position ' + stream.position() +
+            ': Expected nodeTest after axisSpecifier ' + axis);
+    if (null == axis) axis = 'child';
+    if (null == nodeType) {
+      // When there's only a node name, then the node type is forced to be the
+      // principal node type of the axis.
+      // see http://www.w3.org/TR/xpath/#dt-principal-node-type
+      if ('attribute' === axis) nodeType = 'attribute';
+      else if ('namespace' === axis) nodeType = 'namespace';
+      else nodeType = 'element';
+    }
+    var lhs = a.node('Axis', axis, nodeType, nodeName);
+    var pred;
+    while (null != (pred = predicate(lhs, stream, a))) {
+      lhs = pred;
+    }
+    return lhs;
+  }
+  /** [5] AxisSpecifier::= AxisName '::' | AbbreviatedAxisSpecifier
+   *  [6] AxisName::= 'ancestor' | 'ancestor-or-self' | 'attribute' | 'child'
+   *                | 'descendant' | 'descendant-or-self' | 'following'
+   *                | 'following-sibling' | 'namespace' | 'parent' |
+   *                | 'preceding' | 'preceding-sibling' | 'self'
+   *  [13] AbbreviatedAxisSpecifier::= '@'?
+   */
+  function axisSpecifier(stream, a) {
+    var attr = stream.trypop('@');
+    if (null != attr) return 'attribute';
+    var axisName = stream.trypopaxisname();
+    if (null != axisName) {
+      var coloncolon = stream.trypop('::');
+      if (null == coloncolon)
+        throw new XPathException(XPathException.INVALID_EXPRESSION_ERR,
+                                 'Position ' + stream.position() +
+                                 ': Should not happen. Should be ::.');
+      return axisName;
+    }
+  }
+  /** [7] NodeTest::= NameTest | NodeType '(' ')' | 'processing-instruction' '(' Literal ')'
+   *  [38] NodeType::= 'comment' | 'text' | 'processing-instruction' | 'node'
+   * I've split nodeTypeTest from nodeNameTest for convenience.
+   */
+  function nodeTypeTest(stream, a) {
+    if ('(' !== stream.peek2()) {
+      return null;
+    }
+    var type = stream.trypop(['comment', 'text', 'processing-instruction', 'node']);
+    if (null != type) {
+      if (null == stream.trypop('('))
+        throw new XPathException(XPathException.INVALID_EXPRESSION_ERR,
+                                 'Position ' + stream.position() +
+                                 ': Should not happen.');
+      var param = undefined;
+      if (type == 'processing-instruction') {
+        param = stream.trypopliteral();
+      }
+      if (null == stream.trypop(')'))
+        throw new XPathException(XPathException.INVALID_EXPRESSION_ERR,
+                                 'Position ' + stream.position() +
+                                 ': Expected close parens.');
+      return type
+    }
+  }
+  function nodeNameTest(stream, a) {
+    var name = stream.trypopnametest();
+    if (name != null) return name;
+    else return null;
+  }
+  /** [8] Predicate::= '[' PredicateExpr ']'
+   *  [9] PredicateExpr::= Expr
+   */
+  function predicate(lhs, stream, a) {
+    if (null == stream.trypop('[')) return null;
+    var expr = orExpr(stream, a);
+    if (null == expr)
+      throw new XPathException(XPathException.INVALID_EXPRESSION_ERR,
+                               'Position ' + stream.position() +
+                               ': Expected expression after [');
+    if (null == stream.trypop(']'))
+      throw new XPathException(XPathException.INVALID_EXPRESSION_ERR,
+                               'Position ' + stream.position() +
+                               ': Expected ] after expression.');
+    return a.node('Predicate', lhs, expr);
+  }
+  /** [14] Expr::= OrExpr
+   */
+  /** [15] PrimaryExpr::= VariableReference | '(' Expr ')' | Literal | Number | FunctionCall
+   * e.g. $x,  (3+4),  "hi",  32,  f(x)
+   */
+  function primaryExpr(stream, a) {
+    var x = stream.trypopliteral();
+    if (null == x)
+      x = stream.trypopnumber();
+    if (null != x) {
+      return x;
+    }
+    var varRef = stream.trypopvarref();
+    if (null != varRef) return a.node('VariableReference', varRef);
+    var funCall = functionCall(stream, a);
+    if (null != funCall) {
+      return funCall;
+    }
+    if (stream.trypop('(')) {
+      var e = orExpr(stream, a);
+      if (null == e)
+        throw new XPathException(XPathException.INVALID_EXPRESSION_ERR,
+                                 'Position ' + stream.position() +
+                                 ': Expected expression after (.');
+      if (null == stream.trypop(')'))
+        throw new XPathException(XPathException.INVALID_EXPRESSION_ERR,
+                                 'Position ' + stream.position() +
+                                 ': Expected ) after expression.');
+      return e;
+    }
+    return null;
+  }
+  /** [16] FunctionCall::= FunctionName '(' ( Argument ( ',' Argument )* )? ')'
+   *  [17] Argument::= Expr
+   */
+  function functionCall(stream, a) {
+    var name = stream.trypopfuncname(stream, a);
+    if (null == name) return null;
+    if (null == stream.trypop('('))
+      throw new XPathException(XPathException.INVALID_EXPRESSION_ERR,
+                               'Position ' + stream.position() +
+                               ': Expected ( ) after function name.');
+    var params = [];
+    var first = true;
+    while (null == stream.trypop(')')) {
+      if (!first && null == stream.trypop(','))
+        throw new XPathException(XPathException.INVALID_EXPRESSION_ERR,
+                                 'Position ' + stream.position() +
+                                 ': Expected , between arguments of the function.');
+      first = false;
+      var param = orExpr(stream, a);
+      if (param == null)
+        throw new XPathException(XPathException.INVALID_EXPRESSION_ERR,
+                                 'Position ' + stream.position() +
+                                 ': Expected expression as argument of function.');
+      params.push(param);
+    }
+    return a.node('FunctionCall', name, params);
+  }
+
+  /** [18] UnionExpr::= PathExpr | UnionExpr '|' PathExpr
+   */
+  function unionExpr(stream, a) { return binaryL(pathExpr, stream, a, '|'); }
+  /** [19] PathExpr ::= LocationPath
+   *                  | FilterExpr
+   *                  | FilterExpr '/' RelativeLocationPath
+   *                  | FilterExpr '//' RelativeLocationPath
+   * Unlike most other nodes, this one always generates a node because
+   * at this point all reverse nodesets must turn into a forward nodeset
+   */
+  function pathExpr(stream, a) {
+    // We have to do FilterExpr before LocationPath because otherwise
+    // LocationPath will eat up the name from a function call.
+    var filter = filterExpr(stream, a);
+    if (null == filter) {
+      var loc = locationPath(stream, a);
+      if (null == loc) {
+        throw new Error
+        throw new XPathException(XPathException.INVALID_EXPRESSION_ERR,
+                                 'Position ' + stream.position() +
+                                 ': The expression shouldn\'t be empty...');
+      }
+      return a.node('PathExpr', loc);
+    }
+    var rel = relativeLocationPath(filter, stream, a, false);
+    if (filter === rel) return rel;
+    else return a.node('PathExpr', rel);
+  }
+  /** [20] FilterExpr::= PrimaryExpr | FilterExpr Predicate
+   * aka. FilterExpr ::= PrimaryExpr Predicate*
+   */
+  function filterExpr(stream, a) {
+    var primary = primaryExpr(stream, a);
+    if (primary == null) return null;
+    var pred, lhs = primary;
+    while (null != (pred = predicate(lhs, stream, a))) {
+      lhs = pred;
+    }
+    return lhs;
+  }
+
+  /** [21] OrExpr::= AndExpr | OrExpr 'or' AndExpr
+   */
+  function orExpr(stream, a) {
+    var orig = (stream.peeked || '') + stream.str
+    var r = binaryL(andExpr, stream, a, 'or');
+    var now = (stream.peeked || '') + stream.str;
+    return r;
+  }
+  /** [22] AndExpr::= EqualityExpr | AndExpr 'and' EqualityExpr
+   */
+  function andExpr(stream, a) { return binaryL(equalityExpr, stream, a, 'and'); }
+  /** [23] EqualityExpr::= RelationalExpr | EqualityExpr '=' RelationalExpr
+   *                     | EqualityExpr '!=' RelationalExpr
+   */
+  function equalityExpr(stream, a) { return binaryL(relationalExpr, stream, a, ['=','!=']); }
+  /** [24] RelationalExpr::= AdditiveExpr | RelationalExpr '<' AdditiveExpr
+   *                       | RelationalExpr '>' AdditiveExpr
+   *                       | RelationalExpr '<=' AdditiveExpr
+   *                       | RelationalExpr '>=' AdditiveExpr
+   */
+  function relationalExpr(stream, a) { return binaryL(additiveExpr, stream, a, ['<','>','<=','>=']); }
+  /** [25] AdditiveExpr::= MultiplicativeExpr
+   *                     | AdditiveExpr '+' MultiplicativeExpr
+   *                     | AdditiveExpr '-' MultiplicativeExpr
+   */
+  function additiveExpr(stream, a) { return binaryL(multiplicativeExpr, stream, a, ['+','-']); }
+  /** [26] MultiplicativeExpr::= UnaryExpr
+   *                           | MultiplicativeExpr MultiplyOperator UnaryExpr
+   *                           | MultiplicativeExpr 'div' UnaryExpr
+   *                           | MultiplicativeExpr 'mod' UnaryExpr
+   */
+  function multiplicativeExpr(stream, a) { return binaryL(unaryExpr, stream, a, ['*','div','mod']); }
+  /** [27] UnaryExpr::= UnionExpr | '-' UnaryExpr
+   */
+  function unaryExpr(stream, a) {
+    if (stream.trypop('-')) {
+      var e = unaryExpr(stream, a);
+      if (null == e)
+        throw new XPathException(XPathException.INVALID_EXPRESSION_ERR,
+                                 'Position ' + stream.position() +
+                                 ': Expected unary expression after -');
+      return a.node('UnaryMinus', e);
+    }
+    else return unionExpr(stream, a);
+  }
+  var astFactory = {
+    node: function() {return Array.prototype.slice.call(arguments);}
+  };
+
+
+  /***************************************************************************
+   *                            Optimizations (TODO)                         *
+   ***************************************************************************/
+  /**
+   * Some things I've been considering:
+   * 1) a//b becomes a/descendant::b if there's no predicate that uses
+   *    position() or last()
+   * 2) axis[pred]: when pred doesn't use position, evaluate it just once per
+   *    node in the node-set rather than once per (node, position, last).
+   * For more optimizations, look up Gecko's optimizer:
+   * http://mxr.mozilla.org/mozilla-central/source/content/xslt/src/xpath/txXPathOptimizer.cpp
+   */
+  // TODO
+  function optimize(ast) {
+  }
+
+  /***************************************************************************
+   *                           Evaluation: axes                              *
+   ***************************************************************************/
+
+  /**
+   * Data types: For string, number, boolean, we just use Javascript types.
+   * Node-sets have the form
+   *    {nodes: [node, ...]}
+   * or {nodes: [node, ...], pos: [[1], [2], ...], lasts: [[1], [2], ...]}
+   *
+   * Most of the time, only the node is used and the position information is
+   * discarded. But if you use a predicate, we need to try every value of
+   * position and last in case the predicate calls position() or last().
+   */
+
+  /**
+   * The NodeMultiSet is a helper class to help generate
+   * {nodes:[], pos:[], lasts:[]} structures. It is useful for the
+   * descendant, descendant-or-self, following-sibling, and
+   * preceding-sibling axes for which we can use a stack to organize things.
+   */
+  function NodeMultiSet(isReverseAxis) {
+    this.nodes = [];
+    this.pos = [];
+    this.lasts = [];
+    this.nextPos = [];
+    this.seriesIndexes = [];  // index within nodes that each series begins.
+    this.isReverseAxis = isReverseAxis;
+    this._pushToNodes = isReverseAxis ? Array.prototype.unshift : Array.prototype.push;
+  }
+  NodeMultiSet.prototype = {
+    pushSeries: function pushSeries() {
+      this.nextPos.push(1);
+      this.seriesIndexes.push(this.nodes.length);
+    },
+    popSeries: function popSeries() {
+      console.assert(0 < this.nextPos.length, this.nextPos);
+      var last = this.nextPos.pop() - 1,
+          indexInPos = this.nextPos.length,
+          seriesBeginIndex = this.seriesIndexes.pop(),
+          seriesEndIndex = this.nodes.length;
+      for (var i = seriesBeginIndex; i < seriesEndIndex; ++i) {
+        console.assert(indexInPos < this.lasts[i].length);
+        console.assert(undefined === this.lasts[i][indexInPos]);
+        this.lasts[i][indexInPos] = last;
+      }
+    },
+    finalize: function() {
+      if (null == this.nextPos) return this;
+      console.assert(0 === this.nextPos.length);
+      for (var i = 0; i < this.lasts.length; ++i) {
+        for (var j = 0; j < this.lasts[i].length; ++j) {
+          console.assert(null != this.lasts[i][j], i + ',' + j + ':' + JSON.stringify(this.lasts));
+        }
+      }
+      this.pushSeries = this.popSeries = this.addNode = function() {
+        throw new Error('Already finalized.');
+      };
+      return this;
+    },
+    addNode: function addNode(node) {
+      console.assert(node);
+      this._pushToNodes.call(this.nodes, node)
+      this._pushToNodes.call(this.pos, this.nextPos.slice());
+      this._pushToNodes.call(this.lasts, new Array(this.nextPos.length));
+      for (var i = 0; i < this.nextPos.length; ++i) this.nextPos[i]++;
+    },
+    simplify: function() {
+      this.finalize();
+      return {nodes:this.nodes, pos:this.pos, lasts:this.lasts};
+    }
+  };
+  function eachContext(nodeMultiSet) {
+    var r = [];
+    for (var i = 0; i < nodeMultiSet.nodes.length; i++) {
+      var node = nodeMultiSet.nodes[i];
+      if (!nodeMultiSet.pos) {
+        r.push({nodes:[node], pos: [[i + 1]], lasts: [[nodeMultiSet.nodes.length]]});
+      } else {
+        for (var j = 0; j < nodeMultiSet.pos[i].length; ++j) {
+          r.push({nodes:[node], pos: [[nodeMultiSet.pos[i][j]]], lasts: [[nodeMultiSet.lasts[i][j]]]});
+        }
+      }
+    }
+    return r;
+  }
+  /** Matcher used in the axes.
+   */
+  function NodeMatcher(nodeTypeNum, nodeName, shouldLowerCase) {
+    this.nodeTypeNum = nodeTypeNum;
+    this.nodeName = nodeName;
+    this.shouldLowerCase = shouldLowerCase;
+    this.nodeNameTest =
+      null == nodeName ? this._alwaysTrue :
+      shouldLowerCase ? this._nodeNameLowerCaseEquals :
+      this._nodeNameEquals;
+  }
+  NodeMatcher.prototype = {
+    matches: function matches(node) {
+      return (0 === this.nodeTypeNum || node.nodeType === this.nodeTypeNum) &&
+          this.nodeNameTest(node.nodeName);
+    },
+    _alwaysTrue: function(name) {return true;},
+    _nodeNameEquals: function _nodeNameEquals(name) {
+      return this.nodeName === name;
+    },
+    _nodeNameLowerCaseEquals: function _nodeNameLowerCaseEquals(name) {
+      return this.nodeName === name.toLowerCase();
+    }
+  };
+
+  function followingSiblingHelper(nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase, shift, peek, followingNode, andSelf, isReverseAxis) {
+    var matcher = new NodeMatcher(nodeTypeNum, nodeName, shouldLowerCase);
+    var nodeMultiSet = new NodeMultiSet(isReverseAxis);
+    while (0 < nodeList.length) {  // can be if for following, preceding
+      var node = shift.call(nodeList);
+      console.assert(node != null);
+      node = followingNode(node);
+      nodeMultiSet.pushSeries();
+      var numPushed = 1;
+      while (null != node) {
+        if (! andSelf && matcher.matches(node))
+          nodeMultiSet.addNode(node);
+        if (node === peek.call(nodeList)) {
+          shift.call(nodeList);
+          nodeMultiSet.pushSeries();
+          numPushed++;
+        }
+        if (andSelf && matcher.matches(node))
+          nodeMultiSet.addNode(node);
+        node = followingNode(node);
+      }
+      while (0 < numPushed--)
+        nodeMultiSet.popSeries();
+    }
+    return nodeMultiSet;
+  }
+
+  /** Returns the next non-descendant node in document order.
+   * This is the first node in following::node(), if node is the context.
+   */
+  function followingNonDescendantNode(node) {
+    if (node.ownerElement) {
+      if (node.ownerElement.firstChild)
+        return node.ownerElement.firstChild;
+      node = node.ownerElement;
+    }
+    do {
+      if (node.nextSibling) return node.nextSibling;
+    } while (node = node.parentNode);
+    return null;
+  }
+
+  /** Returns the next node in a document-order depth-first search.
+   * See the definition of document order[1]:
+   *   1) element
+   *   2) namespace nodes
+   *   3) attributes
+   *   4) children
+   *   [1]: http://www.w3.org/TR/xpath/#dt-document-order
+   */
+  function followingNode(node) {
+    if (node.ownerElement)  // attributes: following node of element.
+      node = node.ownerElement;
+    if (null != node.firstChild)
+      return node.firstChild;
+    do {
+      if (null != node.nextSibling) {
+        return node.nextSibling;
+      }
+      node = node.parentNode;
+    } while (node);
+    return null;
+  }
+  /** Returns the previous node in document order (excluding attributes
+   * and namespace nodes).
+   */
+  function precedingNode(node) {
+    if (node.ownerElement)
+      return node.ownerElement;
+    if (null != node.previousSibling) {
+      node = node.previousSibling;
+      while (null != node.lastChild) {
+        node = node.lastChild;
+      }
+      return node;
+    }
+    if (null != node.parentNode) {
+      return node.parentNode;
+    }
+    return null;
+  }
+  /** This axis is inefficient if there are many nodes in the nodeList.
+   * But I think it's a pretty useless axis so it's ok. */
+  function followingHelper(nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase) {
+    var matcher = new NodeMatcher(nodeTypeNum, nodeName, shouldLowerCase);
+    var nodeMultiSet = new NodeMultiSet(false);
+    var cursor = nodeList[0];
+    var unorderedFollowingStarts = [];
+    for (var i = 0; i < nodeList.length; i++) {
+      var node = nodeList[i];
+      var start = followingNonDescendantNode(node);
+      if (start)
+        unorderedFollowingStarts.push(start);
+    }
+    if (0 === unorderedFollowingStarts.length)
+      return {nodes:[]};
+    var pos = [], nextPos = [];
+    var started = 0;
+    while (cursor = followingNode(cursor)) {
+      for (var i = unorderedFollowingStarts.length - 1; i >= 0; i--){
+        if (cursor === unorderedFollowingStarts[i]) {
+          nodeMultiSet.pushSeries();
+          unorderedFollowingStarts.splice(i,i+1);
+          started++;
+        }
+      }
+      if (started && matcher.matches(cursor)) {
+        nodeMultiSet.addNode(cursor);
+      }
+    }
+    console.assert(0 === unorderedFollowingStarts.length);
+    for (var i = 0; i < started; i++)
+      nodeMultiSet.popSeries();
+    return nodeMultiSet.finalize();
+  }
+  function precedingHelper(nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase) {
+    var matcher = new NodeMatcher(nodeTypeNum, nodeName, shouldLowerCase);
+    var cursor = nodeList.pop();
+    if (null == cursor) return {nodes:{}};
+    var r = {nodes:[], pos:[], lasts:[]};
+    var nextParents = [cursor.parentNode || cursor.ownerElement], nextPos = [1];
+    while (cursor = precedingNode(cursor)) {
+      if (cursor === nodeList[nodeList.length - 1]) {
+        nextParents.push(nodeList.pop());
+        nextPos.push(1);
+      }
+      var matches = matcher.matches(cursor);
+      var pos, someoneUsed = false;
+      if (matches)
+        pos = nextPos.slice();
+
+      for (var i = 0; i < nextParents.length; ++i) {
+        if (cursor === nextParents[i]) {
+          nextParents[i] = cursor.parentNode || cursor.ownerElement;
+          if (matches) {
+            pos[i] = null;
+          }
+        } else {
+          if (matches) {
+            pos[i] = nextPos[i]++;
+            someoneUsed = true;
+          }
+        }
+      }
+      if (someoneUsed) {
+        r.nodes.unshift(cursor);
+        r.pos.unshift(pos);
+      }
+    }
+    for (var i = 0; i < r.pos.length; ++i) {
+      var lasts = [];
+      r.lasts.push(lasts);
+      for (var j = r.pos[i].length - 1; j >= 0; j--) {
+        if (null == r.pos[i][j]) {
+          r.pos[i].splice(j, j+1);
+        } else {
+          lasts.unshift(nextPos[j] - 1);
+        }
+      }
+    }
+    return r;
+  }
+
+  /** node-set, axis -> node-set */
+  function descendantDfs(nodeMultiSet, node, remaining, matcher, andSelf, attrIndices, attrNodes) {
+    while (0 < remaining.length && null != remaining[0].ownerElement) {
+      var attr = remaining.shift();
+      if (andSelf && matcher.matches(attr)) {
+        attrNodes.push(attr);
+        attrIndices.push(nodeMultiSet.nodes.length);
+      }
+    }
+    if (null != node && !andSelf) {
+      if (matcher.matches(node))
+        nodeMultiSet.addNode(node);
+    }
+    var pushed = false;
+    if (null == node) {
+      if (0 === remaining.length) return;
+      node = remaining.shift();
+      nodeMultiSet.pushSeries();
+      pushed = true;
+    } else if (0 < remaining.length && node === remaining[0]) {
+      nodeMultiSet.pushSeries();
+      pushed = true;
+      remaining.shift();
+    }
+    if (andSelf) {
+      if (matcher.matches(node))
+        nodeMultiSet.addNode(node);
+    }
+    // TODO: use optimization. Also try element.getElementsByTagName
+    // var nodeList = 1 === nodeTypeNum && null != node.children ? node.children : node.childNodes;
+    var nodeList = node.childNodes;
+    for (var j = 0; j < nodeList.length; ++j) {
+      var child = nodeList[j];
+      descendantDfs(nodeMultiSet, child, remaining, matcher, andSelf, attrIndices, attrNodes);
+    }
+    if (pushed) {
+      nodeMultiSet.popSeries();
+    }
+  }
+  function descenantHelper(nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase, andSelf) {
+    var matcher = new NodeMatcher(nodeTypeNum, nodeName, shouldLowerCase);
+    var nodeMultiSet = new NodeMultiSet(false);
+    var attrIndices = [], attrNodes = [];
+    while (0 < nodeList.length) {
+      // var node = nodeList.shift();
+      descendantDfs(nodeMultiSet, null, nodeList, matcher, andSelf, attrIndices, attrNodes);
+    }
+    nodeMultiSet.finalize();
+    for (var i = attrNodes.length-1; i >= 0; --i) {
+      nodeMultiSet.nodes.splice(attrIndices[i], attrIndices[i], attrNodes[i]);
+      nodeMultiSet.pos.splice(attrIndices[i], attrIndices[i], [1]);
+      nodeMultiSet.lasts.splice(attrIndices[i], attrIndices[i], [1]);
+    }
+    return nodeMultiSet;
+  }
+  /**
+   */
+  function ancestorHelper(nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase, andSelf) {
+    var matcher = new NodeMatcher(nodeTypeNum, nodeName, shouldLowerCase);
+    var ancestors = []; // array of non-empty arrays of matching ancestors
+    for (var i = 0; i < nodeList.length; ++i) {
+      var node = nodeList[i];
+      var isFirst = true;
+      var a = [];
+      while (null != node) {
+        if (!isFirst || andSelf) {
+          if (matcher.matches(node))
+            a.push(node);
+        }
+        isFirst = false;
+        node = node.parentNode || node.ownerElement;
+      }
+      if (0 < a.length)
+        ancestors.push(a);
+    }
+    var lasts = [];
+    for (var i = 0; i < ancestors.length; ++i) lasts.push(ancestors[i].length);
+    var nodeMultiSet = new NodeMultiSet(true);
+    var newCtx = {nodes:[], pos:[], lasts:[]};
+    while (0 < ancestors.length) {
+      var pos = [ancestors[0].length];
+      var last = [lasts[0]];
+      var node = ancestors[0].pop();
+      for (var i = ancestors.length - 1; i > 0; --i) {
+        if (node === ancestors[i][ancestors[i].length - 1]) {
+          pos.push(ancestors[i].length);
+          last.push(lasts[i]);
+          ancestors[i].pop();
+          if (0 === ancestors[i].length) {
+            ancestors.splice(i, i+1);
+            lasts.splice(i, i+1);
+          }
+        }
+      }
+      if (0 === ancestors[0].length) {
+        ancestors.shift();
+        lasts.shift();
+      }
+      newCtx.nodes.push(node);
+      newCtx.pos.push(pos);
+      newCtx.lasts.push(last);
+    }
+    return newCtx;
+  }
+  /** Helper function for sortDocumentOrder. Returns a list of indices, from the
+   * node to the root, of positions within parent.
+   * For convenience, the node is the first element of the array.
+   */
+  function addressVector(node) {
+    var r = [node];
+    if (null != node.ownerElement) {
+      node = node.ownerElement;
+      r.push(-1);
+    }
+    while (null != node) {
+      var i = 0;
+      while (null != node.previousSibling) {
+        node = node.previousSibling;
+        i++;
+      }
+      r.push(i);
+      node = node.parentNode
+    }
+    return r;
+  }
+  function addressComparator(a, b) {
+    var minlen = Math.min(a.length - 1, b.length - 1),  // not including [0]=node
+        alen = a.length,
+        blen = b.length;
+    if (a[0] === b[0]) return 0;
+    var c;
+    for (var i = 0; i < minlen; ++i) {
+      c = a[alen - i - 1] - b[blen - i - 1];
+      if (0 !== c)
+        break;
+    }
+    if (null == c || 0 === c) {
+      // All equal until one of the nodes. The longer one is the descendant.
+      c = alen - blen;
+    }
+    if (0 === c)
+      c = a.nodeName - b.nodeName;
+    if (0 === c)
+      c = 1;
+    return c;
+  }
+  var sortUniqDocumentOrder = xpath.sortUniqDocumentOrder = function(nodes) {
+    var a = [];
+    for (var i = 0; i < nodes.length; i++) {
+      var node = nodes[i];
+      var v = addressVector(node);
+      a.push(v);
+    }
+    a.sort(addressComparator);
+    var b = [];
+    for (var i = 0; i < a.length; i++) {
+      if (0 < i && a[i][0] === a[i - 1][0])
+        continue;
+      b.push(a[i][0]);
+    }
+    return b;
+  }
+  /** Sort node multiset. Does not do any de-duping. */
+  function sortNodeMultiSet(nodeMultiSet) {
+    var a = [];
+    for (var i = 0; i < nodeMultiSet.nodes.length; i++) {
+      var v = addressVector(nodeMultiSet.nodes[i]);
+      a.push({v:v, n:nodeMultiSet.nodes[i],
+              p:nodeMultiSet.pos[i], l:nodeMultiSet.lasts[i]});
+    }
+    a.sort(compare);
+    var r = {nodes:[], pos:[], lasts:[]};
+    for (var i = 0; i < a.length; ++i) {
+      r.nodes.push(a[i].n);
+      r.pos.push(a[i].p);
+      r.lasts.push(a[i].l);
+    }
+    function compare(x, y) {
+      return addressComparator(x.v, y.v);
+    }
+    return r;
+  }
+  /** Returns an array containing all the ancestors down to a node.
+   * The array starts with document.
+   */
+  function nodeAndAncestors(node) {
+    var ancestors = [node];
+    var p = node;
+    while (p = p.parentNode || p.ownerElement) {
+      ancestors.unshift(p);
+    }
+    return ancestors;
+  }
+  function compareSiblings(a, b) {
+    if (a === b) return 0;
+    var c = a;
+    while (c = c.previousSibling) {
+      if (c === b)
+        return 1;  // b < a
+    }
+    c = b;
+    while (c = c.previousSibling) {
+      if (c === a)
+        return -1;  // a < b
+    }
+    throw new Error('a and b are not siblings: ' + xpath.stringifyObject(a) + ' vs ' + xpath.stringifyObject(b));
+  }
+  /** The merge in merge-sort.*/
+  function mergeNodeLists(x, y) {
+    var a, b, aanc, banc, r = [];
+    if ('object' !== typeof x)
+      throw new XPathException(XPathException.INVALID_EXPRESSION_ERR,
+                               'Invalid LHS for | operator ' +
+                               '(expected node-set): ' + x);
+    if ('object' !== typeof y)
+      throw new XPathException(XPathException.INVALID_EXPRESSION_ERR,
+                               'Invalid LHS for | operator ' +
+                               '(expected node-set): ' + y);
+    while (true) {
+      if (null == a) {
+        a = x.shift();
+        if (null != a)
+          aanc = addressVector(a);
+      }
+      if (null == b) {
+        b = y.shift();
+        if (null != b)
+          banc = addressVector(b);
+      }
+      if (null == a || null == b) break;
+      var c = addressComparator(aanc, banc);
+      if (c < 0) {
+        r.push(a);
+        a = null;
+        aanc = null;
+      } else if (c > 0) {
+        r.push(b);
+        b = null;
+        banc = null;
+      } else if (a.nodeName < b.nodeName) {  // attributes
+        r.push(a);
+        a = null;
+        aanc = null;
+      } else if (a.nodeName > b.nodeName) {  // attributes
+        r.push(b);
+        b = null;
+        banc = null;
+      } else if (a !== b) {
+        // choose b arbitrarily
+        r.push(b);
+        b = null;
+        banc = null;
+      } else {
+        console.assert(a === b, c);
+        // just skip b without pushing it.
+        b = null;
+        banc = null;
+      }
+    }
+    while (a) {
+      r.push(a);
+      a = x.shift();
+    }
+    while (b) {
+      r.push(b);
+      b = y.shift();
+    }
+    return r;
+  }
+  function comparisonHelper(test, x, y, isNumericComparison) {
+    var coersion;
+    if (isNumericComparison)
+      coersion = fn.number;
+    else coersion =
+      'boolean' === typeof x || 'boolean' === typeof y ? fn['boolean'] :
+      'number' === typeof x || 'number' === typeof y ? fn.number :
+      fn.string;
+    if ('object' === typeof x && 'object' === typeof y) {
+      var aMap = {};
+      for (var i = 0; i < x.nodes.length; ++i) {
+        var xi = coersion({nodes:[x.nodes[i]]});
+        for (var j = 0; j < y.nodes.length; ++j) {
+          var yj = coersion({nodes:[y.nodes[j]]});
+          if (test(xi, yj)) return true;
+        }
+      }
+      return false;
+    } else if ('object' === typeof x && x.nodes && x.nodes.length) {
+      for (var i = 0; i < x.nodes.length; ++i) {
+        var xi = coersion({nodes:[x.nodes[i]]}), yc = coersion(y);
+        if (test(xi, yc))
+          return true;
+      }
+      return false;
+    } else if ('object' === typeof y && x.nodes && x.nodes.length) {
+      for (var i = 0; i < x.nodes.length; ++i) {
+        var yi = coersion({nodes:[y.nodes[i]]}), xc = coersion(x);
+        if (test(xc, yi))
+          return true;
+      }
+      return false;
+    } else {
+      var xc = coersion(x), yc = coersion(y);
+      return test(xc, yc);
+    }
+  }
+  var axes = xpath.axes = {
+    'ancestor':
+      function ancestor(nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase) {
+        return ancestorHelper(
+          nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase, false);
+      },
+    'ancestor-or-self':
+      function ancestorOrSelf(nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase) {
+        return ancestorHelper(
+          nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase, true);
+      },
+    'attribute':
+      function attribute(nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase) {
+        // TODO: figure out whether positions should be undefined here.
+        var matcher = new NodeMatcher(nodeTypeNum, nodeName, shouldLowerCase);
+        var nodeMultiSet = new NodeMultiSet(false);
+        if (null != nodeName) {
+          // TODO: with namespace
+          for (var i = 0; i < nodeList.length; ++i) {
+            var node = nodeList[i];
+            if (null == node.getAttributeNode)
+              continue;  // only Element has .getAttributeNode
+            var attr = node.getAttributeNode(nodeName);
+            if (null != attr && matcher.matches(attr)) {
+              nodeMultiSet.pushSeries();
+              nodeMultiSet.addNode(attr);
+              nodeMultiSet.popSeries();
+            }
+          }
+        } else {
+          for (var i = 0; i < nodeList.length; ++i) {
+            var node = nodeList[i];
+            if (null != node.attributes) {
+              nodeMultiSet.pushSeries();
+              for (var j = 0; j < node.attributes.length; j++) {  // all nodes have .attributes
+                var attr = node.attributes[j];
+                if (matcher.matches(attr))  // TODO: I think this check is unnecessary
+                  nodeMultiSet.addNode(attr);
+              }
+              nodeMultiSet.popSeries();
+            }
+          }
+        }
+        return nodeMultiSet.finalize();
+      },
+    'child':
+      function child(nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase) {
+        var matcher = new NodeMatcher(nodeTypeNum, nodeName, shouldLowerCase);
+        var nodeMultiSet = new NodeMultiSet(false);
+        for (var i = 0; i < nodeList.length; ++i) {
+          var n = nodeList[i];
+          if (n.ownerElement)  // skip attribute nodes' text child.
+            continue;
+          if (n.childNodes) {
+            nodeMultiSet.pushSeries();
+            var childList = 1 === nodeTypeNum && null != n.children ?
+                n.children : n.childNodes;
+            for (var j = 0; j < childList.length; ++j) {
+              var child = childList[j];
+              if (matcher.matches(child)) {
+                nodeMultiSet.addNode(child);
+              }
+              // don't have to do de-duping because children have parent,
+              // which are current context.
+            }
+            nodeMultiSet.popSeries();
+          }
+        }
+        nodeMultiSet.finalize();
+        return sortNodeMultiSet(nodeMultiSet);
+      },
+    'descendant':
+      function descenant(nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase) {
+        return descenantHelper(
+          nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase, false);
+      },
+    'descendant-or-self':
+      function descenantOrSelf(nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase) {
+        return descenantHelper(
+          nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase, true);
+      },
+    'following':
+      function following(nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase) {
+        return followingHelper(nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase);
+      },
+    'following-sibling':
+      function followingSibling(nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase) {
+        return followingSiblingHelper(
+          nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase,
+          Array.prototype.shift, function() {return this[0];},
+          function(node) {return node.nextSibling;});
+      },
+    'namespace':
+      function namespace(nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase) {
+        // TODO
+      },
+    'parent':
+      function parent(nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase) {
+        var matcher = new NodeMatcher(nodeTypeNum, nodeName, shouldLowerCase);
+        var nodes = [], pos = [];
+        for (var i = 0; i < nodeList.length; ++i) {
+          var parent = nodeList[i].parentNode || nodeList[i].ownerElement;
+          if (null == parent)
+            continue;
+          if (!matcher.matches(parent))
+            continue;
+          if (nodes.length > 0 && parent === nodes[nodes.length-1])
+            continue;
+          nodes.push(parent);
+          pos.push([1]);
+        }
+        return {nodes:nodes, pos:pos, lasts:pos};
+      },
+    'preceding':
+      function preceding(nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase) {
+        return precedingHelper(
+          nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase);
+      },
+    'preceding-sibling':
+      function precedingSibling(nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase) {
+        return followingSiblingHelper(
+          nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase,
+          Array.prototype.pop, function() {return this[this.length-1];},
+          function(node) {return node.previousSibling},
+          false, true);
+      },
+    'self':
+      function self(nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase) {
+        var nodes = [], pos = [];
+        var matcher = new NodeMatcher(nodeTypeNum, nodeName, shouldLowerCase);
+        for (var i = 0; i < nodeList.length; ++i) {
+          if (matcher.matches(nodeList[i])) {
+            nodes.push(nodeList[i]);
+            pos.push([1]);
+          }
+        }
+        return {nodes: nodes, pos: pos, lasts: pos}
+      }
+  };
+
+  /***************************************************************************
+   *                         Evaluation: functions                           *
+   ***************************************************************************/
+  var fn = {
+    'number': function number(optObject) {
+      if ('number' === typeof optObject)
+        return optObject;
+      if ('string' === typeof optObject)
+        return parseFloat(optObject);  // note: parseFloat(' ') -> NaN, unlike +' ' -> 0.
+      if ('boolean' === typeof optObject)
+        return +optObject;
+      return fn.number(fn.string.call(this, optObject));  // for node-sets
+    },
+    'string': function string(optObject) {
+      if (null == optObject)
+        return fn.string(this);
+      if ('string' === typeof optObject || 'boolean' === typeof optObject ||
+          'number' === typeof optObject)
+        return '' + optObject;
+      if (0 == optObject.nodes.length) return '';
+      if (null != optObject.nodes[0].textContent)
+        return optObject.nodes[0].textContent;
+      return optObject.nodes[0].nodeValue;
+    },
+    'boolean': function booleanVal(x) {
+      return 'object' === typeof x ? x.nodes.length > 0 : !!x;
+    },
+    'last': function last() {
+      console.assert(Array.isArray(this.pos));
+      console.assert(Array.isArray(this.lasts));
+      console.assert(1 === this.pos.length);
+      console.assert(1 === this.lasts.length);
+      console.assert(1 === this.lasts[0].length);
+      return this.lasts[0][0];
+    },
+    'position': function position() {
+      console.assert(Array.isArray(this.pos));
+      console.assert(Array.isArray(this.lasts));
+      console.assert(1 === this.pos.length);
+      console.assert(1 === this.lasts.length);
+      console.assert(1 === this.pos[0].length);
+      return this.pos[0][0];
+    },
+    'count': function count(nodeSet) {
+      if ('object' !== typeof nodeSet)
+        throw new XPathException(XPathException.INVALID_EXPRESSION_ERR,
+                                 'Position ' + stream.position() +
+                                 ': Function count(node-set) ' +
+                                 'got wrong argument type: ' + nodeSet);
+      return nodeSet.nodes.length;
+    },
+    'id': function id(object) {
+      var r = {nodes: []};
+      var doc = this.nodes[0].ownerDocument || this.nodes[0];
+      console.assert(doc);
+      var ids;
+      if ('object' === typeof object) {
+        // for node-sets, map id over each node value.
+        ids = [];
+        for (var i = 0; i < object.nodes.length; ++i) {
+          var idNode = object.nodes[i];
+          var idsString = fn.string({nodes:[idNode]});
+          var a = idsString.split(/[ \t\r\n]+/g);
+          Array.prototype.push.apply(ids, a);
+        }
+      } else {
+        var idsString = fn.string(object);
+        var a = idsString.split(/[ \t\r\n]+/g);
+        ids = a;
+      }
+      for (var i = 0; i < ids.length; ++i) {
+        var id = ids[i];
+        if (0 === id.length)
+          continue;
+        var node = doc.getElementById(id);
+        if (null != node)
+          r.nodes.push(node);
+      }
+      r.nodes = sortUniqDocumentOrder(r.nodes);
+      return r;
+    },
+    'local-name': function(nodeSet) {
+      if (null == nodeSet)
+        return fn.name(this);
+      if (null == nodeSet.nodes) {
+        throw new XPathException(XPathException.INVALID_EXPRESSION_ERR,
+                                 'argument to name() must be a node-set. got ' + nodeSet);
+      }
+      // TODO: namespaced version
+      return nodeSet.nodes[0].nodeName.toLowerCase();  // TODO: no toLowerCase for xml
+    },
+    'namespace-uri': function(nodeSet) {
+      // TODO
+      throw new Error('not implemented yet');
+    },
+    'name': function(nodeSet) {
+      if (null == nodeSet)
+        return fn.name(this);
+      if (null == nodeSet.nodes) {
+        throw new XPathException(XPathException.INVALID_EXPRESSION_ERR,
+                                 'argument to name() must be a node-set. got ' + nodeSet);
+      }
+      return nodeSet.nodes[0].nodeName.toLowerCase();  // TODO: no toLowerCase for xml
+    },
+    'concat': function concat(x) {
+      var l = [];
+      for (var i = 0; i < arguments.length; ++i) {
+        l.push(fn.string(arguments[i]));
+      }
+      return l.join('');
+    },
+    'starts-with': function startsWith(a, b) {
+      var as = fn.string(a), bs = fn.string(b);
+      return as.substr(0, bs.length) === bs;
+    },
+    'contains': function contains(a, b) {
+      var as = fn.string(a), bs = fn.string(b);
+      var i = as.indexOf(bs);
+      if (-1 === i) return false;
+      return true;
+    },
+    'substring-before': function substringBefore(a, b) {
+      var as = fn.string(a), bs = fn.string(b);
+      var i = as.indexOf(bs);
+      if (-1 === i) return '';
+      return as.substr(0, i);
+    },
+    'substring-after': function substringBefore(a, b) {
+      var as = fn.string(a), bs = fn.string(b);
+      var i = as.indexOf(bs);
+      if (-1 === i) return '';
+      return as.substr(i + bs.length);
+    },
+    'substring': function substring(string, start, optEnd) {
+      if (null == string || null == start) {
+        throw new XPathException(XPathException.INVALID_EXPRESSION_ERR,
+                                 'Must be at least 2 arguments to string()');
+      }
+      var sString = fn.string(string),
+          iStart = fn.round(start),
+          iEnd = optEnd == null ? null : fn.round(optEnd);
+      // Note that xpath string positions user 1-based index
+      if (iEnd == null)
+        return sString.substr(iStart - 1);
+      else
+        return sString.substr(iStart - 1, iEnd);
+    },
+    'string-length': function stringLength(optString) {
+      return fn.string.call(this, optString).length;
+    },
+    'normalize-space': function normalizeSpace(optString) {
+      var s = fn.string.call(this, optString);
+      return s.replace(/[ \t\r\n]+/g, ' ').replace(/^ | $/g, '');
+    },
+    'translate': function translate(string, from, to) {
+      var sString = fn.string.call(this, string),
+          sFrom = fn.string(from),
+          sTo = fn.string(to);
+      var eachCharRe = [];
+      var map = {};
+      for (var i = 0; i < sFrom.length; ++i) {
+        var c = sFrom.charAt(i);
+        map[c] = sTo.charAt(i);  // returns '' if beyond length of sTo.
+        // copied from goog.string.regExpEscape in the Closure library.
+        eachCharRe.push(
+          c.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g, '\\$1').
+            replace(/\x08/g, '\\x08'));
+      }
+      var re = new RegExp(eachCharRe.join('|'), 'g');
+      return sString.replace(re, function(c) {return map[c];});
+    },
+    /// Boolean functions
+    'not': function not(x) {
+      var bx = fn['boolean'](x);
+      return !bx;
+    },
+    'true': function trueVal() { return true; },
+    'false': function falseVal() { return false; },
+    // TODO
+    'lang': function lang(string) { throw new Error('Not implemented');},
+    'sum': function sum(optNodeSet) {
+      if (null == optNodeSet) return fn.sum(this);
+      // for node-sets, map id over each node value.
+      var sum = 0;
+      for (var i = 0; i < optNodeSet.nodes.length; ++i) {
+        var node = optNodeSet.nodes[i];
+        var x = fn.number({nodes:[node]});
+        sum += x;
+      }
+      return sum;
+    },
+    'floor': function floor(number) {
+      return Math.floor(fn.number(number));
+    },
+    'ceiling': function ceiling(number) {
+      return Math.ceil(fn.number(number));
+    },
+    'round': function round(number) {
+      return Math.round(fn.number(number));
+    }
+  };
+  /***************************************************************************
+   *                         Evaluation: operators                           *
+   ***************************************************************************/
+  var more = {
+    UnaryMinus: function(x) { return -fn.number(x); },
+    '+': function(x, y) { return fn.number(x) + fn.number(y); },
+    '-': function(x, y) { return fn.number(x) - fn.number(y); },
+    '*': function(x, y) { return fn.number(x) * fn.number(y); },
+    'div': function(x, y) { return fn.number(x) / fn.number(y); },
+    'mod': function(x, y) { return fn.number(x) % fn.number(y); },
+    '<': function(x, y) {
+      return comparisonHelper(function(x, y) { return fn.number(x) < fn.number(y);}, x, y, true);
+    },
+    '<=': function(x, y) {
+      return comparisonHelper(function(x, y) { return fn.number(x) <= fn.number(y);}, x, y, true);
+    },
+    '>':  function(x, y) {
+      return comparisonHelper(function(x, y) { return fn.number(x) > fn.number(y);}, x, y, true);
+    },
+    '>=': function(x, y) {
+      return comparisonHelper(function(x, y) { return fn.number(x) >= fn.number(y);}, x, y, true);
+    },
+    'and': function(x, y) { return fn['boolean'](x) && fn['boolean'](y); },
+    'or': function(x, y) { return fn['boolean'](x) || fn['boolean'](y); },
+    '|': function(x, y) { return {nodes: mergeNodeLists(x.nodes, y.nodes)}; },
+    '=': function(x, y) {
+      // optimization for two node-sets case: avoid n^2 comparisons.
+      if ('object' === typeof x && 'object' === typeof y) {
+        var aMap = {};
+        for (var i = 0; i < x.nodes.length; ++i) {
+          var s = fn.string({nodes:[x.nodes[i]]});
+          aMap[s] = true;
+        }
+        for (var i = 0; i < y.nodes.length; ++i) {
+          var s = fn.string({nodes:[y.nodes[i]]});
+          if (aMap[s]) return true;
+        }
+        return false;
+      } else {
+        return comparisonHelper(function(x, y) {return x === y;}, x, y);
+      }
+    },
+    '!=': function(x, y) {
+      // optimization for two node-sets case: avoid n^2 comparisons.
+      if ('object' === typeof x && 'object' === typeof y) {
+        if (0 === x.nodes.length || 0 === y.nodes.length) return false;
+        var aMap = {};
+        for (var i = 0; i < x.nodes.length; ++i) {
+          var s = fn.string({nodes:[x.nodes[i]]});
+          aMap[s] = true;
+        }
+        for (var i = 0; i < y.nodes.length; ++i) {
+          var s = fn.string({nodes:[y.nodes[i]]});
+          if (!aMap[s]) return true;
+        }
+        return false;
+      } else {
+        return comparisonHelper(function(x, y) {return x !== y;}, x, y);
+      }
+    }
+  };
+  var nodeTypes = xpath.nodeTypes = {
+    'node': 0,
+    'attribute': 2,
+    'comment': 8, // this.doc.COMMENT_NODE,
+    'text': 3, // this.doc.TEXT_NODE,
+    'processing-instruction': 7, // this.doc.PROCESSING_INSTRUCTION_NODE,
+    'element': 1  //this.doc.ELEMENT_NODE
+  };
+  /** For debugging and unit tests: returnjs a stringified version of the
+   * argument. */
+  var stringifyObject = xpath.stringifyObject = function stringifyObject(ctx) {
+    var seenKey = 'seen' + Math.floor(Math.random()*1000000000);
+    return JSON.stringify(helper(ctx));
+
+    function helper(ctx) {
+      if (Array.isArray(ctx)) {
+        return ctx.map(function(x) {return helper(x);});
+      }
+      if ('object' !== typeof ctx) return ctx;
+      if (null == ctx) return ctx;
+    //  if (ctx.toString) return ctx.toString();
+      if (null != ctx.outerHTML) return ctx.outerHTML;
+      if (null != ctx.nodeValue) return ctx.nodeName + '=' + ctx.nodeValue;
+      if (ctx[seenKey]) return '[circular]';
+      ctx[seenKey] = true;
+      var nicer = {};
+      for (var key in ctx) {
+        if (seenKey === key)
+          continue;
+        try {
+          nicer[key] = helper(ctx[key]);
+        } catch (e) {
+          nicer[key] = '[exception: ' + e.message + ']';
+        }
+      }
+      delete ctx[seenKey];
+      return nicer;
+    }
+  }
+  var Evaluator = xpath.Evaluator = function Evaluator(doc) {
+    this.doc = doc;
+  }
+  Evaluator.prototype = {
+    val: function val(ast, ctx) {
+      console.assert(ctx.nodes);
+
+      if ('number' === typeof ast || 'string' === typeof ast) return ast;
+      if (more[ast[0]]) {
+        var evaluatedParams = [];
+        for (var i = 1; i < ast.length; ++i) {
+          evaluatedParams.push(this.val(ast[i], ctx));
+        }
+        var r = more[ast[0]].apply(ctx, evaluatedParams);
+        return r;
+      }
+      switch (ast[0]) {
+        case 'Root': return {nodes: [this.doc]};
+        case 'FunctionCall':
+          var functionName = ast[1], functionParams = ast[2];
+          if (null == fn[functionName])
+            throw new XPathException(XPathException.INVALID_EXPRESSION_ERR,
+                                     'Unknown function: ' + functionName);
+          var evaluatedParams = [];
+          for (var i = 0; i < functionParams.length; ++i) {
+            evaluatedParams.push(this.val(functionParams[i], ctx));
+          }
+          var r = fn[functionName].apply(ctx, evaluatedParams);
+          return r;
+        case 'Predicate':
+          var lhs = this.val(ast[1], ctx);
+          var ret = {nodes: []};
+          var contexts = eachContext(lhs);
+          for (var i = 0; i < contexts.length; ++i) {
+            var singleNodeSet = contexts[i];
+            var rhs = this.val(ast[2], singleNodeSet);
+            var success;
+            if ('number' === typeof rhs) {
+              success = rhs === singleNodeSet.pos[0][0];
+            } else {
+              success = fn['boolean'](rhs);
+            }
+            if (success) {
+              var node = singleNodeSet.nodes[0];
+              ret.nodes.push(node);
+              // skip over all the rest of the same node.
+              while (i+1 < contexts.length && node === contexts[i+1].nodes[0]) {
+                i++;
+              }
+            }
+          }
+          return ret;
+        case 'PathExpr':
+          // turn the path into an expressoin; i.e., remove the position
+          // information of the last axis.
+          var x = this.val(ast[1], ctx);
+          // Make the nodeset a forward-direction-only one.
+          if (x.finalize) {  // it is a NodeMultiSet
+            for (var i = 0; i < x.nodes.length; ++i) {
+              console.assert(null != x.nodes[i].nodeType);
+            }
+            return {nodes: x.nodes};
+          } else {
+            return x;
+          }
+        case '/':
+          // TODO: don't generate '/' nodes, just Axis nodes.
+          var lhs = this.val(ast[1], ctx);
+          console.assert(null != lhs);
+          var r = this.val(ast[2], lhs);
+          console.assert(null != r);
+          return r;
+        case 'Axis':
+          // All the axis tests from Step. We only get AxisSpecifier NodeTest,
+          // not the predicate (which is applied later)
+          var axis = ast[1],
+              nodeType = ast[2],
+              nodeTypeNum = nodeTypes[nodeType],
+              shouldLowerCase = true,  // TODO: give option
+              nodeName = ast[3] && shouldLowerCase ? ast[3].toLowerCase() : ast[3];
+          nodeName = nodeName === '*' ? null : nodeName;
+          if ('object' !== typeof ctx) return {nodes:[], pos:[]};
+          var nodeList = ctx.nodes.slice();  // TODO: is copy needed?
+          var r = axes[axis](nodeList  /*destructive!*/, nodeTypeNum, nodeName, shouldLowerCase);
+          return r;
+      }
+    }
+  };
+  var evaluate = xpath.evaluate = function evaluate(expr, doc, context) {
+    //var astFactory = new AstEvaluatorFactory(doc, context);
+    var stream = new Stream(expr);
+    var ast = parse(stream, astFactory);
+    var val = new Evaluator(doc).val(ast, {nodes: [context]});
+    return val;
+  }
+
+  /***************************************************************************
+   *                           DOM interface                                 *
+   ***************************************************************************/
+  var XPathException = xpath.XPathException = function XPathException(code, message) {
+    var e = new Error(message);
+    this.__proto__ = e;
+    this.name = 'XPathException';
+    this.code = code;
+  }
+  XPathException.prototype = Object.create(Error.prototype);
+  XPathException.prototype.__proto__ = XPathException;
+  XPathException.INVALID_EXPRESSION_ERR = 51;
+  XPathException.TYPE_ERR = 52;
+
+
+  var XPathEvaluator = xpath.XPathEvaluator = function XPathEvaluator() {}
+  XPathEvaluator.prototype = {
+    createExpression: function(expression, resolver) {
+      return new XPathExpression(expression, resolver);
+    },
+    createNSResolver: function(nodeResolver) {
+      // TODO
+    },
+    evaluate: function evaluate(expression, contextNode, resolver, type, result) {
+      var expr = new XPathExpression(expression, resolver);
+      return expr.evaluate(contextNode, type, result);
+    }
+  };
+
+
+  var XPathExpression = xpath.XPathExpression = function XPathExpression(expression, resolver, optDoc) {
+    var stream = new Stream(expression);
+    this._ast = parse(stream, astFactory);
+    this._doc = optDoc;
+  }
+  XPathExpression.prototype = {
+    evaluate: function evaluate(contextNode, type, result) {
+      if (null == contextNode.nodeType)
+        throw new Error('bad argument (expected context node): ' + contextNode);
+      var doc = contextNode.ownerDocument || contextNode;
+      if (null != this._doc && this._doc !== doc) {
+        throw new core.DOMException(
+            core.WRONG_DOCUMENT_ERR,
+            'The document must be the same as the context node\'s document.');
+      }
+      var evaluator = new Evaluator(doc);
+      var value = evaluator.val(this._ast, {nodes: [contextNode]});
+      if (XPathResult.NUMBER_TYPE === type)
+        value = fn.number(value);
+      else if (XPathResult.STRING_TYPE === type)
+        value = fn.string(value);
+      else if (XPathResult.BOOLEAN_TYPE === type)
+        value = fn['boolean'](value);
+      else if (XPathResult.ANY_TYPE !== type &&
+               XPathResult.UNORDERED_NODE_ITERATOR_TYPE !== type &&
+               XPathResult.ORDERED_NODE_ITERATOR_TYPE !== type &&
+               XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE !== type &&
+               XPathResult.ORDERED_NODE_SNAPSHOT_TYPE !== type &&
+               XPathResult.ANY_UNORDERED_NODE_TYPE !== type &&
+               XPathResult.FIRST_ORDERED_NODE_TYPE !== type)
+        throw new core.DOMException(
+            core.NOT_SUPPORTED_ERR,
+            'You must provide an XPath result type (0=any).');
+      else if (XPathResult.ANY_TYPE !== type &&
+               'object' !== typeof value)
+        throw new XPathException(
+            XPathException.TYPE_ERR,
+            'Value should be a node-set: ' + value);
+      return new XPathResult(doc, value, type);
+    }
+  }
+
+  var XPathResult = xpath.XPathResult = function XPathResult(doc, value, resultType) {
+    this._value = value;
+    this._resultType = resultType;
+    this._i = 0;
+    this._invalidated = false;
+    if (this.resultType === XPathResult.UNORDERED_NODE_ITERATOR_TYPE ||
+        this.resultType === XPathResult.ORDERED_NODE_ITERATOR_TYPE) {
+      doc.addEventListener('DOMSubtreeModified', invalidate, true);
+      var self = this;
+      function invalidate() {
+        self._invalidated = true;
+        doc.removeEventListener('DOMSubtreeModified', invalidate, true);
+      }
+    }
+  }
+  XPathResult.ANY_TYPE = 0;
+  XPathResult.NUMBER_TYPE = 1;
+  XPathResult.STRING_TYPE = 2;
+  XPathResult.BOOLEAN_TYPE = 3;
+  XPathResult.UNORDERED_NODE_ITERATOR_TYPE = 4;
+  XPathResult.ORDERED_NODE_ITERATOR_TYPE = 5;
+  XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE = 6;
+  XPathResult.ORDERED_NODE_SNAPSHOT_TYPE = 7;
+  XPathResult.ANY_UNORDERED_NODE_TYPE = 8;
+  XPathResult.FIRST_ORDERED_NODE_TYPE = 9;
+  XPathResult.prototype = {
+    // XPathResultType
+    get resultType() {
+      if (this._resultType) return this._resultType;
+      switch (typeof this._value) {
+        case 'number': return XPathResult.NUMBER_TYPE;
+        case 'string': return XPathResult.STRING_TYPE;
+        case 'boolean': return XPathResult.BOOLEAN_TYPE;
+        default: return XPathResult.UNORDERED_NODE_ITERATOR_TYPE;
+      }
+    },
+    get numberValue() {
+      if (XPathResult.NUMBER_TYPE !== this.resultType)
+        throw new XPathException(XPathException.TYPE_ERR,
+                                 'You should have asked for a NUMBER_TYPE.');
+      return this._value;
+    },
+    get stringValue() {
+      if (XPathResult.STRING_TYPE !== this.resultType)
+        throw new XPathException(XPathException.TYPE_ERR,
+                                 'You should have asked for a STRING_TYPE.');
+      return this._value;
+    },
+    get booleanValue() {
+      if (XPathResult.BOOLEAN_TYPE !== this.resultType)
+        throw new XPathException(XPathException.TYPE_ERR,
+                                 'You should have asked for a BOOLEAN_TYPE.');
+      return this._value;
+    },
+    get singleNodeValue() {
+      if (XPathResult.ANY_UNORDERED_NODE_TYPE !== this.resultType &&
+          XPathResult.FIRST_ORDERED_NODE_TYPE !== this.resultType)
+        throw new XPathException(
+            XPathException.TYPE_ERR,
+            'You should have asked for a FIRST_ORDERED_NODE_TYPE.');
+      return this._value.nodes[0] || null;
+    },
+    get invalidIteratorState() {
+      if (XPathResult.UNORDERED_NODE_ITERATOR_TYPE !== this.resultType &&
+          XPathResult.ORDERED_NODE_ITERATOR_TYPE !== this.resultType)
+        return false;
+      return !!this._invalidated;
+    },
+    get snapshotLength() {
+      if (XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE !== this.resultType &&
+          XPathResult.ORDERED_NODE_SNAPSHOT_TYPE !== this.resultType)
+        throw new XPathException(
+            XPathException.TYPE_ERR,
+            'You should have asked for a ORDERED_NODE_SNAPSHOT_TYPE.');
+      return this._value.nodes.length;
+    },
+    iterateNext: function iterateNext() {
+      if (XPathResult.UNORDERED_NODE_ITERATOR_TYPE !== this.resultType &&
+          XPathResult.ORDERED_NODE_ITERATOR_TYPE !== this.resultType)
+        throw new XPathException(
+            XPathException.TYPE_ERR,
+            'You should have asked for a ORDERED_NODE_ITERATOR_TYPE.');
+      if (this.invalidIteratorState)
+        throw new core.DOMException(
+            core.INVALID_STATE_ERR,
+            'The document has been mutated since the result was returned');
+      return this._value.nodes[this._i++] || null;
+    },
+    snapshotItem: function snapshotItem(index) {
+      if (XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE !== this.resultType &&
+          XPathResult.ORDERED_NODE_SNAPSHOT_TYPE !== this.resultType)
+        throw new XPathException(
+            XPathException.TYPE_ERR,
+            'You should have asked for a ORDERED_NODE_SNAPSHOT_TYPE.');
+      return this._value.nodes[index] || null;
+    }
+  };
+  // so you can access ANY_TYPE etc. from the instances:
+  XPathResult.prototype.__proto__ = XPathResult;
+
+  core.XPathException = XPathException;
+  core.XPathExpression = XPathExpression;
+  core.XPathResult = XPathResult;
+  core.XPathEvaluator = XPathEvaluator;
+
+  core.Document.prototype.createExpression =
+    XPathEvaluator.prototype.createExpression;
+
+  core.Document.prototype.createNSResolver =
+      XPathEvaluator.prototype.createNSResolver;
+
+  core.Document.prototype.evaluate = XPathEvaluator.prototype.evaluate;
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/selectors/index.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/selectors/index.js
new file mode 100644
index 0000000..36e90af
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/selectors/index.js
@@ -0,0 +1,31 @@
+var nwmatcher = require("nwmatcher/src/nwmatcher-noqsa");
+
+function addNwmatcher(document) {
+  if (!document._nwmatcher) {
+    document._nwmatcher = nwmatcher({ document: document });
+    document._nwmatcher.configure({ UNIQUE_ID: false });
+  }
+  return document._nwmatcher;
+}
+
+exports.applyQuerySelectorPrototype = function(dom) {
+  dom.Document.prototype.querySelector = function(selector) {
+    return addNwmatcher(this).first(selector, this);
+  };
+
+  dom.Document.prototype.querySelectorAll = function(selector) {
+    return new dom.NodeList(addNwmatcher(this).select(selector, this));
+  };
+
+  dom.Element.prototype.querySelector = function(selector) {
+    return addNwmatcher(this.ownerDocument).first(selector, this);
+  };
+
+  dom.Element.prototype.querySelectorAll = function(selector) {
+    return new dom.NodeList(addNwmatcher(this.ownerDocument).select(selector, this));
+  };
+
+  dom.Element.prototype.matchesSelector = function(selector) {
+    return addNwmatcher(this.ownerDocument).match(this, selector);
+  };
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/utils.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/utils.js
new file mode 100644
index 0000000..ad93527
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/lib/jsdom/utils.js
@@ -0,0 +1,41 @@
+var path = require('path');
+
+/**
+ * Intercepts a method by replacing the prototype's implementation
+ * with a wrapper that invokes the given interceptor instead.
+ *
+ *     utils.intercept(core.Element, 'inserBefore',
+ *       function(_super, args, newChild, refChild) {
+ *         console.log('insertBefore', newChild, refChild);
+ *         return _super.apply(this, args);
+ *       }
+ *     );
+ */
+exports.intercept = function(clazz, method, interceptor) {
+  var proto = clazz.prototype,
+      _super = proto[method],
+      unwrapArgs = interceptor.length > 2;
+
+  proto[method] = function() {
+    if (unwrapArgs) {
+      var args = Array.prototype.slice.call(arguments);
+      args.unshift(_super, arguments);
+      return interceptor.apply(this, args);
+    }
+    else {
+      return interceptor.call(this, _super, arguments);
+    }
+  };
+};
+
+exports.toFileUrl = function (fileName) {
+  // Beyond just the `path.resolve`, this is mostly for the benefit of Windows,
+  // where we need to convert '\' to '/' and add an extra '/' prefix before the
+  // drive letter.
+  var pathname = path.resolve(process.cwd(), fileName).replace(/\\/g, '/');
+  if (pathname[0] !== '/') {
+    pathname = '/' + pathname;
+  }
+
+  return 'file://' + pathname;
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/.npmignore b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/.npmignore
new file mode 100644
index 0000000..4c0b0bb
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/.npmignore
@@ -0,0 +1,12 @@
+Makefile
+.lock-wscript
+node_modules
+build
+*.swp
+*.swo
+TODO
+Makefile.gyp
+*.Makefile
+*.target.gyp.mk
+gyp-mac-tool
+out
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/LICENSE.txt b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/LICENSE.txt
new file mode 100644
index 0000000..49fd917
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/LICENSE.txt
@@ -0,0 +1,22 @@
+Copyright (c) 2011 Brian McDaniel
+
+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/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/README.md b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/README.md
new file mode 100644
index 0000000..6a713a1
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/README.md
@@ -0,0 +1,106 @@
+# Contextify
+
+For Windows issues, see here: https://github.com/brianmcd/contextify/wiki/Windows-Installation-Guide
+
+Please add to the wiki if you find new issues/solutions.
+
+Turn an object into a V8 execution context.  A contextified object acts as the global 'this' when executing scripts in its context.  Contextify adds 3 methods to the contextified object: run(code, filename), getGlobal(), and dispose().  The main difference between Contextify and Node's vm methods is that Contextify allows asynchronous functions to continue executing in the Contextified object's context.  See vm vs. Contextify below for more discussion.
+
+## Examples
+```javascript
+var Contextify = require('contextify');
+var sandbox = { console : console, prop1 : 'prop1'};
+Contextify(sandbox);
+sandbox.run('console.log(prop1);');
+sandbox.dispose(); // free the resources allocated for the context.
+```
+
+```javascript
+var sandbox = Contextify(); // returns an empty contextified object.
+sandbox.run('var x = 3;');
+console.log(sandbox.x); // prints 3
+sandbox.dispose();
+```
+
+```javascript
+var sandbox = Contextify({setTimeout : setTimeout});
+sandbox.run("setTimeout(function () { x = 3; }, 5);");
+console.log(sandbox.x); // prints undefined
+setTimeout(function () {
+    console.log(sandbox.x); // prints 3
+    sandbox.dispose();
+}, 10);
+```
+## Details
+
+**Contextify([sandbox])**
+
+    sandbox - The object to contextify, which will be modified as described below
+              If no sandbox is specified, an empty object will be allocated and used instead.
+
+    Returns the contextified object.  It doesn't make a copy, so if you already have a reference
+    to the sandbox, you don't need to catch the return value.
+
+A Contextified object has 2 methods added to it:
+
+**run(code, [filename])**
+
+    code - string containing JavaScript to execute
+    filename  - an optional filename for debugging.
+
+    Runs the code in the Contextified object's context.
+
+**getGlobal()**
+
+Returns the actual global object for the V8 context.  The global object is initialized with interceptors (discussed below) which forward accesses on it to the contextified object.  This means the contextified object acts like the global object in most cases.  Sometimes, though, you need to make a reference to the actual global object.
+
+For example:
+
+```javascript
+var window = Contextify({console : console});
+window.window = window;
+window.run("console.log(window === this);");
+// prints false.
+```
+
+```javascript
+var window = Contextify({console : console});
+window.window = window.getGlobal();
+window.run("console.log(window === this);");
+// prints true
+```
+
+The global object returned by getGlobal() can be treated like the contextified sandbox object, except that defining getters/setters will not work on it.  Define getters and setters on the actual sandbox object instead.
+
+**dispose()**
+
+Frees the memory allocated for the underlying V8 context.  If you don't call this when you're done, the V8 context memory will leak, as will the sandbox memory, since the context's global stores a strong reference to the sandbox object.  You can still use your sandbox object after calling dispose(), but it's unsafe to use a global previously returned from getGlobal().  run, getGlobal, and dispose will be removed from the sandbox object.
+
+## Install
+
+    npm install contextify
+
+## require('vm') vs. Contextify
+
+Node's vm functions (runInContext etc) work by copying the values from the sandbox object onto a context's global object, executing the passed in script, then copying the results back.  This means that scripts that create asynchronous functions (using mechanisms like setTimeout) won't have see the results of executing those functions, since the copying in/out only occurs during an explicit call to runInContext and friends.  
+
+Contextify creates a V8 context, and uses interceptors (see: http://code.google.com/apis/v8/embed.html#interceptors) to forward global object accesses to the sandbox object.  This means there is no copying in or out, so asynchronous functions have the expected effect on the sandbox object.  
+
+## Tests
+
+Testing is done with nodeunit.  Run the tests with
+
+    nodeunit test/
+
+Output: 
+
+    OK: 92 assertions (27ms)
+
+
+## Building
+
+    node-waf configure build
+
+## Acknowledgments
+
+Inspiration taken from Assaf's Zombie.js context solution: https://github.com/assaf/zombie
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/binding.gyp b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/binding.gyp
new file mode 100644
index 0000000..2106404
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/binding.gyp
@@ -0,0 +1,8 @@
+{
+  'targets': [
+    {
+      'target_name': 'contextify',
+      'sources': [ 'src/contextify.cc' ]
+    }
+  ]
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/changelog b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/changelog
new file mode 100644
index 0000000..244764c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/changelog
@@ -0,0 +1,47 @@
+0.1.6
+    * Fix broken build with node >= 0.11.0 (Jamie Kirkpatrick - @jpk)
+0.1.5
+    * Fix broken builds on 0.9.11 and above (tomgco - #61)
+0.1.4
+    * Fix segfault on Node >= 0.9.6. (pyokagan)
+    * Allow pre-compiling scripts. (mroch)
+0.1.3
+    * Remove PrintException.
+0.1.2
+    * Renamed bindings.gyp to binding.gyp (Rex Morgan)
+    * More fixes for OS X build.
+0.1.1
+    * Add node-gyp build support (Nathan Rajlich)
+    * Fix build for OS X (stolen from einaros's work on ws :)).
+    * Better exception reporting (print error message and stack trace).
+0.1.0
+    * Fix: #13 - Can't use global.eval as function.
+    * Added [Named|Indexed]SecurityCallbacks to global ObjectTemplate.
+    * No longer detaching the global proxy.
+    * Refactored to use node::ObjectWrap.
+0.0.7
+    * Fix: #11 - Declared global variables treated as undefined
+
+0.0.6
+    * Fix: potential segfault when looking up properties on sandbox.
+
+0.0.5
+    * Better error feedback when the module isn't built on the current node
+      version.
+    * All builds now build to the Release directory, regardless of Node
+      version.
+
+0.0.4
+    * Defend against calling Contextify methods on the global after dispose()
+      has been called.
+    * Fix: npm install fails on Node 0.5.x.
+
+0.0.3
+    * Fix: segfault due to premature garbage collection of sandbox.
+    * Added dispose() method to clean up context.
+
+0.0.2
+    * Fix: memory leak due to creating unnecessary function instances.
+
+0.0.1
+    * Initial release
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/lib/contextify.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/lib/contextify.js
new file mode 100644
index 0000000..01020e0
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/lib/contextify.js
@@ -0,0 +1,48 @@
+var binding = require('bindings')('contextify');
+var ContextifyContext = binding.ContextifyContext;
+var ContextifyScript = binding.ContextifyScript;
+
+function Contextify (sandbox) {
+    if (typeof sandbox != 'object') {
+        sandbox = {};
+    }
+    var ctx = new ContextifyContext(sandbox);
+
+    sandbox.run = function () {
+        return ctx.run.apply(ctx, arguments);
+    };
+
+    sandbox.getGlobal = function () {
+        return ctx.getGlobal();
+    }
+
+    sandbox.dispose = function () {
+        sandbox.run = function () {
+            throw new Error("Called run() after dispose().");
+        };
+        sandbox.getGlobal = function () {
+            throw new Error("Called getGlobal() after dispose().");
+        };
+        sandbox.dispose = function () {
+            throw new Error("Called dispose() after dispose().");
+        };
+        ctx = null;
+    }
+    return sandbox;
+}
+
+Contextify.createContext = function (sandbox) {
+    if (typeof sandbox != 'object') {
+        sandbox = {};
+    }
+    return new ContextifyContext(sandbox);
+};
+
+Contextify.createScript = function (code, filename) {
+    if (typeof code != 'string') {
+        throw new TypeError('Code argument is required');
+    }
+    return new ContextifyScript(code, filename);
+};
+
+module.exports = Contextify;
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/node_modules/bindings/README.md b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/node_modules/bindings/README.md
new file mode 100644
index 0000000..585cf51
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/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.<anonymous> (/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 at 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/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/node_modules/bindings/bindings.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/node_modules/bindings/bindings.js
new file mode 100644
index 0000000..a40029b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/node_modules/bindings/bindings.js
@@ -0,0 +1,159 @@
+
+/**
+ * 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<l; i++) {
+    n = join.apply(null, opts.try[i].map(function (p) {
+      return opts[p] || p
+    }))
+    tries.push(n)
+    try {
+      b = opts.path ? require.resolve(n) : require(n)
+      if (!opts.path) {
+        b.path = n
+      }
+      return b
+    } catch (e) {
+      if (!/not find/i.test(e.message)) {
+        throw e
+      }
+    }
+  }
+
+  err = new Error('Could not locate the bindings file. Tried:\n'
+    + tries.map(function (a) { return opts.arrow + a }).join('\n'))
+  err.tries = tries
+  throw err
+}
+module.exports = exports = bindings
+
+
+/**
+ * Gets the filename of the JavaScript file that invokes this function.
+ * Used to help find the root directory of a module.
+ */
+
+exports.getFileName = function getFileName () {
+  var origPST = Error.prepareStackTrace
+    , origSTL = Error.stackTraceLimit
+    , dummy = {}
+    , fileName
+
+  Error.stackTraceLimit = 10
+
+  Error.prepareStackTrace = function (e, st) {
+    for (var i=0, l=st.length; i<l; i++) {
+      fileName = st[i].getFileName()
+      if (fileName !== __filename) {
+        return
+      }
+    }
+  }
+
+  // run the 'prepareStackTrace' function above
+  Error.captureStackTrace(dummy)
+  dummy.stack
+
+  // cleanup
+  Error.prepareStackTrace = origPST
+  Error.stackTraceLimit = origSTL
+
+  return fileName
+}
+
+/**
+ * Gets the root directory of a module, given an arbitrary filename
+ * somewhere in the module tree. The "root directory" is the directory
+ * containing the `package.json` file.
+ *
+ *   In:  /home/nate/node-native-module/lib/index.js
+ *   Out: /home/nate/node-native-module
+ */
+
+exports.getRoot = function getRoot (file) {
+  var dir = dirname(file)
+    , prev
+  while (true) {
+    if (dir === '.') {
+      // Avoids an infinite loop in rare cases, like the REPL
+      dir = process.cwd()
+    }
+    if (exists(join(dir, 'package.json')) || exists(join(dir, 'node_modules'))) {
+      // Found the 'package.json' file or 'node_modules' dir; we're done
+      return dir
+    }
+    if (prev === dir) {
+      // Got to the top
+      throw new Error('Could not find module root given file: "' + file
+                    + '". Do you have a `package.json` file? ')
+    }
+    // Try the parent dir next
+    prev = dir
+    dir = join(dir, '..')
+  }
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/node_modules/bindings/package.json b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/node_modules/bindings/package.json
new file mode 100644
index 0000000..dbfec94
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/node_modules/bindings/package.json
@@ -0,0 +1,31 @@
+{
+  "name": "bindings",
+  "description": "Helper module for loading your native module's .node file",
+  "keywords": [
+    "native",
+    "addon",
+    "bindings",
+    "gyp",
+    "waf",
+    "c",
+    "c++"
+  ],
+  "version": "1.1.1",
+  "author": {
+    "name": "Nathan Rajlich",
+    "email": "nathan at tootallnate.net",
+    "url": "http://tootallnate.net"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/TooTallNate/node-bindings.git"
+  },
+  "main": "./bindings.js",
+  "readme": "node-bindings\n=============\n### Helper module for loading your native module's .node file\n\nThis is a helper module for authors of Node.js native addon modules.\nIt is basically the \"swiss army knife\" of `require()`ing your native module's\n`.node` file.\n\nThroughout the course of Node's native addon history, addons have ended up being\ncompiled in a variety of different places, depending on which build tool and which\nversion of node was used. To make matters worse, n [...]
+  "readmeFilename": "README.md",
+  "bugs": {
+    "url": "https://github.com/TooTallNate/node-bindings/issues"
+  },
+  "_id": "bindings at 1.1.1",
+  "_from": "bindings@*"
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/package.json b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/package.json
new file mode 100644
index 0000000..6fe195a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/package.json
@@ -0,0 +1,52 @@
+{
+  "name": "contextify",
+  "version": "0.1.6",
+  "description": "Turn an object into a persistent execution context.",
+  "author": {
+    "name": "Brian McDaniel",
+    "email": "brianmcd05 at gmail.com"
+  },
+  "contributors": [
+    {
+      "name": "Assaf Arkin",
+      "email": "assaf at labnotes.org",
+      "url": "http://labnotes.org/"
+    }
+  ],
+  "keywords": [
+    "context",
+    "vm"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/brianmcd/contextify.git"
+  },
+  "main": "./lib/contextify",
+  "scripts": {
+    "test": "nodeunit test/",
+    "install": "node-gyp rebuild"
+  },
+  "engines": {
+    "node": ">=0.4.0"
+  },
+  "licenses": [
+    {
+      "type": "MIT",
+      "url": "http://github.com/brianmcd/contextify/blob/master/LICENSE.txt"
+    }
+  ],
+  "dependencies": {
+    "bindings": "*"
+  },
+  "devDependencies": {
+    "nodeunit": ">=0.5.x"
+  },
+  "gypfile": true,
+  "readme": "# Contextify\n\nFor Windows issues, see here: https://github.com/brianmcd/contextify/wiki/Windows-Installation-Guide\n\nPlease add to the wiki if you find new issues/solutions.\n\nTurn an object into a V8 execution context.  A contextified object acts as the global 'this' when executing scripts in its context.  Contextify adds 3 methods to the contextified object: run(code, filename), getGlobal(), and dispose().  The main difference between Contextify and Node's vm methods i [...]
+  "readmeFilename": "README.md",
+  "bugs": {
+    "url": "https://github.com/brianmcd/contextify/issues"
+  },
+  "_id": "contextify at 0.1.6",
+  "_from": "contextify@~0.1.5"
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/src/contextify.cc b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/src/contextify.cc
new file mode 100644
index 0000000..78402aa
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/src/contextify.cc
@@ -0,0 +1,312 @@
+#include "node.h"
+#include "node_version.h"
+#include <string>
+using namespace v8;
+using namespace node;
+
+// For some reason this needs to be out of the object or node won't load the
+// library.
+static Persistent<FunctionTemplate> dataWrapperTmpl;
+static Persistent<Function>         dataWrapperCtor;
+
+class ContextifyContext : ObjectWrap {
+public:
+    Persistent<Context> context;
+    Persistent<Object>  sandbox;
+    Persistent<Object>  proxyGlobal;
+
+    static Persistent<FunctionTemplate> jsTmpl;
+
+    ContextifyContext(Local<Object> sbox) {
+        HandleScope scope;
+        sandbox = Persistent<Object>::New(sbox);
+    }
+
+    ~ContextifyContext() {
+        context.Dispose();
+        context.Clear();
+        proxyGlobal.Dispose();
+        proxyGlobal.Clear();
+        sandbox.Dispose();
+        sandbox.Clear();
+    }
+
+    // We override ObjectWrap::Wrap so that we can create our context after
+    // we have a reference to our "host" JavaScript object.  If we try to use
+    // handle_ in the ContextifyContext constructor, it will be empty since it's
+    // set in ObjectWrap::Wrap.
+    inline void Wrap(Handle<Object> handle) {
+        ObjectWrap::Wrap(handle);
+        context     = createV8Context();
+        proxyGlobal = Persistent<Object>::New(context->Global());
+    }
+    
+    // This is an object that just keeps an internal pointer to this
+    // ContextifyContext.  It's passed to the NamedPropertyHandler.  If we
+    // pass the main JavaScript context object we're embedded in, then the
+    // NamedPropertyHandler will store a reference to it forever and keep it
+    // from getting gc'd.
+    Local<Object> createDataWrapper () {
+        HandleScope scope;
+        Local<Object> wrapper = dataWrapperCtor->NewInstance();
+#if NODE_MAJOR_VERSION > 0 || (NODE_MINOR_VERSION == 9 && (NODE_PATCH_VERSION >= 6 && NODE_PATCH_VERSION <= 10)) || NODE_MINOR_VERSION >= 11
+        wrapper->SetAlignedPointerInInternalField(0, this);
+#else
+        wrapper->SetPointerInInternalField(0, this);
+#endif
+        return scope.Close(wrapper);
+    }
+
+    Persistent<Context> createV8Context() {
+        HandleScope scope;
+        Local<FunctionTemplate> ftmpl = FunctionTemplate::New();
+        ftmpl->SetHiddenPrototype(true);
+        ftmpl->SetClassName(sandbox->GetConstructorName());
+        Local<ObjectTemplate> otmpl = ftmpl->InstanceTemplate();
+        otmpl->SetNamedPropertyHandler(GlobalPropertyGetter,
+                                       GlobalPropertySetter,
+                                       GlobalPropertyQuery,
+                                       GlobalPropertyDeleter,
+                                       GlobalPropertyEnumerator,
+                                       createDataWrapper());
+        otmpl->SetAccessCheckCallbacks(GlobalPropertyNamedAccessCheck,
+                                       GlobalPropertyIndexedAccessCheck);
+        return Context::New(NULL, otmpl);
+    }
+
+    static void Init(Handle<Object> target) {
+        HandleScope scope;
+        dataWrapperTmpl = Persistent<FunctionTemplate>::New(FunctionTemplate::New());
+        dataWrapperTmpl->InstanceTemplate()->SetInternalFieldCount(1);
+        dataWrapperCtor = Persistent<Function>::New(dataWrapperTmpl->GetFunction());
+
+        jsTmpl = Persistent<FunctionTemplate>::New(FunctionTemplate::New(New));
+        jsTmpl->InstanceTemplate()->SetInternalFieldCount(1);
+        jsTmpl->SetClassName(String::NewSymbol("ContextifyContext"));
+
+        NODE_SET_PROTOTYPE_METHOD(jsTmpl, "run",       ContextifyContext::Run);
+        NODE_SET_PROTOTYPE_METHOD(jsTmpl, "getGlobal", ContextifyContext::GetGlobal);
+
+        target->Set(String::NewSymbol("ContextifyContext"), jsTmpl->GetFunction());
+    }
+
+    // args[0] = the sandbox object
+    static Handle<Value> New(const Arguments& args) {
+        HandleScope scope;
+        if (args.Length() < 1) {
+            Local<String> msg = String::New("Wrong number of arguments passed to ContextifyContext constructor");
+            return ThrowException(Exception::Error(msg));
+        }
+        if (!args[0]->IsObject()) {
+            Local<String> msg = String::New("Argument to ContextifyContext constructor must be an object.");
+            return ThrowException(Exception::Error(msg));
+        }
+        ContextifyContext* ctx = new ContextifyContext(args[0]->ToObject());
+        ctx->Wrap(args.This());
+        return args.This();
+    }
+
+    static Handle<Value> Run(const Arguments& args) {
+        HandleScope scope;
+        if (args.Length() == 0) {
+            Local<String> msg = String::New("Must supply at least 1 argument to run");
+            return ThrowException(Exception::Error(msg));
+        }
+        if (!args[0]->IsString()) {
+            Local<String> msg = String::New("First argument to run must be a String.");
+            return ThrowException(Exception::Error(msg));
+        }
+        ContextifyContext* ctx = ObjectWrap::Unwrap<ContextifyContext>(args.This());
+        Persistent<Context> context = ctx->context;
+        context->Enter();
+        Local<String> code = args[0]->ToString();
+        TryCatch trycatch;
+        Handle<Script> script;
+        if (args.Length() > 1 && args[1]->IsString()) {
+            script = Script::Compile(code, args[1]->ToString());
+        } else {
+            script = Script::Compile(code);
+        }
+        if (script.IsEmpty()) {
+          context->Exit();
+          return trycatch.ReThrow();
+        }
+        Handle<Value> result = script->Run();
+        context->Exit();
+        if (result.IsEmpty()) {
+            return trycatch.ReThrow();
+        }
+        return scope.Close(result);
+    }
+
+    static bool InstanceOf(Handle<Value> value) {
+      return !value.IsEmpty() && jsTmpl->HasInstance(value);
+    }
+
+    static Handle<Value> GetGlobal(const Arguments& args) {
+        HandleScope scope;
+        ContextifyContext* ctx = ObjectWrap::Unwrap<ContextifyContext>(args.This());
+        return ctx->proxyGlobal;
+    }
+
+    static bool GlobalPropertyNamedAccessCheck(Local<Object> host,
+                                               Local<Value>  key,
+                                               AccessType    type,
+                                               Local<Value>  data) {
+        return true;
+    }
+
+    static bool GlobalPropertyIndexedAccessCheck(Local<Object> host,
+                                                 uint32_t      key,
+                                                 AccessType    type,
+                                                 Local<Value>  data) {
+        return true;
+    }
+
+    static Handle<Value> GlobalPropertyGetter (Local<String> property,
+                                               const AccessorInfo &accessInfo) {
+        HandleScope scope;
+        Local<Object> data = accessInfo.Data()->ToObject();
+        ContextifyContext* ctx = ObjectWrap::Unwrap<ContextifyContext>(data);
+        Local<Value> rv = ctx->sandbox->GetRealNamedProperty(property);
+        if (rv.IsEmpty()) {
+            rv = ctx->proxyGlobal->GetRealNamedProperty(property);
+        }
+        return scope.Close(rv);
+    }
+
+    static Handle<Value> GlobalPropertySetter (Local<String> property,
+                                               Local<Value> value,
+                                               const AccessorInfo &accessInfo) {
+        HandleScope scope;
+        Local<Object> data = accessInfo.Data()->ToObject();
+        ContextifyContext* ctx = ObjectWrap::Unwrap<ContextifyContext>(data);
+        ctx->sandbox->Set(property, value);
+        return scope.Close(value);
+    }
+
+    static Handle<Integer> GlobalPropertyQuery(Local<String> property,
+                                               const AccessorInfo &accessInfo) {
+        HandleScope scope;
+        Local<Object> data = accessInfo.Data()->ToObject();
+        ContextifyContext* ctx = ObjectWrap::Unwrap<ContextifyContext>(data);
+        if (!ctx->sandbox->GetRealNamedProperty(property).IsEmpty() ||
+            !ctx->proxyGlobal->GetRealNamedProperty(property).IsEmpty()) {
+            return scope.Close(Integer::New(None));
+        }
+        return scope.Close(Handle<Integer>());
+    }
+
+    static Handle<Boolean> GlobalPropertyDeleter(Local<String> property,
+                                                 const AccessorInfo &accessInfo) {
+        HandleScope scope;
+        Local<Object> data = accessInfo.Data()->ToObject();
+        ContextifyContext* ctx = ObjectWrap::Unwrap<ContextifyContext>(data);
+        bool success = ctx->sandbox->Delete(property);
+        if (!success) {
+            success = ctx->proxyGlobal->Delete(property);
+        }
+        return scope.Close(Boolean::New(success));
+    }
+
+    static Handle<Array> GlobalPropertyEnumerator(const AccessorInfo &accessInfo) {
+        HandleScope scope;
+        Local<Object> data = accessInfo.Data()->ToObject();
+        ContextifyContext* ctx = ObjectWrap::Unwrap<ContextifyContext>(data);
+        return scope.Close(ctx->sandbox->GetPropertyNames());
+    }
+};
+
+class ContextifyScript : ObjectWrap {
+public:
+    static Persistent<FunctionTemplate> scriptTmpl;
+    Persistent<Script> script;
+
+    static void Init(Handle<Object> target) {
+        HandleScope scope;
+        scriptTmpl = Persistent<FunctionTemplate>::New(FunctionTemplate::New(New));
+        scriptTmpl->InstanceTemplate()->SetInternalFieldCount(1);
+        scriptTmpl->SetClassName(String::NewSymbol("ContextifyScript"));
+
+        NODE_SET_PROTOTYPE_METHOD(scriptTmpl, "runInContext", RunInContext);
+
+        target->Set(String::NewSymbol("ContextifyScript"),
+                    scriptTmpl->GetFunction());
+    }
+
+    static Handle<Value> New(const Arguments& args) {
+      HandleScope scope;
+
+      ContextifyScript *contextify_script = new ContextifyScript();
+      contextify_script->Wrap(args.Holder());
+
+      if (args.Length() < 1) {
+        return ThrowException(Exception::TypeError(
+              String::New("needs at least 'code' argument.")));
+      }
+
+      Local<String> code = args[0]->ToString();
+      Local<String> filename = args.Length() > 1
+                               ? args[1]->ToString()
+                               : String::New("ContextifyScript.<anonymous>");
+
+      Handle<Context> context = Context::GetCurrent();
+      Context::Scope context_scope(context);
+
+      // Catch errors
+      TryCatch trycatch;
+
+      Handle<Script> v8_script = Script::New(code, filename);
+
+      if (v8_script.IsEmpty()) {
+        return trycatch.ReThrow();
+      }
+
+      contextify_script->script = Persistent<Script>::New(v8_script);
+
+      return args.This();
+    }
+
+    static Handle<Value> RunInContext(const Arguments& args) {
+        HandleScope scope;
+        if (args.Length() == 0) {
+            Local<String> msg = String::New("Must supply at least 1 argument to runInContext");
+            return ThrowException(Exception::Error(msg));
+        }
+        if (!ContextifyContext::InstanceOf(args[0]->ToObject())) {
+            Local<String> msg = String::New("First argument must be a ContextifyContext.");
+            return ThrowException(Exception::TypeError(msg));
+        }
+        ContextifyContext* ctx = ObjectWrap::Unwrap<ContextifyContext>(args[0]->ToObject());
+        Persistent<Context> context = ctx->context;
+        context->Enter();
+        ContextifyScript* wrapped_script = ObjectWrap::Unwrap<ContextifyScript>(args.This());
+        Handle<Script> script = wrapped_script->script;
+        TryCatch trycatch;
+        if (script.IsEmpty()) {
+          context->Exit();
+          return trycatch.ReThrow();
+        }
+        Handle<Value> result = script->Run();
+        context->Exit();
+        if (result.IsEmpty()) {
+            return trycatch.ReThrow();
+        }
+        return scope.Close(result);
+    }
+
+    ~ContextifyScript() {
+        script.Dispose();
+    }
+};
+
+Persistent<FunctionTemplate> ContextifyContext::jsTmpl;
+Persistent<FunctionTemplate> ContextifyScript::scriptTmpl;
+
+extern "C" {
+    static void init(Handle<Object> target) {
+        ContextifyContext::Init(target);
+        ContextifyScript::Init(target);
+    }
+    NODE_MODULE(contextify, init);
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/wscript b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/wscript
new file mode 100644
index 0000000..1f40583
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/contextify/wscript
@@ -0,0 +1,18 @@
+import Options
+import os
+import sys
+
+VERSION = '0.1.6'
+
+def set_options(opt):
+  opt.tool_options("compiler_cxx")
+
+def configure(conf):
+  conf.check_tool("compiler_cxx")
+  conf.check_tool("node_addon")
+  conf.env.set_variant("Release")
+
+def build(bld):
+  obj = bld.new_task_gen("cxx", "shlib", "node_addon")
+  obj.target = "contextify"
+  obj.source = "src/contextify.cc"
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/.npmignore b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/.npmignore
new file mode 100644
index 0000000..9c8f462
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/.npmignore
@@ -0,0 +1,7 @@
+docs/
+src/
+test/
+spec/
+Jakefile.js
+MIT-LICENSE.txt
+README.mdown
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/README.mdown b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/README.mdown
new file mode 100644
index 0000000..31996f9
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/README.mdown
@@ -0,0 +1,34 @@
+# CSSOM
+
+CSSOM.js is a CSS parser written in pure JavaScript. It also a partial implementation of [CSS Object Model](http://dev.w3.org/csswg/cssom/). 
+
+    CSSOM.parse("body {color: black}")
+    -> {
+      cssRules: [
+        {
+          selectorText: "body",
+          style: {
+            0: "color",
+            color: "black",
+            length: 1
+          }
+        }
+      ]
+    }
+
+
+## [Parser demo](http://nv.github.com/CSSOM/docs/parse.html)
+
+Works well in Google Chrome 6+, Safari 5+, Firefox 3.6+, Opera 10.63+.
+Doesn't work in IE < 9 because of unsupported getters/setters.
+
+To use CSSOM.js in the browser you might want to build a one-file version with [Jake](http://github.com/mde/node-jake):
+
+    ➤ jake
+    build/CSSOM.js is done
+
+To use it with Node.js:
+
+    npm install cssom
+
+## [Specs](http://nv.github.com/CSSOM/spec/)
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSFontFaceRule.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSFontFaceRule.js
new file mode 100644
index 0000000..b7a56cf
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSFontFaceRule.js
@@ -0,0 +1,34 @@
+//.CommonJS
+var CSSOM = {
+	CSSStyleDeclaration: require("./CSSStyleDeclaration").CSSStyleDeclaration,
+	CSSRule: require("./CSSRule").CSSRule
+};
+///CommonJS
+
+
+/**
+ * @constructor
+ * @see http://dev.w3.org/csswg/cssom/#css-font-face-rule
+ */
+CSSOM.CSSFontFaceRule = function CSSFontFaceRule() {
+	CSSOM.CSSRule.call(this);
+	this.style = new CSSOM.CSSStyleDeclaration;
+	this.style.parentRule = this;
+};
+
+CSSOM.CSSFontFaceRule.prototype = new CSSOM.CSSRule;
+CSSOM.CSSFontFaceRule.prototype.constructor = CSSOM.CSSFontFaceRule;
+CSSOM.CSSFontFaceRule.prototype.type = 5;
+//FIXME
+//CSSOM.CSSFontFaceRule.prototype.insertRule = CSSStyleSheet.prototype.insertRule;
+//CSSOM.CSSFontFaceRule.prototype.deleteRule = CSSStyleSheet.prototype.deleteRule;
+
+// http://www.opensource.apple.com/source/WebCore/WebCore-955.66.1/css/WebKitCSSFontFaceRule.cpp
+CSSOM.CSSFontFaceRule.prototype.__defineGetter__("cssText", function() {
+	return "@font-face {" + this.style.cssText + "}";
+});
+
+
+//.CommonJS
+exports.CSSFontFaceRule = CSSOM.CSSFontFaceRule;
+///CommonJS
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSImportRule.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSImportRule.js
new file mode 100644
index 0000000..3539b3e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSImportRule.js
@@ -0,0 +1,131 @@
+//.CommonJS
+var CSSOM = {
+	CSSRule: require("./CSSRule").CSSRule,
+	CSSStyleSheet: require("./CSSStyleSheet").CSSStyleSheet,
+	MediaList: require("./MediaList").MediaList
+};
+///CommonJS
+
+
+/**
+ * @constructor
+ * @see http://dev.w3.org/csswg/cssom/#cssimportrule
+ * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSImportRule
+ */
+CSSOM.CSSImportRule = function CSSImportRule() {
+	CSSOM.CSSRule.call(this);
+	this.href = "";
+	this.media = new CSSOM.MediaList;
+	this.styleSheet = new CSSOM.CSSStyleSheet;
+};
+
+CSSOM.CSSImportRule.prototype = new CSSOM.CSSRule;
+CSSOM.CSSImportRule.prototype.constructor = CSSOM.CSSImportRule;
+CSSOM.CSSImportRule.prototype.type = 3;
+CSSOM.CSSImportRule.prototype.__defineGetter__("cssText", function() {
+	var mediaText = this.media.mediaText;
+	return "@import url(" + this.href + ")" + (mediaText ? " " + mediaText : "") + ";";
+});
+
+CSSOM.CSSImportRule.prototype.__defineSetter__("cssText", function(cssText) {
+	var i = 0;
+
+	/**
+	 * @import url(partial.css) screen, handheld;
+	 *        ||               |
+	 *        after-import     media
+	 *         |
+	 *         url
+	 */
+	var state = '';
+
+	var buffer = '';
+	var index;
+	var mediaText = '';
+	for (var character; character = cssText.charAt(i); i++) {
+
+		switch (character) {
+			case ' ':
+			case '\t':
+			case '\r':
+			case '\n':
+			case '\f':
+				if (state === 'after-import') {
+					state = 'url';
+				} else {
+					buffer += character;
+				}
+				break;
+
+			case '@':
+				if (!state && cssText.indexOf('@import', i) === i) {
+					state = 'after-import';
+					i += 'import'.length;
+					buffer = '';
+				}
+				break;
+
+			case 'u':
+				if (state === 'url' && cssText.indexOf('url(', i) === i) {
+					index = cssText.indexOf(')', i + 1);
+					if (index === -1) {
+						throw i + ': ")" not found';
+					}
+					i += 'url('.length;
+					var url = cssText.slice(i, index);
+					if (url[0] === url[url.length - 1]) {
+						if (url[0] === '"' || url[0] === "'") {
+							url = url.slice(1, -1);
+						}
+					}
+					this.href = url;
+					i = index;
+					state = 'media';
+				}
+				break;
+
+			case '"':
+				if (state === 'url') {
+					index = cssText.indexOf('"', i + 1);
+					if (!index) {
+						throw i + ": '\"' not found";
+					}
+					this.href = cssText.slice(i + 1, index);
+					i = index;
+					state = 'media';
+				}
+				break;
+
+			case "'":
+				if (state === 'url') {
+					index = cssText.indexOf("'", i + 1);
+					if (!index) {
+						throw i + ': "\'" not found';
+					}
+					this.href = cssText.slice(i + 1, index);
+					i = index;
+					state = 'media';
+				}
+				break;
+
+			case ';':
+				if (state === 'media') {
+					if (buffer) {
+						this.media.mediaText = buffer.trim();
+					}
+				}
+				break;
+
+			default:
+				if (state === 'media') {
+					buffer += character;
+				}
+				break;
+		}
+	}
+});
+
+
+//.CommonJS
+exports.CSSImportRule = CSSOM.CSSImportRule;
+///CommonJS
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSKeyframeRule.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSKeyframeRule.js
new file mode 100644
index 0000000..8238c6b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSKeyframeRule.js
@@ -0,0 +1,35 @@
+//.CommonJS
+var CSSOM = {
+	CSSRule: require("./CSSRule").CSSRule,
+	CSSStyleDeclaration: require('./CSSStyleDeclaration').CSSStyleDeclaration
+};
+///CommonJS
+
+
+/**
+ * @constructor
+ * @see http://www.w3.org/TR/css3-animations/#DOM-CSSKeyframeRule
+ */
+CSSOM.CSSKeyframeRule = function CSSKeyframeRule() {
+	CSSOM.CSSRule.call(this);
+	this.keyText = '';
+	this.style = new CSSOM.CSSStyleDeclaration;
+	this.style.parentRule = this;
+};
+
+CSSOM.CSSKeyframeRule.prototype = new CSSOM.CSSRule;
+CSSOM.CSSKeyframeRule.prototype.constructor = CSSOM.CSSKeyframeRule;
+CSSOM.CSSKeyframeRule.prototype.type = 9;
+//FIXME
+//CSSOM.CSSKeyframeRule.prototype.insertRule = CSSStyleSheet.prototype.insertRule;
+//CSSOM.CSSKeyframeRule.prototype.deleteRule = CSSStyleSheet.prototype.deleteRule;
+
+// http://www.opensource.apple.com/source/WebCore/WebCore-955.66.1/css/WebKitCSSKeyframeRule.cpp
+CSSOM.CSSKeyframeRule.prototype.__defineGetter__("cssText", function() {
+	return this.keyText + " {" + this.style.cssText + "} ";
+});
+
+
+//.CommonJS
+exports.CSSKeyframeRule = CSSOM.CSSKeyframeRule;
+///CommonJS
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSKeyframesRule.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSKeyframesRule.js
new file mode 100644
index 0000000..0ae70ba
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSKeyframesRule.js
@@ -0,0 +1,37 @@
+//.CommonJS
+var CSSOM = {
+	CSSRule: require("./CSSRule").CSSRule
+};
+///CommonJS
+
+
+/**
+ * @constructor
+ * @see http://www.w3.org/TR/css3-animations/#DOM-CSSKeyframesRule
+ */
+CSSOM.CSSKeyframesRule = function CSSKeyframesRule() {
+	CSSOM.CSSRule.call(this);
+	this.name = '';
+	this.cssRules = [];
+};
+
+CSSOM.CSSKeyframesRule.prototype = new CSSOM.CSSRule;
+CSSOM.CSSKeyframesRule.prototype.constructor = CSSOM.CSSKeyframesRule;
+CSSOM.CSSKeyframesRule.prototype.type = 8;
+//FIXME
+//CSSOM.CSSKeyframesRule.prototype.insertRule = CSSStyleSheet.prototype.insertRule;
+//CSSOM.CSSKeyframesRule.prototype.deleteRule = CSSStyleSheet.prototype.deleteRule;
+
+// http://www.opensource.apple.com/source/WebCore/WebCore-955.66.1/css/WebKitCSSKeyframesRule.cpp
+CSSOM.CSSKeyframesRule.prototype.__defineGetter__("cssText", function() {
+	var cssTexts = [];
+	for (var i=0, length=this.cssRules.length; i < length; i++) {
+		cssTexts.push("  " + this.cssRules[i].cssText);
+	}
+	return "@" + (this._vendorPrefix || '') + "keyframes " + this.name + " { \n" + cssTexts.join("\n") + "\n}";
+});
+
+
+//.CommonJS
+exports.CSSKeyframesRule = CSSOM.CSSKeyframesRule;
+///CommonJS
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSMediaRule.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSMediaRule.js
new file mode 100644
index 0000000..a6d15f8
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSMediaRule.js
@@ -0,0 +1,39 @@
+//.CommonJS
+var CSSOM = {
+	CSSRule: require("./CSSRule").CSSRule,
+	MediaList: require("./MediaList").MediaList
+};
+///CommonJS
+
+
+/**
+ * @constructor
+ * @see http://dev.w3.org/csswg/cssom/#cssmediarule
+ * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSMediaRule
+ */
+CSSOM.CSSMediaRule = function CSSMediaRule() {
+	CSSOM.CSSRule.call(this);
+	this.media = new CSSOM.MediaList;
+	this.cssRules = [];
+};
+
+CSSOM.CSSMediaRule.prototype = new CSSOM.CSSRule;
+CSSOM.CSSMediaRule.prototype.constructor = CSSOM.CSSMediaRule;
+CSSOM.CSSMediaRule.prototype.type = 4;
+//FIXME
+//CSSOM.CSSMediaRule.prototype.insertRule = CSSStyleSheet.prototype.insertRule;
+//CSSOM.CSSMediaRule.prototype.deleteRule = CSSStyleSheet.prototype.deleteRule;
+
+// http://opensource.apple.com/source/WebCore/WebCore-658.28/css/CSSMediaRule.cpp
+CSSOM.CSSMediaRule.prototype.__defineGetter__("cssText", function() {
+	var cssTexts = [];
+	for (var i=0, length=this.cssRules.length; i < length; i++) {
+		cssTexts.push(this.cssRules[i].cssText);
+	}
+	return "@media " + this.media.mediaText + " {" + cssTexts.join("") + "}";
+});
+
+
+//.CommonJS
+exports.CSSMediaRule = CSSOM.CSSMediaRule;
+///CommonJS
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSRule.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSRule.js
new file mode 100644
index 0000000..4acff83
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSRule.js
@@ -0,0 +1,39 @@
+//.CommonJS
+var CSSOM = {};
+///CommonJS
+
+
+/**
+ * @constructor
+ * @see http://dev.w3.org/csswg/cssom/#the-cssrule-interface
+ * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRule
+ */
+CSSOM.CSSRule = function CSSRule() {
+	this.parentRule = null;
+	this.parentStyleSheet = null;
+};
+
+CSSOM.CSSRule.STYLE_RULE = 1;
+CSSOM.CSSRule.IMPORT_RULE = 3;
+CSSOM.CSSRule.MEDIA_RULE = 4;
+CSSOM.CSSRule.FONT_FACE_RULE = 5;
+CSSOM.CSSRule.PAGE_RULE = 6;
+CSSOM.CSSRule.WEBKIT_KEYFRAMES_RULE = 8;
+CSSOM.CSSRule.WEBKIT_KEYFRAME_RULE = 9;
+
+// Obsolete in CSSOM http://dev.w3.org/csswg/cssom/
+//CSSOM.CSSRule.UNKNOWN_RULE = 0;
+//CSSOM.CSSRule.CHARSET_RULE = 2;
+
+// Never implemented
+//CSSOM.CSSRule.VARIABLES_RULE = 7;
+
+CSSOM.CSSRule.prototype = {
+	constructor: CSSOM.CSSRule
+	//FIXME
+};
+
+
+//.CommonJS
+exports.CSSRule = CSSOM.CSSRule;
+///CommonJS
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSStyleDeclaration.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSStyleDeclaration.js
new file mode 100644
index 0000000..365a1d3
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSStyleDeclaration.js
@@ -0,0 +1,148 @@
+//.CommonJS
+var CSSOM = {};
+///CommonJS
+
+
+/**
+ * @constructor
+ * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration
+ */
+CSSOM.CSSStyleDeclaration = function CSSStyleDeclaration(){
+	this.length = 0;
+	this.parentRule = null;
+
+	// NON-STANDARD
+	this._importants = {};
+};
+
+
+CSSOM.CSSStyleDeclaration.prototype = {
+
+	constructor: CSSOM.CSSStyleDeclaration,
+
+	/**
+	 *
+	 * @param {string} name
+	 * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration-getPropertyValue
+	 * @return {string} the value of the property if it has been explicitly set for this declaration block.
+	 * Returns the empty string if the property has not been set.
+	 */
+	getPropertyValue: function(name) {
+		return this[name] || "";
+	},
+
+	/**
+	 *
+	 * @param {string} name
+	 * @param {string} value
+	 * @param {string} [priority=null] "important" or null
+	 * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration-setProperty
+	 */
+	setProperty: function(name, value, priority) {
+		if (this[name]) {
+			// Property already exist. Overwrite it.
+			var index = Array.prototype.indexOf.call(this, name);
+			if (index < 0) {
+				this[this.length] = name;
+				this.length++;
+			}
+		} else {
+			// New property.
+			this[this.length] = name;
+			this.length++;
+		}
+		this[name] = value;
+		this._importants[name] = priority;
+	},
+
+	/**
+	 *
+	 * @param {string} name
+	 * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration-removeProperty
+	 * @return {string} the value of the property if it has been explicitly set for this declaration block.
+	 * Returns the empty string if the property has not been set or the property name does not correspond to a known CSS property.
+	 */
+	removeProperty: function(name) {
+		if (!(name in this)) {
+			return "";
+		}
+		var index = Array.prototype.indexOf.call(this, name);
+		if (index < 0) {
+			return "";
+		}
+		var prevValue = this[name];
+		this[name] = "";
+
+		// That's what WebKit and Opera do
+		Array.prototype.splice.call(this, index, 1);
+
+		// That's what Firefox does
+		//this[index] = ""
+
+		return prevValue;
+	},
+
+	getPropertyCSSValue: function() {
+		//FIXME
+	},
+
+	/**
+	 *
+	 * @param {String} name
+	 */
+	getPropertyPriority: function(name) {
+		return this._importants[name] || "";
+	},
+
+
+	/**
+	 *   element.style.overflow = "auto"
+	 *   element.style.getPropertyShorthand("overflow-x")
+	 *   -> "overflow"
+	 */
+	getPropertyShorthand: function() {
+		//FIXME
+	},
+
+	isPropertyImplicit: function() {
+		//FIXME
+	},
+
+	// Doesn't work in IE < 9
+	get cssText(){
+		var properties = [];
+		for (var i=0, length=this.length; i < length; ++i) {
+			var name = this[i];
+			var value = this.getPropertyValue(name);
+			var priority = this.getPropertyPriority(name);
+			if (priority) {
+				priority = " !" + priority;
+			}
+			properties[i] = name + ": " + value + priority + ";";
+		}
+		return properties.join(" ");
+	},
+
+	set cssText(cssText){
+		var i, name;
+		for (i = this.length; i--;) {
+			name = this[i];
+			this[name] = "";
+		}
+		Array.prototype.splice.call(this, 0, this.length);
+		this._importants = {};
+
+		var dummyRule = CSSOM.parse('#bogus{' + cssText + '}').cssRules[0].style;
+		var length = dummyRule.length;
+		for (i = 0; i < length; ++i) {
+			name = dummyRule[i];
+			this.setProperty(dummyRule[i], dummyRule.getPropertyValue(name), dummyRule.getPropertyPriority(name));
+		}
+	}
+};
+
+
+//.CommonJS
+exports.CSSStyleDeclaration = CSSOM.CSSStyleDeclaration;
+CSSOM.parse = require('./parse').parse; // Cannot be included sooner due to the mutual dependency between parse.js and CSSStyleDeclaration.js
+///CommonJS
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSStyleRule.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSStyleRule.js
new file mode 100644
index 0000000..4224397
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSStyleRule.js
@@ -0,0 +1,189 @@
+//.CommonJS
+var CSSOM = {
+	CSSStyleDeclaration: require("./CSSStyleDeclaration").CSSStyleDeclaration,
+	CSSRule: require("./CSSRule").CSSRule
+};
+///CommonJS
+
+
+/**
+ * @constructor
+ * @see http://dev.w3.org/csswg/cssom/#cssstylerule
+ * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleRule
+ */
+CSSOM.CSSStyleRule = function CSSStyleRule() {
+	CSSOM.CSSRule.call(this);
+	this.selectorText = "";
+	this.style = new CSSOM.CSSStyleDeclaration;
+	this.style.parentRule = this;
+};
+
+CSSOM.CSSStyleRule.prototype = new CSSOM.CSSRule;
+CSSOM.CSSStyleRule.prototype.constructor = CSSOM.CSSStyleRule;
+CSSOM.CSSStyleRule.prototype.type = 1;
+
+CSSOM.CSSStyleRule.prototype.__defineGetter__("cssText", function() {
+	var text;
+	if (this.selectorText) {
+		text = this.selectorText + " {" + this.style.cssText + "}";
+	} else {
+		text = "";
+	}
+	return text;
+});
+
+CSSOM.CSSStyleRule.prototype.__defineSetter__("cssText", function(cssText) {
+	var rule = CSSOM.CSSStyleRule.parse(cssText);
+	this.style = rule.style;
+	this.selectorText = rule.selectorText;
+});
+
+
+/**
+ * NON-STANDARD
+ * lightweight version of parse.js.
+ * @param {string} ruleText
+ * @return CSSStyleRule
+ */
+CSSOM.CSSStyleRule.parse = function(ruleText) {
+	var i = 0;
+	var state = "selector";
+	var index;
+	var j = i;
+	var buffer = "";
+
+	var SIGNIFICANT_WHITESPACE = {
+		"selector": true,
+		"value": true
+	};
+
+	var styleRule = new CSSOM.CSSStyleRule;
+	var selector, name, value, priority="";
+
+	for (var character; character = ruleText.charAt(i); i++) {
+
+		switch (character) {
+
+		case " ":
+		case "\t":
+		case "\r":
+		case "\n":
+		case "\f":
+			if (SIGNIFICANT_WHITESPACE[state]) {
+				// Squash 2 or more white-spaces in the row into 1
+				switch (ruleText.charAt(i - 1)) {
+					case " ":
+					case "\t":
+					case "\r":
+					case "\n":
+					case "\f":
+						break;
+					default:
+						buffer += " ";
+						break;
+				}
+			}
+			break;
+
+		// String
+		case '"':
+			j = i + 1;
+			index = ruleText.indexOf('"', j) + 1;
+			if (!index) {
+				throw '" is missing';
+			}
+			buffer += ruleText.slice(i, index);
+			i = index - 1;
+			break;
+
+		case "'":
+			j = i + 1;
+			index = ruleText.indexOf("'", j) + 1;
+			if (!index) {
+				throw "' is missing";
+			}
+			buffer += ruleText.slice(i, index);
+			i = index - 1;
+			break;
+
+		// Comment
+		case "/":
+			if (ruleText.charAt(i + 1) === "*") {
+				i += 2;
+				index = ruleText.indexOf("*/", i);
+				if (index === -1) {
+					throw new SyntaxError("Missing */");
+				} else {
+					i = index + 1;
+				}
+			} else {
+				buffer += character;
+			}
+			break;
+
+		case "{":
+			if (state === "selector") {
+				styleRule.selectorText = buffer.trim();
+				buffer = "";
+				state = "name";
+			}
+			break;
+
+		case ":":
+			if (state === "name") {
+				name = buffer.trim();
+				buffer = "";
+				state = "value";
+			} else {
+				buffer += character;
+			}
+			break;
+
+		case "!":
+			if (state === "value" && ruleText.indexOf("!important", i) === i) {
+				priority = "important";
+				i += "important".length;
+			} else {
+				buffer += character;
+			}
+			break;
+
+		case ";":
+			if (state === "value") {
+				styleRule.style.setProperty(name, buffer.trim(), priority);
+				priority = "";
+				buffer = "";
+				state = "name";
+			} else {
+				buffer += character;
+			}
+			break;
+
+		case "}":
+			if (state === "value") {
+				styleRule.style.setProperty(name, buffer.trim(), priority);
+				priority = "";
+				buffer = "";
+			} else if (state === "name") {
+				break;
+			} else {
+				buffer += character;
+			}
+			state = "selector";
+			break;
+
+		default:
+			buffer += character;
+			break;
+
+		}
+	}
+
+	return styleRule;
+
+};
+
+
+//.CommonJS
+exports.CSSStyleRule = CSSOM.CSSStyleRule;
+///CommonJS
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSStyleSheet.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSStyleSheet.js
new file mode 100644
index 0000000..3ec733f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/CSSStyleSheet.js
@@ -0,0 +1,87 @@
+//.CommonJS
+var CSSOM = {
+	StyleSheet: require("./StyleSheet").StyleSheet,
+	CSSStyleRule: require("./CSSStyleRule").CSSStyleRule
+};
+///CommonJS
+
+
+/**
+ * @constructor
+ * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleSheet
+ */
+CSSOM.CSSStyleSheet = function CSSStyleSheet() {
+	CSSOM.StyleSheet.call(this);
+	this.cssRules = [];
+};
+
+
+CSSOM.CSSStyleSheet.prototype = new CSSOM.StyleSheet;
+CSSOM.CSSStyleSheet.prototype.constructor = CSSOM.CSSStyleSheet;
+
+
+/**
+ * Used to insert a new rule into the style sheet. The new rule now becomes part of the cascade.
+ *
+ *   sheet = new Sheet("body {margin: 0}")
+ *   sheet.toString()
+ *   -> "body{margin:0;}"
+ *   sheet.insertRule("img {border: none}", 0)
+ *   -> 0
+ *   sheet.toString()
+ *   -> "img{border:none;}body{margin:0;}"
+ *
+ * @param {string} rule
+ * @param {number} index
+ * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleSheet-insertRule
+ * @return {number} The index within the style sheet's rule collection of the newly inserted rule.
+ */
+CSSOM.CSSStyleSheet.prototype.insertRule = function(rule, index) {
+	if (index < 0 || index > this.cssRules.length) {
+		throw new RangeError("INDEX_SIZE_ERR");
+	}
+	var cssRule = CSSOM.parse(rule).cssRules[0];
+	this.cssRules.splice(index, 0, cssRule);
+	return index;
+};
+
+
+/**
+ * Used to delete a rule from the style sheet.
+ *
+ *   sheet = new Sheet("img{border:none} body{margin:0}")
+ *   sheet.toString()
+ *   -> "img{border:none;}body{margin:0;}"
+ *   sheet.deleteRule(0)
+ *   sheet.toString()
+ *   -> "body{margin:0;}"
+ *
+ * @param {number} index within the style sheet's rule list of the rule to remove.
+ * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleSheet-deleteRule
+ */
+CSSOM.CSSStyleSheet.prototype.deleteRule = function(index) {
+	if (index < 0 || index >= this.cssRules.length) {
+		throw new RangeError("INDEX_SIZE_ERR");
+	}
+	this.cssRules.splice(index, 1);
+};
+
+
+/**
+ * NON-STANDARD
+ * @return {string} serialize stylesheet
+ */
+CSSOM.CSSStyleSheet.prototype.toString = function() {
+	var result = "";
+	var rules = this.cssRules;
+	for (var i=0; i<rules.length; i++) {
+		result += rules[i].cssText + "\n";
+	}
+	return result;
+};
+
+
+//.CommonJS
+exports.CSSStyleSheet = CSSOM.CSSStyleSheet;
+CSSOM.parse = require('./parse').parse; // Cannot be included sooner due to the mutual dependency between parse.js and CSSStyleSheet.js
+///CommonJS
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/MediaList.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/MediaList.js
new file mode 100644
index 0000000..9ce18ab
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/MediaList.js
@@ -0,0 +1,61 @@
+//.CommonJS
+var CSSOM = {};
+///CommonJS
+
+
+/**
+ * @constructor
+ * @see http://dev.w3.org/csswg/cssom/#the-medialist-interface
+ */
+CSSOM.MediaList = function MediaList(){
+	this.length = 0;
+};
+
+CSSOM.MediaList.prototype = {
+
+	constructor: CSSOM.MediaList,
+
+	/**
+	 * @return {string}
+	 */
+	get mediaText() {
+		return Array.prototype.join.call(this, ", ");
+	},
+
+	/**
+	 * @param {string} value
+	 */
+	set mediaText(value) {
+		var values = value.split(",");
+		var length = this.length = values.length;
+		for (var i=0; i<length; i++) {
+			this[i] = values[i].trim();
+		}
+	},
+
+	/**
+	 * @param {string} medium
+	 */
+	appendMedium: function(medium) {
+		if (Array.prototype.indexOf.call(this, medium) === -1) {
+			this[this.length] = medium;
+			this.length++;
+		}
+	},
+
+	/**
+	 * @param {string} medium
+	 */
+	deleteMedium: function(medium) {
+		var index = Array.prototype.indexOf.call(this, medium);
+		if (index !== -1) {
+			Array.prototype.splice.call(this, index, 1);
+		}
+	}
+
+};
+
+
+//.CommonJS
+exports.MediaList = CSSOM.MediaList;
+///CommonJS
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/StyleSheet.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/StyleSheet.js
new file mode 100644
index 0000000..cfe69b5
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/StyleSheet.js
@@ -0,0 +1,17 @@
+//.CommonJS
+var CSSOM = {};
+///CommonJS
+
+
+/**
+ * @constructor
+ * @see http://dev.w3.org/csswg/cssom/#the-stylesheet-interface
+ */
+CSSOM.StyleSheet = function StyleSheet() {
+	this.parentStyleSheet = null;
+};
+
+
+//.CommonJS
+exports.StyleSheet = CSSOM.StyleSheet;
+///CommonJS
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/clone.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/clone.js
new file mode 100644
index 0000000..1d81f10
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/clone.js
@@ -0,0 +1,76 @@
+//.CommonJS
+var CSSOM = {
+	CSSStyleSheet: require("./CSSStyleSheet").CSSStyleSheet,
+	CSSStyleRule: require("./CSSStyleRule").CSSStyleRule,
+	CSSMediaRule: require("./CSSMediaRule").CSSMediaRule,
+	CSSStyleDeclaration: require("./CSSStyleDeclaration").CSSStyleDeclaration,
+	CSSKeyframeRule: require('./CSSKeyframeRule').CSSKeyframeRule,
+	CSSKeyframesRule: require('./CSSKeyframesRule').CSSKeyframesRule
+};
+///CommonJS
+
+
+/**
+ * Produces a deep copy of stylesheet — the instance variables of stylesheet are copied recursively.
+ * @param {CSSStyleSheet|CSSOM.CSSStyleSheet} stylesheet
+ * @nosideeffects
+ * @return {CSSOM.CSSStyleSheet}
+ */
+CSSOM.clone = function clone(stylesheet) {
+
+	var cloned = new CSSOM.CSSStyleSheet;
+
+	var rules = stylesheet.cssRules;
+	if (!rules) {
+		return cloned;
+	}
+
+	var RULE_TYPES = {
+		1: CSSOM.CSSStyleRule,
+		4: CSSOM.CSSMediaRule,
+		//3: CSSOM.CSSImportRule,
+		//5: CSSOM.CSSFontFaceRule,
+		//6: CSSOM.CSSPageRule,
+		8: CSSOM.CSSKeyframesRule,
+		9: CSSOM.CSSKeyframeRule
+	};
+
+	for (var i=0, rulesLength=rules.length; i < rulesLength; i++) {
+		var rule = rules[i];
+		var ruleClone = cloned.cssRules[i] = new RULE_TYPES[rule.type];
+
+		var style = rule.style;
+		if (style) {
+			var styleClone = ruleClone.style = new CSSOM.CSSStyleDeclaration;
+			for (var j=0, styleLength=style.length; j < styleLength; j++) {
+				var name = styleClone[j] = style[j];
+				styleClone[name] = style[name];
+				styleClone._importants[name] = style.getPropertyPriority(name);
+			}
+			styleClone.length = style.length;
+		}
+
+		if (rule.hasOwnProperty('keyText')) {
+			ruleClone.keyText = rule.keyText;
+		}
+
+		if (rule.hasOwnProperty('selectorText')) {
+			ruleClone.selectorText = rule.selectorText;
+		}
+
+		if (rule.hasOwnProperty('mediaText')) {
+			ruleClone.mediaText = rule.mediaText;
+		}
+
+		if (rule.hasOwnProperty('cssRules')) {
+			ruleClone.cssRules = clone(rule).cssRules;
+		}
+	}
+
+	return cloned;
+
+};
+
+//.CommonJS
+exports.clone = CSSOM.clone;
+///CommonJS
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/index.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/index.js
new file mode 100644
index 0000000..bc5692e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/index.js
@@ -0,0 +1,15 @@
+'use strict';
+
+exports.CSSStyleDeclaration = require('./CSSStyleDeclaration').CSSStyleDeclaration;
+exports.CSSRule = require('./CSSRule').CSSRule;
+exports.CSSStyleRule = require('./CSSStyleRule').CSSStyleRule;
+exports.MediaList = require('./MediaList').MediaList;
+exports.CSSMediaRule = require('./CSSMediaRule').CSSMediaRule;
+exports.CSSImportRule = require('./CSSImportRule').CSSImportRule;
+exports.CSSFontFaceRule = require('./CSSFontFaceRule').CSSFontFaceRule;
+exports.StyleSheet = require('./StyleSheet').StyleSheet;
+exports.CSSStyleSheet = require('./CSSStyleSheet').CSSStyleSheet;
+exports.CSSKeyframesRule = require('./CSSKeyframesRule').CSSKeyframesRule;
+exports.CSSKeyframeRule = require('./CSSKeyframeRule').CSSKeyframeRule;
+exports.parse = require('./parse').parse;
+exports.clone = require('./clone').clone;
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/parse.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/parse.js
new file mode 100644
index 0000000..223017b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/lib/parse.js
@@ -0,0 +1,338 @@
+//.CommonJS
+var CSSOM = {};
+///CommonJS
+
+
+/**
+ * @param {string} token
+ */
+CSSOM.parse = function parse(token) {
+
+	var i = 0;
+
+	/**
+	  "before-selector" or
+	  "selector" or
+	  "atRule" or
+	  "atBlock" or
+	  "before-name" or
+	  "name" or
+	  "before-value" or
+	  "value"
+	*/
+	var state = "before-selector";
+
+	var index;
+	var buffer = "";
+
+	var SIGNIFICANT_WHITESPACE = {
+		"selector": true,
+		"value": true,
+		"atRule": true,
+		"importRule-begin": true,
+		"importRule": true,
+		"atBlock": true
+	};
+
+	var styleSheet = new CSSOM.CSSStyleSheet;
+
+	// @type CSSStyleSheet|CSSMediaRule|CSSFontFaceRule|CSSKeyframesRule
+	var currentScope = styleSheet;
+
+	// @type CSSMediaRule|CSSKeyframesRule
+	var parentRule;
+
+	var selector, name, value, priority="", styleRule, mediaRule, importRule, fontFaceRule, keyframesRule, keyframeRule;
+
+	var atKeyframesRegExp = /@(-(?:\w+-)+)?keyframes/g;
+
+	var parseError = function(message) {
+		var lines = token.substring(0, i).split('\n');
+		var lineCount = lines.length;
+		var charCount = lines.pop().length + 1;
+		var error = new Error(message + ' (line ' + lineCount + ', char ' + charCount + ')');
+		error.line = lineCount;
+		error.char = charCount;
+		error.styleSheet = styleSheet;
+		throw error;
+	};
+
+	for (var character; character = token.charAt(i); i++) {
+
+		switch (character) {
+
+		case " ":
+		case "\t":
+		case "\r":
+		case "\n":
+		case "\f":
+			if (SIGNIFICANT_WHITESPACE[state]) {
+				buffer += character;
+			}
+			break;
+
+		// String
+		case '"':
+			index = token.indexOf('"', i + 1) + 1;
+			if (!index) {
+				parseError('Unmatched "');
+			}
+			buffer += token.slice(i, index);
+			i = index - 1;
+			switch (state) {
+				case 'before-value':
+					state = 'value';
+					break;
+				case 'importRule-begin':
+					state = 'importRule';
+					break;
+			}
+			break;
+
+		case "'":
+			index = token.indexOf("'", i + 1) + 1;
+			if (!index) {
+				parseError("Unmatched '");
+			}
+			buffer += token.slice(i, index);
+			i = index - 1;
+			switch (state) {
+				case 'before-value':
+					state = 'value';
+					break;
+				case 'importRule-begin':
+					state = 'importRule';
+					break;
+			}
+			break;
+
+		// Comment
+		case "/":
+			if (token.charAt(i + 1) === "*") {
+				i += 2;
+				index = token.indexOf("*/", i);
+				if (index === -1) {
+					parseError("Missing */");
+				} else {
+					i = index + 1;
+				}
+			} else {
+				buffer += character;
+			}
+			if (state === "importRule-begin") {
+				buffer += " ";
+				state = "importRule";
+			}
+			break;
+
+		// At-rule
+		case "@":
+			if (token.indexOf("@media", i) === i) {
+				state = "atBlock";
+				mediaRule = new CSSOM.CSSMediaRule;
+				mediaRule.__starts = i;
+				i += "media".length;
+				buffer = "";
+				break;
+			} else if (token.indexOf("@import", i) === i) {
+				state = "importRule-begin";
+				i += "import".length;
+				buffer += "@import";
+				break;
+			} else if (token.indexOf("@font-face", i) === i) {
+				state = "fontFaceRule-begin";
+				i += "font-face".length;
+				fontFaceRule = new CSSOM.CSSFontFaceRule;
+				fontFaceRule.__starts = i;
+				buffer = "";
+				break;
+			} else {
+				atKeyframesRegExp.lastIndex = i;
+				var matchKeyframes = atKeyframesRegExp.exec(token);
+				if (matchKeyframes && matchKeyframes.index === i) {
+					state = "keyframesRule-begin";
+					keyframesRule = new CSSOM.CSSKeyframesRule;
+					keyframesRule.__starts = i;
+					keyframesRule._vendorPrefix = matchKeyframes[1]; // Will come out as undefined if no prefix was found
+					i += matchKeyframes[0].length - 1;
+					buffer = "";
+					break;
+				} else if (state == "selector") {
+					state = "atRule";
+				}
+			}
+			buffer += character;
+			break;
+
+		case "{":
+			if (state === "selector" || state === "atRule") {
+				styleRule.selectorText = buffer.trim();
+				styleRule.style.__starts = i;
+				buffer = "";
+				state = "before-name";
+			} else if (state === "atBlock") {
+				mediaRule.media.mediaText = buffer.trim();
+				currentScope = parentRule = mediaRule;
+				mediaRule.parentStyleSheet = styleSheet;
+				buffer = "";
+				state = "before-selector";
+			} else if (state === "fontFaceRule-begin") {
+				if (parentRule) {
+					fontFaceRule.parentRule = parentRule;
+				}
+				fontFaceRule.parentStyleSheet = styleSheet;
+				styleRule = fontFaceRule;
+				buffer = "";
+				state = "before-name";
+			} else if (state === "keyframesRule-begin") {
+				keyframesRule.name = buffer.trim();
+				if (parentRule) {
+					keyframesRule.parentRule = parentRule;
+				}
+				keyframesRule.parentStyleSheet = styleSheet;
+				currentScope = parentRule = keyframesRule;
+				buffer = "";
+				state = "keyframeRule-begin";
+			} else if (state === "keyframeRule-begin") {
+				styleRule = new CSSOM.CSSKeyframeRule;
+				styleRule.keyText = buffer.trim();
+				styleRule.__starts = i;
+				buffer = "";
+				state = "before-name";
+			}
+			break;
+
+		case ":":
+			if (state === "name") {
+				name = buffer.trim();
+				buffer = "";
+				state = "before-value";
+			} else {
+				buffer += character;
+			}
+			break;
+
+		case '(':
+			if (state === 'value') {
+				index = token.indexOf(')', i + 1);
+				if (index === -1) {
+					parseError('Unmatched "("');
+				}
+				buffer += token.slice(i, index + 1);
+				i = index;
+			} else {
+				buffer += character;
+			}
+			break;
+
+		case "!":
+			if (state === "value" && token.indexOf("!important", i) === i) {
+				priority = "important";
+				i += "important".length;
+			} else {
+				buffer += character;
+			}
+			break;
+
+		case ";":
+			switch (state) {
+				case "value":
+					styleRule.style.setProperty(name, buffer.trim(), priority);
+					priority = "";
+					buffer = "";
+					state = "before-name";
+					break;
+				case "atRule":
+					buffer = "";
+					state = "before-selector";
+					break;
+				case "importRule":
+					importRule = new CSSOM.CSSImportRule;
+					importRule.parentStyleSheet = importRule.styleSheet.parentStyleSheet = styleSheet;
+					importRule.cssText = buffer + character;
+					styleSheet.cssRules.push(importRule);
+					buffer = "";
+					state = "before-selector";
+					break;
+				default:
+					buffer += character;
+					break;
+			}
+			break;
+
+		case "}":
+			switch (state) {
+				case "value":
+					styleRule.style.setProperty(name, buffer.trim(), priority);
+					priority = "";
+				case "before-name":
+				case "name":
+					styleRule.__ends = i + 1;
+					if (parentRule) {
+						styleRule.parentRule = parentRule;
+					}
+					styleRule.parentStyleSheet = styleSheet;
+					currentScope.cssRules.push(styleRule);
+					buffer = "";
+					if (currentScope.constructor === CSSOM.CSSKeyframesRule) {
+						state = "keyframeRule-begin";
+					} else {
+						state = "before-selector";
+					}
+					break;
+				case "keyframeRule-begin":
+				case "before-selector":
+				case "selector":
+					// End of media rule.
+					if (!parentRule) {
+						parseError("Unexpected }");
+					}
+					currentScope.__ends = i + 1;
+					// Nesting rules aren't supported yet
+					styleSheet.cssRules.push(currentScope);
+					currentScope = styleSheet;
+					parentRule = null;
+					buffer = "";
+					state = "before-selector";
+					break;
+			}
+			break;
+
+		default:
+			switch (state) {
+				case "before-selector":
+					state = "selector";
+					styleRule = new CSSOM.CSSStyleRule;
+					styleRule.__starts = i;
+					break;
+				case "before-name":
+					state = "name";
+					break;
+				case "before-value":
+					state = "value";
+					break;
+				case "importRule-begin":
+					state = "importRule";
+					break;
+			}
+			buffer += character;
+			break;
+		}
+	}
+
+	return styleSheet;
+};
+
+
+//.CommonJS
+exports.parse = CSSOM.parse;
+// The following modules cannot be included sooner due to the mutual dependency with parse.js
+CSSOM.CSSStyleSheet = require("./CSSStyleSheet").CSSStyleSheet;
+CSSOM.CSSStyleRule = require("./CSSStyleRule").CSSStyleRule;
+CSSOM.CSSImportRule = require("./CSSImportRule").CSSImportRule;
+CSSOM.CSSMediaRule = require("./CSSMediaRule").CSSMediaRule;
+CSSOM.CSSFontFaceRule = require("./CSSFontFaceRule").CSSFontFaceRule;
+CSSOM.CSSStyleDeclaration = require('./CSSStyleDeclaration').CSSStyleDeclaration;
+CSSOM.CSSKeyframeRule = require('./CSSKeyframeRule').CSSKeyframeRule;
+CSSOM.CSSKeyframesRule = require('./CSSKeyframesRule').CSSKeyframesRule;
+///CommonJS
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/package.json b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/package.json
new file mode 100644
index 0000000..54ed1b6
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssom/package.json
@@ -0,0 +1,46 @@
+{
+  "name": "cssom",
+  "description": "CSS Object Model implementation and CSS parser",
+  "keywords": [
+    "CSS",
+    "CSSOM",
+    "parser",
+    "styleSheet"
+  ],
+  "version": "0.2.5",
+  "homepage": "https://github.com/NV/CSSOM",
+  "author": {
+    "name": "Nikita Vasilyev",
+    "email": "me at elv1s.ru"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/NV/CSSOM.git"
+  },
+  "bugs": {
+    "url": "https://github.com/NV/CSSOM/issues"
+  },
+  "directories": {
+    "lib": "./lib"
+  },
+  "main": "./lib/index.js",
+  "engines": {
+    "node": ">=0.2.0"
+  },
+  "devDependencies": {
+    "jake": "0.2.x"
+  },
+  "licenses": [
+    {
+      "type": "MIT",
+      "url": "http://creativecommons.org/licenses/MIT/"
+    }
+  ],
+  "scripts": {
+    "prepublish": "jake lib/index.js"
+  },
+  "readme": "# CSSOM\n\nCSSOM.js is a CSS parser written in pure JavaScript. It also a partial implementation of [CSS Object Model](http://dev.w3.org/csswg/cssom/). \n\n    CSSOM.parse(\"body {color: black}\")\n    -> {\n      cssRules: [\n        {\n          selectorText: \"body\",\n          style: {\n            0: \"color\",\n            color: \"black\",\n            length: 1\n          }\n        }\n      ]\n    }\n\n\n## [Parser demo](http://nv.github.com/CSSOM/docs/parse.html)\ [...]
+  "readmeFilename": "README.mdown",
+  "_id": "cssom at 0.2.5",
+  "_from": "cssom@~0.2.5"
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/.npmignore b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/.npmignore
new file mode 100644
index 0000000..b512c09
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/.npmignore
@@ -0,0 +1 @@
+node_modules
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/README.md b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/README.md
new file mode 100644
index 0000000..56f3e84
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/README.md
@@ -0,0 +1,9 @@
+CSSStyleDeclaration
+===================
+
+CSSStyleDeclaration is a work-a-like to the CSSStyleDeclaration class in Nikita Vasilyev's [CSSOM](https://github.com/NV/CSSOM). I made it so that when using [jQuery in node](https://github.com/tmtk75/node-jquery) setting css attributes via $.fn.css() would work. node-jquery uses [jsdom](https://github.com/tmpvar/jsdom) to create a DOM to use in node. jsdom uses CSSOM for styling, and CSSOM's implementation of the [CSSStyleDeclaration](http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS- [...]
+
+
+Why not just issue a pull request?
+----
+Well, NV wants to keep CSSOM fast (which I can appreciate) and CSS2Properties aren't required by the standard (though every browser has the interface). So I figured the path of least resistence would be to just modify this one class, publish it as a node module (that requires CSSOM) and then make a pull request of jsdom to use it.
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/CSSStyleDeclaration.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/CSSStyleDeclaration.js
new file mode 100644
index 0000000..775589d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/CSSStyleDeclaration.js
@@ -0,0 +1,972 @@
+/*********************************************************************
+ * This is a fork from the CSS Style Declaration part of
+ * https://github.com/NV/CSSOM
+ ********************************************************************/
+"use strict";
+/*jslint es5: true*/
+var CSSOM = require('cssom');
+var fs = require('fs');
+var path = require('path');
+
+/**
+ * @constructor
+ * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration
+ */
+var CSSStyleDeclaration = function CSSStyleDeclaration() {
+    this._values = {};
+    this._importants = {};
+    this._length = 0;
+};
+CSSStyleDeclaration.prototype = {
+    constructor: CSSStyleDeclaration,
+
+    /**
+     *
+     * @param {string} name
+     * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration-getPropertyValue
+     * @return {string} the value of the property if it has been explicitly set for this declaration block.
+     * Returns the empty string if the property has not been set.
+     */
+    getPropertyValue: function (name) {
+        return this._values[name] || "";
+    },
+
+    /**
+     *
+     * @param {string} name
+     * @param {string} value
+     * @param {string} [priority=null] "important" or null
+     * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration-setProperty
+     */
+    setProperty: function (name, value, priority) {
+        if (this._values[name]) {
+            // Property already exist. Overwrite it.
+            var index = Array.prototype.indexOf.call(this, name);
+            if (index < 0) {
+                this[this._length] = name;
+                this._length++;
+            }
+        } else {
+            // New property.
+            this[this._length] = name;
+            this._length++;
+        }
+        this._values[name] = value;
+        this._importants[name] = priority;
+    },
+
+    /**
+     *
+     * @param {string} name
+     * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration-removeProperty
+     * @return {string} the value of the property if it has been explicitly set for this declaration block.
+     * Returns the empty string if the property has not been set or the property name does not correspond to a known CSS property.
+     */
+    removeProperty: function (name) {
+        if (!this._values.hasOwnProperty(name)) {
+            return "";
+        }
+        var index = Array.prototype.indexOf.call(this, name);
+        if (index < 0) {
+            return "";
+        }
+        var prevValue = this._values[name];
+        delete this._values[name];
+
+        // That's what WebKit and Opera do
+        Array.prototype.splice.call(this, index, 1);
+
+        // That's what Firefox does
+        //this[index] = ""
+
+        return prevValue;
+    },
+
+
+    /**
+     *
+     * @param {String} name
+     */
+    getPropertyPriority: function (name) {
+        return this._importants[name] || "";
+    },
+
+
+    getPropertyCSSValue: function () {
+        //FIXME
+    },
+
+    /**
+     *   element.style.overflow = "auto"
+     *   element.style.getPropertyShorthand("overflow-x")
+     *   -> "overflow"
+     */
+    getPropertyShorthand: function () {
+        //FIXME
+    },
+
+    isPropertyImplicit: function () {
+        //FIXME
+    },
+
+    /**
+     *   http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration-item
+     */
+    item: function (index) {
+        index = parseInt(index, 10);
+        if (index < 0 || index >= this._length) {
+            return '';
+        }
+        return this[index];
+    },
+
+    get cssText() {
+        var properties = [];
+        var i;
+        for (i = 0; i < this._length; i++) {
+            var name = this[i];
+            var value = this.getPropertyValue(name);
+            var priority = this.getPropertyPriority(name);
+            if (priority !== '') {
+                priority = " !" + priority;
+            }
+            properties.push([name, ': ', value, priority, ';'].join(''));
+        }
+        return properties.join(' ');
+    },
+    set cssText(value) {
+        var i;
+        this._values = {};
+        Array.prototype.splice.call(this, 0, this._length);
+        this._importants = {};
+        var dummyRule = CSSOM.parse('#bogus{' + value + '}').cssRules[0].style;
+        var rule_length = dummyRule.length;
+        var name;
+        for (i = 0; i < rule_length; ++i) {
+            name = dummyRule[i];
+            this.setProperty(dummyRule[i], dummyRule.getPropertyValue(name), dummyRule.getPropertyPriority(name));
+        }
+    },
+
+
+    get parentRule() { return null; },
+
+    get length() { return this._length; },
+    /**
+     * This deletes indices if the new length is less then the current
+     * length. If the new length is more, it does nothing, the new indices
+     * will be undefined until set.
+     **/
+    set length(value) {
+        var i;
+        for (i = value; i < this._length; i++) {
+            delete this[i];
+        }
+        this._length = value;
+    },
+
+    // properties
+    get alignmentBaseline() { return this.getPropertyValue('alignment-baseline'); },
+    set alignmentBaseline(v) { this.setProperty('alignment-baseline', v); },
+    get azimuth() { return this.getPropertyValue('azimuth'); },
+    set azimuth(v) { this.setProperty('azimuth', v); },
+    get background() { return this.getPropertyValue('background'); },
+    set background(v) { this.setProperty('background', v); },
+    get backgroundAttachment() { return this.getPropertyValue('background-attachment'); },
+    set backgroundAttachment(v) { this.setProperty('background-attachment', v); },
+    get backgroundClip() { return this.getPropertyValue('background-clip'); },
+    set backgroundClip(v) { this.setProperty('background-clip', v); },
+    get backgroundColor() { return this.getPropertyValue('background-color'); },
+    set backgroundColor(v) { this.setProperty('background-color', v); },
+    get backgroundImage() { return this.getPropertyValue('background-image'); },
+    set backgroundImage(v) { this.setProperty('background-image', v); },
+    get backgroundOrigin() { return this.getPropertyValue('background-origin'); },
+    set backgroundOrigin(v) { this.setProperty('background-origin', v); },
+    get backgroundPosition() { return this.getPropertyValue('background-position'); },
+    set backgroundPosition(v) { this.setProperty('background-position', v); },
+    get backgroundPositionX() { return this.getPropertyValue('background-position-x'); },
+    set backgroundPositionX(v) { this.setProperty('background-position-x', v); },
+    get backgroundPositionY() { return this.getPropertyValue('background-position-y'); },
+    set backgroundPositionY(v) { this.setProperty('background-position-y', v); },
+    get backgroundRepeat() { return this.getPropertyValue('background-repeat'); },
+    set backgroundRepeat(v) { this.setProperty('background-repeat', v); },
+    get backgroundRepeatX() { return this.getPropertyValue('background-repeat-x'); },
+    set backgroundRepeatX(v) { this.setProperty('background-repeat-x', v); },
+    get backgroundRepeatY() { return this.getPropertyValue('background-repeat-y'); },
+    set backgroundRepeatY(v) { this.setProperty('background-repeat-y', v); },
+    get backgroundSize() { return this.getPropertyValue('background-size'); },
+    set backgroundSize(v) { this.setProperty('background-size', v); },
+    get baselineShift() { return this.getPropertyValue('baseline-shift'); },
+    set baselineShift(v) { this.setProperty('baseline-shift', v); },
+    get border() { return this.getPropertyValue('border'); },
+    set border(v) { this.setProperty('border', v); },
+    get borderBottom() { return this.getPropertyValue('border-bottom'); },
+    set borderBottom(v) { this.setProperty('border-bottom', v); },
+    get borderBottomColor() { return this.getPropertyValue('border-bottom-color'); },
+    set borderBottomColor(v) { this.setProperty('border-bottom-color', v); },
+    get borderBottomLeftRadius() { return this.getPropertyValue('border-bottom-left-radius'); },
+    set borderBottomLeftRadius(v) { this.setProperty('border-bottom-left-radius', v); },
+    get borderBottomRightRadius() { return this.getPropertyValue('border-bottom-right-radius'); },
+    set borderBottomRightRadius(v) { this.setProperty('border-bottom-right-radius', v); },
+    get borderBottomStyle() { return this.getPropertyValue('border-bottom-style'); },
+    set borderBottomStyle(v) { this.setProperty('border-bottom-style', v); },
+    get borderBottomWidth() { return this.getPropertyValue('border-bottom-width'); },
+    set borderBottomWidth(v) { this.setProperty('border-bottom-width', v); },
+    get borderCollapse() { return this.getPropertyValue('border-collapse'); },
+    set borderCollapse(v) { this.setProperty('border-collapse', v); },
+    get borderColor() { return this.getPropertyValue('border-color'); },
+    set borderColor(v) { this.setProperty('border-color', v); },
+    get borderImage() { return this.getPropertyValue('border-image'); },
+    set borderImage(v) { this.setProperty('border-image', v); },
+    get borderImageOutset() { return this.getPropertyValue('border-image-outset'); },
+    set borderImageOutset(v) { this.setProperty('border-image-outset', v); },
+    get borderImageRepeat() { return this.getPropertyValue('border-image-repeat'); },
+    set borderImageRepeat(v) { this.setProperty('border-image-repeat', v); },
+    get borderImageSlice() { return this.getPropertyValue('border-image-slice'); },
+    set borderImageSlice(v) { this.setProperty('border-image-slice', v); },
+    get borderImageSource() { return this.getPropertyValue('border-image-source'); },
+    set borderImageSource(v) { this.setProperty('border-image-source', v); },
+    get borderImageWidth() { return this.getPropertyValue('border-image-width'); },
+    set borderImageWidth(v) { this.setProperty('border-image-width', v); },
+    get borderLeft() { return this.getPropertyValue('border-left'); },
+    set borderLeft(v) { this.setProperty('border-left', v); },
+    get borderLeftColor() { return this.getPropertyValue('border-left-color'); },
+    set borderLeftColor(v) { this.setProperty('border-left-color', v); },
+    get borderLeftStyle() { return this.getPropertyValue('border-left-style'); },
+    set borderLeftStyle(v) { this.setProperty('border-left-style', v); },
+    get borderLeftWidth() { return this.getPropertyValue('border-left-width'); },
+    set borderLeftWidth(v) { this.setProperty('border-left-width', v); },
+    get borderRadius() { return this.getPropertyValue('border-radius'); },
+    set borderRadius(v) { this.setProperty('border-radius', v); },
+    get borderRight() { return this.getPropertyValue('border-right'); },
+    set borderRight(v) { this.setProperty('border-right', v); },
+    get borderRightColor() { return this.getPropertyValue('border-right-color'); },
+    set borderRightColor(v) { this.setProperty('border-right-color', v); },
+    get borderRightStyle() { return this.getPropertyValue('border-right-style'); },
+    set borderRightStyle(v) { this.setProperty('border-right-style', v); },
+    get borderRightWidth() { return this.getPropertyValue('border-right-width'); },
+    set borderRightWidth(v) { this.setProperty('border-right-width', v); },
+    get borderSpacing() { return this.getPropertyValue('border-spacing'); },
+    set borderSpacing(v) { this.setProperty('border-spacing', v); },
+    get borderStyle() { return this.getPropertyValue('border-style'); },
+    set borderStyle(v) { this.setProperty('border-style', v); },
+    get borderTop() { return this.getPropertyValue('border-top'); },
+    set borderTop(v) { this.setProperty('border-top', v); },
+    get borderTopColor() { return this.getPropertyValue('border-top-color'); },
+    set borderTopColor(v) { this.setProperty('border-top-color', v); },
+    get borderTopLeftRadius() { return this.getPropertyValue('border-top-left-radius'); },
+    set borderTopLeftRadius(v) { this.setProperty('border-top-left-radius', v); },
+    get borderTopRightRadius() { return this.getPropertyValue('border-top-right-radius'); },
+    set borderTopRightRadius(v) { this.setProperty('border-top-right-radius', v); },
+    get borderTopStyle() { return this.getPropertyValue('border-top-style'); },
+    set borderTopStyle(v) { this.setProperty('border-top-style', v); },
+    get borderTopWidth() { return this.getPropertyValue('border-top-width'); },
+    set borderTopWidth(v) { this.setProperty('border-top-width', v); },
+    get borderWidth() { return this.getPropertyValue('border-width'); },
+    set borderWidth(v) { this.setProperty('border-width', v); },
+    get bottom() { return this.getPropertyValue('bottom'); },
+    set bottom(v) { this.setProperty('bottom', v); },
+    get boxShadow() { return this.getPropertyValue('box-shadow'); },
+    set boxShadow(v) { this.setProperty('box-shadow', v); },
+    get boxSizing() { return this.getPropertyValue('box-sizing'); },
+    set boxSizing(v) { this.setProperty('box-sizing', v); },
+    get captionSide() { return this.getPropertyValue('caption-side'); },
+    set captionSide(v) { this.setProperty('caption-side', v); },
+    get clear() { return this.getPropertyValue('clear'); },
+    set clear(v) { this.setProperty('clear', v); },
+    get clip() { return this.getPropertyValue('clip'); },
+    set clip(v) { this.setProperty('clip', v); },
+    get clipPath() { return this.getPropertyValue('clip-path'); },
+    set clipPath(v) { this.setProperty('clip-path', v); },
+    get clipRule() { return this.getPropertyValue('clip-rule'); },
+    set clipRule(v) { this.setProperty('clip-rule', v); },
+    get color() { return this.getPropertyValue('color'); },
+    set color(v) { this.setProperty('color', v); },
+    get colorInterpolation() { return this.getPropertyValue('color-interpolation'); },
+    set colorInterpolation(v) { this.setProperty('color-interpolation', v); },
+    get colorInterpolationFilters() { return this.getPropertyValue('color-interpolation-filters'); },
+    set colorInterpolationFilters(v) { this.setProperty('color-interpolation-filters', v); },
+    get colorProfile() { return this.getPropertyValue('color-profile'); },
+    set colorProfile(v) { this.setProperty('color-profile', v); },
+    get colorRendering() { return this.getPropertyValue('color-rendering'); },
+    set colorRendering(v) { this.setProperty('color-rendering', v); },
+    get content() { return this.getPropertyValue('content'); },
+    set content(v) { this.setProperty('content', v); },
+    get counterIncrement() { return this.getPropertyValue('counter-increment'); },
+    set counterIncrement(v) { this.setProperty('counter-increment', v); },
+    get counterReset() { return this.getPropertyValue('counter-reset'); },
+    set counterReset(v) { this.setProperty('counter-reset', v); },
+    get cssFloat() { return this.getPropertyValue('float'); },
+    set cssFloat(v) { this.setProperty('float', v); },
+    get cue() { return this.getPropertyValue('cue'); },
+    set cue(v) { this.setProperty('cue', v); },
+    get cueAfter() { return this.getPropertyValue('cue-after'); },
+    set cueAfter(v) { this.setProperty('cue-after', v); },
+    get cueBefore() { return this.getPropertyValue('cue-before'); },
+    set cueBefore(v) { this.setProperty('cue-before', v); },
+    get cursor() { return this.getPropertyValue('cursor'); },
+    set cursor(v) { this.setProperty('cursor', v); },
+    get direction() { return this.getPropertyValue('direction'); },
+    set direction(v) { this.setProperty('direction', v); },
+    get display() { return this.getPropertyValue('display'); },
+    set display(v) { this.setProperty('display', v); },
+    get dominantBaseline() { return this.getPropertyValue('dominant-baseline'); },
+    set dominantBaseline(v) { this.setProperty('dominant-baseline', v); },
+    get elevation() { return this.getPropertyValue('elevation'); },
+    set elevation(v) { this.setProperty('elevation', v); },
+    get emptyCells() { return this.getPropertyValue('empty-cells'); },
+    set emptyCells(v) { this.setProperty('empty-cells', v); },
+    get enableBackground() { return this.getPropertyValue('enable-background'); },
+    set enableBackground(v) { this.setProperty('enable-background', v); },
+    get fill() { return this.getPropertyValue('fill'); },
+    set fill(v) { this.setProperty('fill', v); },
+    get fillOpacity() { return this.getPropertyValue('fill-opacity'); },
+    set fillOpacity(v) { this.setProperty('fill-opacity', v); },
+    get fillRule() { return this.getPropertyValue('fill-rule'); },
+    set fillRule(v) { this.setProperty('fill-rule', v); },
+    get filter() { return this.getPropertyValue('filter'); },
+    set filter(v) { this.setProperty('filter', v); },
+    get floodColor() { return this.getPropertyValue('flood-color'); },
+    set floodColor(v) { this.setProperty('flood-color', v); },
+    get floodOpacity() { return this.getPropertyValue('flood-opacity'); },
+    set floodOpacity(v) { this.setProperty('flood-opacity', v); },
+    get font() { return this.getPropertyValue('font'); },
+    set font(v) { this.setProperty('font', v); },
+    get fontFamily() { return this.getPropertyValue('font-family'); },
+    set fontFamily(v) { this.setProperty('font-family', v); },
+    get fontSize() { return this.getPropertyValue('font-size'); },
+    set fontSize(v) { this.setProperty('font-size', v); },
+    get fontSizeAdjust() { return this.getPropertyValue('font-size-adjust'); },
+    set fontSizeAdjust(v) { this.setProperty('font-size-adjust', v); },
+    get fontStretch() { return this.getPropertyValue('font-stretch'); },
+    set fontStretch(v) { this.setProperty('font-stretch', v); },
+    get fontStyle() { return this.getPropertyValue('font-style'); },
+    set fontStyle(v) { this.setProperty('font-style', v); },
+    get fontVariant() { return this.getPropertyValue('font-variant'); },
+    set fontVariant(v) { this.setProperty('font-variant', v); },
+    get fontWeight() { return this.getPropertyValue('font-weight'); },
+    set fontWeight(v) { this.setProperty('font-weight', v); },
+    get glyphOrientationHorizontal() { return this.getPropertyValue('glyph-orientation-horizontal'); },
+    set glyphOrientationHorizontal(v) { this.setProperty('glyph-orientation-horizontal', v); },
+    get glyphOrientationVertical() { return this.getPropertyValue('glyph-orientation-vertical'); },
+    set glyphOrientationVertical(v) { this.setProperty('glyph-orientation-vertical', v); },
+    get height() { return this.getPropertyValue('height'); },
+    set height(v) { this.setProperty('height', v); },
+    get imageRendering() { return this.getPropertyValue('image-rendering'); },
+    set imageRendering(v) { this.setProperty('image-rendering', v); },
+    get kerning() { return this.getPropertyValue('kerning'); },
+    set kerning(v) { this.setProperty('kerning', v); },
+    get left() { return this.getPropertyValue('left'); },
+    set left(v) { this.setProperty('left', v); },
+    get letterSpacing() { return this.getPropertyValue('letter-spacing'); },
+    set letterSpacing(v) { this.setProperty('letter-spacing', v); },
+    get lightingColor() { return this.getPropertyValue('lighting-color'); },
+    set lightingColor(v) { this.setProperty('lighting-color', v); },
+    get lineHeight() { return this.getPropertyValue('line-height'); },
+    set lineHeight(v) { this.setProperty('line-height', v); },
+    get listStyle() { return this.getPropertyValue('list-style'); },
+    set listStyle(v) { this.setProperty('list-style', v); },
+    get listStyleImage() { return this.getPropertyValue('list-style-image'); },
+    set listStyleImage(v) { this.setProperty('list-style-image', v); },
+    get listStylePosition() { return this.getPropertyValue('list-style-position'); },
+    set listStylePosition(v) { this.setProperty('list-style-position', v); },
+    get listStyleType() { return this.getPropertyValue('list-style-type'); },
+    set listStyleType(v) { this.setProperty('list-style-type', v); },
+    get margin() { return this.getPropertyValue('margin'); },
+    set margin(v) { this.setProperty('margin', v); },
+    get marginBottom() { return this.getPropertyValue('margin-bottom'); },
+    set marginBottom(v) { this.setProperty('margin-bottom', v); },
+    get marginLeft() { return this.getPropertyValue('margin-left'); },
+    set marginLeft(v) { this.setProperty('margin-left', v); },
+    get marginRight() { return this.getPropertyValue('margin-right'); },
+    set marginRight(v) { this.setProperty('margin-right', v); },
+    get marginTop() { return this.getPropertyValue('margin-top'); },
+    set marginTop(v) { this.setProperty('margin-top', v); },
+    get marker() { return this.getPropertyValue('marker'); },
+    set marker(v) { this.setProperty('marker', v); },
+    get markerEnd() { return this.getPropertyValue('marker-end'); },
+    set markerEnd(v) { this.setProperty('marker-end', v); },
+    get markerMid() { return this.getPropertyValue('marker-mid'); },
+    set markerMid(v) { this.setProperty('marker-mid', v); },
+    get markerOffset() { return this.getPropertyValue('marker-offset'); },
+    set markerOffset(v) { this.setProperty('marker-offset', v); },
+    get markerStart() { return this.getPropertyValue('marker-start'); },
+    set markerStart(v) { this.setProperty('marker-start', v); },
+    get marks() { return this.getPropertyValue('marks'); },
+    set marks(v) { this.setProperty('marks', v); },
+    get mask() { return this.getPropertyValue('mask'); },
+    set mask(v) { this.setProperty('mask', v); },
+    get maxHeight() { return this.getPropertyValue('max-height'); },
+    set maxHeight(v) { this.setProperty('max-height', v); },
+    get maxWidth() { return this.getPropertyValue('max-width'); },
+    set maxWidth(v) { this.setProperty('max-width', v); },
+    get minHeight() { return this.getPropertyValue('min-height'); },
+    set minHeight(v) { this.setProperty('min-height', v); },
+    get minWidth() { return this.getPropertyValue('min-width'); },
+    set minWidth(v) { this.setProperty('min-width', v); },
+    get opacity() { return this.getPropertyValue('opacity'); },
+    set opacity(v) { this.setProperty('opacity', v); },
+    get orphans() { return this.getPropertyValue('orphans'); },
+    set orphans(v) { this.setProperty('orphans', v); },
+    get outline() { return this.getPropertyValue('outline'); },
+    set outline(v) { this.setProperty('outline', v); },
+    get outlineColor() { return this.getPropertyValue('outline-color'); },
+    set outlineColor(v) { this.setProperty('outline-color', v); },
+    get outlineOffset() { return this.getPropertyValue('outline-offset'); },
+    set outlineOffset(v) { this.setProperty('outline-offset', v); },
+    get outlineStyle() { return this.getPropertyValue('outline-style'); },
+    set outlineStyle(v) { this.setProperty('outline-style', v); },
+    get outlineWidth() { return this.getPropertyValue('outline-width'); },
+    set outlineWidth(v) { this.setProperty('outline-width', v); },
+    get overflow() { return this.getPropertyValue('overflow'); },
+    set overflow(v) { this.setProperty('overflow', v); },
+    get overflowX() { return this.getPropertyValue('overflow-x'); },
+    set overflowX(v) { this.setProperty('overflow-x', v); },
+    get overflowY() { return this.getPropertyValue('overflow-y'); },
+    set overflowY(v) { this.setProperty('overflow-y', v); },
+    get padding() { return this.getPropertyValue('padding'); },
+    set padding(v) { this.setProperty('padding', v); },
+    get paddingBottom() { return this.getPropertyValue('padding-bottom'); },
+    set paddingBottom(v) { this.setProperty('padding-bottom', v); },
+    get paddingLeft() { return this.getPropertyValue('padding-left'); },
+    set paddingLeft(v) { this.setProperty('padding-left', v); },
+    get paddingRight() { return this.getPropertyValue('padding-right'); },
+    set paddingRight(v) { this.setProperty('padding-right', v); },
+    get paddingTop() { return this.getPropertyValue('padding-top'); },
+    set paddingTop(v) { this.setProperty('padding-top', v); },
+    get page() { return this.getPropertyValue('page'); },
+    set page(v) { this.setProperty('page', v); },
+    get pageBreakAfter() { return this.getPropertyValue('page-break-after'); },
+    set pageBreakAfter(v) { this.setProperty('page-break-after', v); },
+    get pageBreakBefore() { return this.getPropertyValue('page-break-before'); },
+    set pageBreakBefore(v) { this.setProperty('page-break-before', v); },
+    get pageBreakInside() { return this.getPropertyValue('page-break-inside'); },
+    set pageBreakInside(v) { this.setProperty('page-break-inside', v); },
+    get pause() { return this.getPropertyValue('pause'); },
+    set pause(v) { this.setProperty('pause', v); },
+    get pauseAfter() { return this.getPropertyValue('pause-after'); },
+    set pauseAfter(v) { this.setProperty('pause-after', v); },
+    get pauseBefore() { return this.getPropertyValue('pause-before'); },
+    set pauseBefore(v) { this.setProperty('pause-before', v); },
+    get pitch() { return this.getPropertyValue('pitch'); },
+    set pitch(v) { this.setProperty('pitch', v); },
+    get pitchRange() { return this.getPropertyValue('pitch-range'); },
+    set pitchRange(v) { this.setProperty('pitch-range', v); },
+    get playDuring() { return this.getPropertyValue('play-during'); },
+    set playDuring(v) { this.setProperty('play-during', v); },
+    get pointerEvents() { return this.getPropertyValue('pointer-events'); },
+    set pointerEvents(v) { this.setProperty('pointer-events', v); },
+    get position() { return this.getPropertyValue('position'); },
+    set position(v) { this.setProperty('position', v); },
+    get quotes() { return this.getPropertyValue('quotes'); },
+    set quotes(v) { this.setProperty('quotes', v); },
+    get resize() { return this.getPropertyValue('resize'); },
+    set resize(v) { this.setProperty('resize', v); },
+    get richness() { return this.getPropertyValue('richness'); },
+    set richness(v) { this.setProperty('richness', v); },
+    get right() { return this.getPropertyValue('right'); },
+    set right(v) { this.setProperty('right', v); },
+    get shapeRendering() { return this.getPropertyValue('shape-rendering'); },
+    set shapeRendering(v) { this.setProperty('shape-rendering', v); },
+    get size() { return this.getPropertyValue('size'); },
+    set size(v) { this.setProperty('size', v); },
+    get speak() { return this.getPropertyValue('speak'); },
+    set speak(v) { this.setProperty('speak', v); },
+    get speakHeader() { return this.getPropertyValue('speak-header'); },
+    set speakHeader(v) { this.setProperty('speak-header', v); },
+    get speakNumeral() { return this.getPropertyValue('speak-numeral'); },
+    set speakNumeral(v) { this.setProperty('speak-numeral', v); },
+    get speakPunctuation() { return this.getPropertyValue('speak-punctuation'); },
+    set speakPunctuation(v) { this.setProperty('speak-punctuation', v); },
+    get speechRate() { return this.getPropertyValue('speech-rate'); },
+    set speechRate(v) { this.setProperty('speech-rate', v); },
+    get src() { return this.getPropertyValue('src'); },
+    set src(v) { this.setProperty('src', v); },
+    get stopColor() { return this.getPropertyValue('stop-color'); },
+    set stopColor(v) { this.setProperty('stop-color', v); },
+    get stopOpacity() { return this.getPropertyValue('stop-opacity'); },
+    set stopOpacity(v) { this.setProperty('stop-opacity', v); },
+    get stress() { return this.getPropertyValue('stress'); },
+    set stress(v) { this.setProperty('stress', v); },
+    get stroke() { return this.getPropertyValue('stroke'); },
+    set stroke(v) { this.setProperty('stroke', v); },
+    get strokeDasharray() { return this.getPropertyValue('stroke-dasharray'); },
+    set strokeDasharray(v) { this.setProperty('stroke-dasharray', v); },
+    get strokeDashoffset() { return this.getPropertyValue('stroke-dashoffset'); },
+    set strokeDashoffset(v) { this.setProperty('stroke-dashoffset', v); },
+    get strokeLinecap() { return this.getPropertyValue('stroke-linecap'); },
+    set strokeLinecap(v) { this.setProperty('stroke-linecap', v); },
+    get strokeLinejoin() { return this.getPropertyValue('stroke-linejoin'); },
+    set strokeLinejoin(v) { this.setProperty('stroke-linejoin', v); },
+    get strokeMiterlimit() { return this.getPropertyValue('stroke-miterlimit'); },
+    set strokeMiterlimit(v) { this.setProperty('stroke-miterlimit', v); },
+    get strokeOpacity() { return this.getPropertyValue('stroke-opacity'); },
+    set strokeOpacity(v) { this.setProperty('stroke-opacity', v); },
+    get strokeWidth() { return this.getPropertyValue('stroke-width'); },
+    set strokeWidth(v) { this.setProperty('stroke-width', v); },
+    get tableLayout() { return this.getPropertyValue('table-layout'); },
+    set tableLayout(v) { this.setProperty('table-layout', v); },
+    get textAlign() { return this.getPropertyValue('text-align'); },
+    set textAlign(v) { this.setProperty('text-align', v); },
+    get textAnchor() { return this.getPropertyValue('text-anchor'); },
+    set textAnchor(v) { this.setProperty('text-anchor', v); },
+    get textDecoration() { return this.getPropertyValue('text-decoration'); },
+    set textDecoration(v) { this.setProperty('text-decoration', v); },
+    get textIndent() { return this.getPropertyValue('text-indent'); },
+    set textIndent(v) { this.setProperty('text-indent', v); },
+    get textLineThrough() { return this.getPropertyValue('text-line-through'); },
+    set textLineThrough(v) { this.setProperty('text-line-through', v); },
+    get textLineThroughColor() { return this.getPropertyValue('text-line-through-color'); },
+    set textLineThroughColor(v) { this.setProperty('text-line-through-color', v); },
+    get textLineThroughMode() { return this.getPropertyValue('text-line-through-mode'); },
+    set textLineThroughMode(v) { this.setProperty('text-line-through-mode', v); },
+    get textLineThroughStyle() { return this.getPropertyValue('text-line-through-style'); },
+    set textLineThroughStyle(v) { this.setProperty('text-line-through-style', v); },
+    get textLineThroughWidth() { return this.getPropertyValue('text-line-through-width'); },
+    set textLineThroughWidth(v) { this.setProperty('text-line-through-width', v); },
+    get textOverflow() { return this.getPropertyValue('text-overflow'); },
+    set textOverflow(v) { this.setProperty('text-overflow', v); },
+    get textOverline() { return this.getPropertyValue('text-overline'); },
+    set textOverline(v) { this.setProperty('text-overline', v); },
+    get textOverlineColor() { return this.getPropertyValue('text-overline-color'); },
+    set textOverlineColor(v) { this.setProperty('text-overline-color', v); },
+    get textOverlineMode() { return this.getPropertyValue('text-overline-mode'); },
+    set textOverlineMode(v) { this.setProperty('text-overline-mode', v); },
+    get textOverlineStyle() { return this.getPropertyValue('text-overline-style'); },
+    set textOverlineStyle(v) { this.setProperty('text-overline-style', v); },
+    get textOverlineWidth() { return this.getPropertyValue('text-overline-width'); },
+    set textOverlineWidth(v) { this.setProperty('text-overline-width', v); },
+    get textRendering() { return this.getPropertyValue('text-rendering'); },
+    set textRendering(v) { this.setProperty('text-rendering', v); },
+    get textShadow() { return this.getPropertyValue('text-shadow'); },
+    set textShadow(v) { this.setProperty('text-shadow', v); },
+    get textTransform() { return this.getPropertyValue('text-transform'); },
+    set textTransform(v) { this.setProperty('text-transform', v); },
+    get textUnderline() { return this.getPropertyValue('text-underline'); },
+    set textUnderline(v) { this.setProperty('text-underline', v); },
+    get textUnderlineColor() { return this.getPropertyValue('text-underline-color'); },
+    set textUnderlineColor(v) { this.setProperty('text-underline-color', v); },
+    get textUnderlineMode() { return this.getPropertyValue('text-underline-mode'); },
+    set textUnderlineMode(v) { this.setProperty('text-underline-mode', v); },
+    get textUnderlineStyle() { return this.getPropertyValue('text-underline-style'); },
+    set textUnderlineStyle(v) { this.setProperty('text-underline-style', v); },
+    get textUnderlineWidth() { return this.getPropertyValue('text-underline-width'); },
+    set textUnderlineWidth(v) { this.setProperty('text-underline-width', v); },
+    get top() { return this.getPropertyValue('top'); },
+    set top(v) { this.setProperty('top', v); },
+    get unicodeBidi() { return this.getPropertyValue('unicode-bidi'); },
+    set unicodeBidi(v) { this.setProperty('unicode-bidi', v); },
+    get unicodeRange() { return this.getPropertyValue('unicode-range'); },
+    set unicodeRange(v) { this.setProperty('unicode-range', v); },
+    get vectorEffect() { return this.getPropertyValue('vector-effect'); },
+    set vectorEffect(v) { this.setProperty('vector-effect', v); },
+    get verticalAlign() { return this.getPropertyValue('vertical-align'); },
+    set verticalAlign(v) { this.setProperty('vertical-align', v); },
+    get visibility() { return this.getPropertyValue('visibility'); },
+    set visibility(v) { this.setProperty('visibility', v); },
+    get voiceFamily() { return this.getPropertyValue('voice-family'); },
+    set voiceFamily(v) { this.setProperty('voic-family', v); },
+    get volume() { return this.getPropertyValue('volume'); },
+    set volume(v) { this.setProperty('volume', v); },
+    get webkitAnimation() { return this.getPropertyValue('-webkit-animation'); },
+    set webkitAnimation(v) { this.setProperty('-webkit-animation', v); },
+    get webkitAnimationDelay() { return this.getPropertyValue('-webkit-animation-delay'); },
+    set webkitAnimationDelay(v) { this.setProperty('-webkit-animation-delay', v); },
+    get webkitAnimationDirection() { return this.getPropertyValue('-webkit-animation-direction'); },
+    set webkitAnimationDirection(v) { this.setProperty('-webkit-animation-direction', v); },
+    get webkitAnimationDuration() { return this.getPropertyValue('-webkit-animation-duration'); },
+    set webkitAnimationDuration(v) { this.setProperty('-webkit-animation-duration', v); },
+    get webkitAnimationFillMode() { return this.getPropertyValue('-webkit-animation-fill-mode'); },
+    set webkitAnimationFillMode(v) { this.setProperty('-webkit-animation-fill-mode', v); },
+    get webkitAnimationIterationCount() { return this.getPropertyValue('-webkit-animation-iteration-count'); },
+    set webkitAnimationIterationCount(v) { this.setProperty('-webkit-animation-iteration-count', v); },
+    get webkitAnimationName() { return this.getPropertyValue('-webkit-animation-name'); },
+    set webkitAnimationName(v) { this.setProperty('-webkit-animation-name', v); },
+    get webkitAnimationPlayState() { return this.getPropertyValue('-webkit-animation-play-state'); },
+    set webkitAnimationPlayState(v) { this.setProperty('-webkit-animation-play-state', v); },
+    get webkitAnimationTimingFunction() { return this.getPropertyValue('-webkit-animation-timing-function'); },
+    set webkitAnimationTimingFunction(v) { this.setProperty('-webkit-animation-timing-function', v); },
+    get webkitAppearance() { return this.getPropertyValue('-webkit-appearance'); },
+    set webkitAppearance(v) { this.setProperty('-webkit-appearance', v); },
+    get webkitAspectRatio() { return this.getPropertyValue('-webkit-aspect-ratio'); },
+    set webkitAspectRatio(v) { this.setProperty('-webkit-aspect-ratio', v); },
+    get webkitBackfaceVisibility() { return this.getPropertyValue('-webkit-backface-visibility'); },
+    set webkitBackfaceVisibility(v) { this.setProperty('-webkit-backface-visibility', v); },
+    get webkitBackgroundClip() { return this.getPropertyValue('-webkit-background-clip'); },
+    set webkitBackgroundClip(v) { this.setProperty('-webkit-background-clip', v); },
+    get webkitBackgroundComposite() { return this.getPropertyValue('-webkit-background-composite'); },
+    set webkitBackgroundComposite(v) { this.setProperty('-webkit-background-composite', v); },
+    get webkitBackgroundOrigin() { return this.getPropertyValue('-webkit-background-origin'); },
+    set webkitBackgroundOrigin(v) { this.setProperty('-webkit-background-origin', v); },
+    get webkitBackgroundSize() { return this.getPropertyValue('-webkit-background-size'); },
+    set webkitBackgroundSize(v) { this.setProperty('-webkit-background-size', v); },
+    get webkitBorderAfter() { return this.getPropertyValue('-webkit-border-after'); },
+    set webkitBorderAfter(v) { this.setProperty('-webkit-border-after', v); },
+    get webkitBorderAfterColor() { return this.getPropertyValue('-webkit-border-after-color'); },
+    set webkitBorderAfterColor(v) { this.setProperty('-webkit-border-after-color', v); },
+    get webkitBorderAfterStyle() { return this.getPropertyValue('-webkit-border-after-style'); },
+    set webkitBorderAfterStyle(v) { this.setProperty('-webkit-border-after-style', v); },
+    get webkitBorderAfterWidth() { return this.getPropertyValue('-webkit-border-after-width'); },
+    set webkitBorderAfterWidth(v) { this.setProperty('-webkit-border-after-width', v); },
+    get webkitBorderBefore() { return this.getPropertyValue('-webkit-border-before'); },
+    set webkitBorderBefore(v) { this.setProperty('-webkit-border-before', v); },
+    get webkitBorderBeforeColor() { return this.getPropertyValue('-webkit-border-before-color'); },
+    set webkitBorderBeforeColor(v) { this.setProperty('-webkit-border-before-color', v); },
+    get webkitBorderBeforeStyle() { return this.getPropertyValue('-webkit-border-before-style'); },
+    set webkitBorderBeforeStyle(v) { this.setProperty('-webkit-border-before-style', v); },
+    get webkitBorderBeforeWidth() { return this.getPropertyValue('-webkit-border-before-width'); },
+    set webkitBorderBeforeWidth(v) { this.setProperty('-webkit-border-before-width', v); },
+    get webkitBorderEnd() { return this.getPropertyValue('-webkit-border-end'); },
+    set webkitBorderEnd(v) { this.setProperty('-webkit-border-end', v); },
+    get webkitBorderEndColor() { return this.getPropertyValue('-webkit-border-end-color'); },
+    set webkitBorderEndColor(v) { this.setProperty('-webkit-border-end-color', v); },
+    get webkitBorderEndStyle() { return this.getPropertyValue('-webkit-border-end-style'); },
+    set webkitBorderEndStyle(v) { this.setProperty('-webkit-border-end-style', v); },
+    get webkitBorderEndWidth() { return this.getPropertyValue('-webkit-border-end-width'); },
+    set webkitBorderEndWidth(v) { this.setProperty('-webkit-border-end-width', v); },
+    get webkitBorderFit() { return this.getPropertyValue('-webkit-border-fit'); },
+    set webkitBorderFit(v) { this.setProperty('-webkit-border-fit', v); },
+    get webkitBorderHorizontalSpacing() { return this.getPropertyValue('-webkit-border-horizontal-spacing'); },
+    set webkitBorderHorizontalSpacing(v) { this.setProperty('-webkit-border-horizontal-spacing', v); },
+    get webkitBorderImage() { return this.getPropertyValue('-webkit-border-image'); },
+    set webkitBorderImage(v) { this.setProperty('-webkit-border-image', v); },
+    get webkitBorderRadius() { return this.getPropertyValue('-webkit-border-radius'); },
+    set webkitBorderRadius(v) { this.setProperty('-webkit-border-radius', v); },
+    get webkitBorderStart() { return this.getPropertyValue('-webkit-border-start'); },
+    set webkitBorderStart(v) { this.setProperty('-webkit-border-start', v); },
+    get webkitBorderStartColor() { return this.getPropertyValue('-webkit-border-start-color'); },
+    set webkitBorderStartColor(v) { this.setProperty('-webkit-border-start-color', v); },
+    get webkitBorderStartStyle() { return this.getPropertyValue('-webkit-border-start-style'); },
+    set webkitBorderStartStyle(v) { this.setProperty('-webkit-border-start-style', v); },
+    get webkitBorderStartWidth() { return this.getPropertyValue('-webkit-border-start-width'); },
+    set webkitBorderStartWidth(v) { this.setProperty('-webkit-border-start-width', v); },
+    get webkitBorderVerticalSpacing() { return this.getPropertyValue('-webkit-border-vertical-spacing'); },
+    set webkitBorderVerticalSpacing(v) { this.setProperty('-webkit-border-vertical-spacing', v); },
+    get webkitBoxAlign() { return this.getPropertyValue('-webkit-box-align'); },
+    set webkitBoxAlign(v) { this.setProperty('-webkit-box-align', v); },
+    get webkitBoxDirection() { return this.getPropertyValue('-webkit-box-direction'); },
+    set webkitBoxDirection(v) { this.setProperty('-webkit-box-direction', v); },
+    get webkitBoxFlex() { return this.getPropertyValue('-webkit-box-flex'); },
+    set webkitBoxFlex(v) { this.setProperty('-webkit-box-flex', v); },
+    get webkitBoxFlexGroup() { return this.getPropertyValue('-webkit-box-flex-group'); },
+    set webkitBoxFlexGroup(v) { this.setProperty('-webkit-box-flex-group', v); },
+    get webkitBoxLines() { return this.getPropertyValue('-webkit-box-lines'); },
+    set webkitBoxLines(v) { this.setProperty('-webkit-box-lines', v); },
+    get webkitBoxOrdinalGroup() { return this.getPropertyValue('-webkit-box-ordinal-group'); },
+    set webkitBoxOrdinalGroup(v) { this.setProperty('-webkit-box-ordinal-group', v); },
+    get webkitBoxOrient() { return this.getPropertyValue('-webkit-box-orient'); },
+    set webkitBoxOrient(v) { this.setProperty('-webkit-box-orient', v); },
+    get webkitBoxPack() { return this.getPropertyValue('-webkit-box-pack'); },
+    set webkitBoxPack(v) { this.setProperty('-webkit-box-pack', v); },
+    get webkitBoxReflect() { return this.getPropertyValue('-webkit-box-reflect'); },
+    set webkitBoxReflect(v) { this.setProperty('-webkit-box-reflect', v); },
+    get webkitBoxShadow() { return this.getPropertyValue('-webkit-box-shadow'); },
+    set webkitBoxShadow(v) { this.setProperty('-webkit-box-shadow', v); },
+    get webkitColorCorrection() { return this.getPropertyValue('-webkit-color-correction'); },
+    set webkitColorCorrection(v) { this.setProperty('-webkit-color-correction', v); },
+    get webkitColumnAxis() { return this.getPropertyValue('-webkit-column-axis'); },
+    set webkitColumnAxis(v) { this.setProperty('-webkit-column-axis', v); },
+    get webkitColumnBreakAfter() { return this.getPropertyValue('-webkit-column-break-after'); },
+    set webkitColumnBreakAfter(v) { this.setProperty('-webkit-column-break-after', v); },
+    get webkitColumnBreakBefore() { return this.getPropertyValue('-webkit-column-break-before'); },
+    set webkitColumnBreakBefore(v) { this.setProperty('-webkit-column-break-before', v); },
+    get webkitColumnBreakInside() { return this.getPropertyValue('-webkit-column-break-inside'); },
+    set webkitColumnBreakInside(v) { this.setProperty('-webkit-column-break-inside', v); },
+    get webkitColumnCount() { return this.getPropertyValue('-webkit-column-count'); },
+    set webkitColumnCount(v) { this.setProperty('-webkit-column-count', v); },
+    get webkitColumnGap() { return this.getPropertyValue('-webkit-column-gap'); },
+    set webkitColumnGap(v) { this.setProperty('-webkit-column-gap', v); },
+    get webkitColumnRule() { return this.getPropertyValue('-webkit-column-rule'); },
+    set webkitColumnRule(v) { this.setProperty('-webkit-column-rule', v); },
+    get webkitColumnRuleColor() { return this.getPropertyValue('-webkit-column-rule-color'); },
+    set webkitColumnRuleColor(v) { this.setProperty('-webkit-column-rule-color', v); },
+    get webkitColumnRuleStyle() { return this.getPropertyValue('-webkit-column-rule-style'); },
+    set webkitColumnRuleStyle(v) { this.setProperty('-webkit-column-rule-style', v); },
+    get webkitColumnRuleWidth() { return this.getPropertyValue('-webkit-column-rule-width'); },
+    set webkitColumnRuleWidth(v) { this.setProperty('-webkit-column-rule-width', v); },
+    get webkitColumnSpan() { return this.getPropertyValue('-webkit-column-span'); },
+    set webkitColumnSpan(v) { this.setProperty('-webkit-column-span', v); },
+    get webkitColumnWidth() { return this.getPropertyValue('-webkit-column-width'); },
+    set webkitColumnWidth(v) { this.setProperty('-webkit-column-width', v); },
+    get webkitColumns() { return this.getPropertyValue('-webkit-columns'); },
+    set webkitColumns(v) { this.setProperty('-webkit-columns', v); },
+    get webkitFilter() { return this.getPropertyValue('-webkit-filter'); },
+    set webkitFilter(v) { this.setProperty('-webkit-filter', v); },
+    get webkitFlexAlign() { return this.getPropertyValue('-webkit-flex-align'); },
+    set webkitFlexAlign(v) { this.setProperty('-webkit-flex-align', v); },
+    get webkitFlexDirection() { return this.getPropertyValue('-webkit-flex-direction'); },
+    set webkitFlexDirection(v) { this.setProperty('-webkit-flex-direction', v); },
+    get webkitFlexFlow() { return this.getPropertyValue('-webkit-flex-flow'); },
+    set webkitFlexFlow(v) { this.setProperty('-webkit-flex-flow', v); },
+    get webkitFlexItemAlign() { return this.getPropertyValue('-webkit-flex-item-align'); },
+    set webkitFlexItemAlign(v) { this.setProperty('-webkit-flex-item-align', v); },
+    get webkitFlexLinePack() { return this.getPropertyValue('-webkit-flex-line-pack'); },
+    set webkitFlexLinePack(v) { this.setProperty('-webkit-flex-line-pack', v); },
+    get webkitFlexOrder() { return this.getPropertyValue('-webkit-flex-order'); },
+    set webkitFlexOrder(v) { this.setProperty('-webkit-flex-order', v); },
+    get webkitFlexPack() { return this.getPropertyValue('-webkit-flex-pack'); },
+    set webkitFlexPack(v) { this.setProperty('-webkit-flex-pack', v); },
+    get webkitFlexWrap() { return this.getPropertyValue('-webkit-flex-wrap'); },
+    set webkitFlexWrap(v) { this.setProperty('-webkit-flex-wrap', v); },
+    get webkitFlowFrom() { return this.getPropertyValue('-webkit-flow-from'); },
+    set webkitFlowFrom(v) { this.setProperty('-webkit-flow-from', v); },
+    get webkitFlowInto() { return this.getPropertyValue('-webkit-flow-into'); },
+    set webkitFlowInto(v) { this.setProperty('-webkit-flow-into', v); },
+    get webkitFontFeatureSettings() { return this.getPropertyValue('-webkit-font-feature-settings'); },
+    set webkitFontFeatureSettings(v) { this.setProperty('-webkit-font-feature-settings', v); },
+    get webkitFontKerning() { return this.getPropertyValue('-webkit-font-kerning'); },
+    set webkitFontKerning(v) { this.setProperty('-webkit-font-kerning', v); },
+    get webkitFontSizeDelta() { return this.getPropertyValue('-webkit-font-size-delta'); },
+    set webkitFontSizeDelta(v) { this.setProperty('-webkit-font-size-delta', v); },
+    get webkitFontSmoothing() { return this.getPropertyValue('-webkit-font-smoothing'); },
+    set webkitFontSmoothing(v) { this.setProperty('-webkit-font-smoothing', v); },
+    get webkitFontVariantLigatures() { return this.getPropertyValue('-webkit-font-variant-ligatures'); },
+    set webkitFontVariantLigatures(v) { this.setProperty('-webkit-font-variant-ligatures', v); },
+    get webkitHighlight() { return this.getPropertyValue('-webkit-highlight'); },
+    set webkitHighlight(v) { this.setProperty('-webkit-highlight', v); },
+    get webkitHyphenateCharacter() { return this.getPropertyValue('-webkit-hyphenate-character'); },
+    set webkitHyphenateCharacter(v) { this.setProperty('-webkit-hyphenate-character', v); },
+    get webkitHyphenateLimitAfter() { return this.getPropertyValue('-webkit-hyphenate-limit-after'); },
+    set webkitHyphenateLimitAfter(v) { this.setProperty('-webkit-hyphenate-limit-after', v); },
+    get webkitHyphenateLimitBefore() { return this.getPropertyValue('-webkit-hyphenate-limit-before'); },
+    set webkitHyphenateLimitBefore(v) { this.setProperty('-webkit-hyphenate-limit-before', v); },
+    get webkitHyphenateLimitLines() { return this.getPropertyValue('-webkit-hyphenate-limit-lines'); },
+    set webkitHyphenateLimitLines(v) { this.setProperty('-webkit-hyphenate-limit-lines', v); },
+    get webkitHyphens() { return this.getPropertyValue('-webkit-hyphens'); },
+    set webkitHyphens(v) { this.setProperty('-webkit-hyphens', v); },
+    get webkitLineAlign() { return this.getPropertyValue('-webkit-line-align'); },
+    set webkitLineAlign(v) { this.setProperty('-webkit-line-align', v); },
+    get webkitLineBoxContain() { return this.getPropertyValue('-webkit-line-box-contain'); },
+    set webkitLineBoxContain(v) { this.setProperty('-webkit-line-box-contain', v); },
+    get webkitLineBreak() { return this.getPropertyValue('-webkit-line-break'); },
+    set webkitLineBreak(v) { this.setProperty('-webkit-line-break', v); },
+    get webkitLineClamp() { return this.getPropertyValue('-webkit-line-clamp'); },
+    set webkitLineClamp(v) { this.setProperty('-webkit-line-clamp', v); },
+    get webkitLineGrid() { return this.getPropertyValue('-webkit-line-grid'); },
+    set webkitLineGrid(v) { this.setProperty('-webkit-line-grid', v); },
+    get webkitLineSnap() { return this.getPropertyValue('-webkit-line-snap'); },
+    set webkitLineSnap(v) { this.setProperty('-webkit-line-snap', v); },
+    get webkitLocale() { return this.getPropertyValue('-webkit-locale'); },
+    set webkitLocale(v) { this.setProperty('-webkit-locale', v); },
+    get webkitLogicalHeight() { return this.getPropertyValue('-webkit-logical-height'); },
+    set webkitLogicalHeight(v) { this.setProperty('-webkit-logical-height', v); },
+    get webkitLogicalWidth() { return this.getPropertyValue('-webkit-logical-width'); },
+    set webkitLogicalWidth(v) { this.setProperty('-webkit-logical-width', v); },
+    get webkitMarginAfter() { return this.getPropertyValue('-webkit-margin-after'); },
+    set webkitMarginAfter(v) { this.setProperty('-webkit-margin-after', v); },
+    get webkitMarginAfterCollapse() { return this.getPropertyValue('-webkit-margin-after-collapse'); },
+    set webkitMarginAfterCollapse(v) { this.setProperty('-webkit-margin-after-collapse', v); },
+    get webkitMarginBefore() { return this.getPropertyValue('-webkit-margin-before'); },
+    set webkitMarginBefore(v) { this.setProperty('-webkit-margin-before', v); },
+    get webkitMarginBeforeCollapse() { return this.getPropertyValue('-webkit-margin-before-collapse'); },
+    set webkitMarginBeforeCollapse(v) { this.setProperty('-webkit-margin-before-collapse', v); },
+    get webkitMarginBottomCollapse() { return this.getPropertyValue('-webkit-margin-bottom-collapse'); },
+    set webkitMarginBottomCollapse(v) { this.setProperty('-webkit-margin-bottom-collapse', v); },
+    get webkitMarginCollapse() { return this.getPropertyValue('-webkit-margin-collapse'); },
+    set webkitMarginCollapse(v) { this.setProperty('-webkit-margin-collapse', v); },
+    get webkitMarginEnd() { return this.getPropertyValue('-webkit-margin-end'); },
+    set webkitMarginEnd(v) { this.setProperty('-webkit-margin-end', v); },
+    get webkitMarginStart() { return this.getPropertyValue('-webkit-margin-start'); },
+    set webkitMarginStart(v) { this.setProperty('-webkit-margin-start', v); },
+    get webkitMarginTopCollapse() { return this.getPropertyValue('-webkit-margin-top-collapse'); },
+    set webkitMarginTopCollapse(v) { this.setProperty('-webkit-margin-top-collapse', v); },
+    get webkitMarquee() { return this.getPropertyValue('-webkit-marquee'); },
+    set webkitMarquee(v) { this.setProperty('-webkit-marquee', v); },
+    get webkitMarqueeDirection() { return this.getPropertyValue('-webkit-marquee-direction'); },
+    set webkitMarqueeDirection(v) { this.setProperty('-webkit-marquee-direction', v); },
+    get webkitMarqueeIncrement() { return this.getPropertyValue('-webkit-marquee-increment'); },
+    set webkitMarqueeIncrement(v) { this.setProperty('-webkit-marquee-increment', v); },
+    get webkitMarqueeRepetition() { return this.getPropertyValue('-webkit-marquee-repetition'); },
+    set webkitMarqueeRepetition(v) { this.setProperty('-webkit-marquee-repetition', v); },
+    get webkitMarqueeSpeed() { return this.getPropertyValue('-webkit-marquee-speed'); },
+    set webkitMarqueeSpeed(v) { this.setProperty('-webkit-marquee-speed', v); },
+    get webkitMarqueeStyle() { return this.getPropertyValue('-webkit-marquee-style'); },
+    set webkitMarqueeStyle(v) { this.setProperty('-webkit-marquee-style', v); },
+    get webkitMask() { return this.getPropertyValue('-webkit-mask'); },
+    set webkitMask(v) { this.setProperty('-webkit-mask', v); },
+    get webkitMaskAttachment() { return this.getPropertyValue('-webkit-mask-attachment'); },
+    set webkitMaskAttachment(v) { this.setProperty('-webkit-mask-attachment', v); },
+    get webkitMaskBoxImage() { return this.getPropertyValue('-webkit-mask-box-image'); },
+    set webkitMaskBoxImage(v) { this.setProperty('-webkit-mask-box-image', v); },
+    get webkitMaskBoxImageOutset() { return this.getPropertyValue('-webkit-mask-box-image-outset'); },
+    set webkitMaskBoxImageOutset(v) { this.setProperty('-webkit-mask-box-image-outset', v); },
+    get webkitMaskBoxImageRepeat() { return this.getPropertyValue('-webkit-mask-box-image-repeat'); },
+    set webkitMaskBoxImageRepeat(v) { this.setProperty('-webkit-mask-box-image-repeat', v); },
+    get webkitMaskBoxImageSlice() { return this.getPropertyValue('-webkit-mask-box-image-slice'); },
+    set webkitMaskBoxImageSlice(v) { this.setProperty('-webkit-mask-box-image-slice', v); },
+    get webkitMaskBoxImageSource() { return this.getPropertyValue('-webkit-mask-box-image-source'); },
+    set webkitMaskBoxImageSource(v) { this.setProperty('-webkit-mask-box-image-source', v); },
+    get webkitMaskBoxImageWidth() { return this.getPropertyValue('-webkit-mask-box-image-width'); },
+    set webkitMaskBoxImageWidth(v) { this.setProperty('-webkit-mask-box-image-width', v); },
+    get webkitMaskClip() { return this.getPropertyValue('-webkit-mask-clip'); },
+    set webkitMaskClip(v) { this.setProperty('-webkit-mask-clip', v); },
+    get webkitMaskComposite() { return this.getPropertyValue('-webkit-mask-composite'); },
+    set webkitMaskComposite(v) { this.setProperty('-webkit-mask-composite', v); },
+    get webkitMaskImage() { return this.getPropertyValue('-webkit-mask-image'); },
+    set webkitMaskImage(v) { this.setProperty('-webkit-mask-image', v); },
+    get webkitMaskOrigin() { return this.getPropertyValue('-webkit-mask-origin'); },
+    set webkitMaskOrigin(v) { this.setProperty('-webkit-mask-origin', v); },
+    get webkitMaskPosition() { return this.getPropertyValue('-webkit-mask-position'); },
+    set webkitMaskPosition(v) { this.setProperty('-webkit-mask-position', v); },
+    get webkitMaskPositionX() { return this.getPropertyValue('-webkit-mask-position-x'); },
+    set webkitMaskPositionX(v) { this.setProperty('-webkit-mask-position-x', v); },
+    get webkitMaskPositionY() { return this.getPropertyValue('-webkit-mask-position-y'); },
+    set webkitMaskPositionY(v) { this.setProperty('-webkit-mask-position-y', v); },
+    get webkitMaskRepeat() { return this.getPropertyValue('-webkit-mask-repeat'); },
+    set webkitMaskRepeat(v) { this.setProperty('-webkit-mask-repeat', v); },
+    get webkitMaskRepeatX() { return this.getPropertyValue('-webkit-mask-repeat-x'); },
+    set webkitMaskRepeatX(v) { this.setProperty('-webkit-mask-repeat-x', v); },
+    get webkitMaskRepeatY() { return this.getPropertyValue('-webkit-mask-repeat-y'); },
+    set webkitMaskRepeatY(v) { this.setProperty('-webkit-mask-repeat-y', v); },
+    get webkitMaskSize() { return this.getPropertyValue('-webkit-mask-size'); },
+    set webkitMaskSize(v) { this.setProperty('-webkit-mask-size', v); },
+    get webkitMatchNearestMailBlockquoteColor() { return this.getPropertyValue('-webkit-match-nearest-mail-blockquote-color'); },
+    set webkitMatchNearestMailBlockquoteColor(v) { this.setProperty('-webkit-match-nearest-mail-blockquote-color', v); },
+    get webkitMaxLogicalHeight() { return this.getPropertyValue('-webkit-max-logical-height'); },
+    set webkitMaxLogicalHeight(v) { this.setProperty('-webkit-max-logical-height', v); },
+    get webkitMaxLogicalWidth() { return this.getPropertyValue('-webkit-max-logical-width'); },
+    set webkitMaxLogicalWidth(v) { this.setProperty('-webkit-max-logical-width', v); },
+    get webkitMinLogicalHeight() { return this.getPropertyValue('-webkit-min-logical-height'); },
+    set webkitMinLogicalHeight(v) { this.setProperty('-webkit-min-logical-height', v); },
+    get webkitMinLogicalWidth() { return this.getPropertyValue('-webkit-min-logical-width'); },
+    set webkitMinLogicalWidth(v) { this.setProperty('-webkit-min-logical-width', v); },
+    get webkitNbspMode() { return this.getPropertyValue('-webkit-nbsp-mode'); },
+    set webkitNbspMode(v) { this.setProperty('-webkit-nbsp-mode', v); },
+    get webkitOverflowScrolling() { return this.getPropertyValue('-webkit-overflow-scrolling'); },
+    set webkitOverflowScrolling(v) { this.setProperty('-webkit-overflow-scrolling', v); },
+    get webkitPaddingAfter() { return this.getPropertyValue('-webkit-padding-after'); },
+    set webkitPaddingAfter(v) { this.setProperty('-webkit-padding-after', v); },
+    get webkitPaddingBefore() { return this.getPropertyValue('-webkit-padding-before'); },
+    set webkitPaddingBefore(v) { this.setProperty('-webkit-padding-before', v); },
+    get webkitPaddingEnd() { return this.getPropertyValue('-webkit-padding-end'); },
+    set webkitPaddingEnd(v) { this.setProperty('-webkit-padding-end', v); },
+    get webkitPaddingStart() { return this.getPropertyValue('-webkit-padding-start'); },
+    set webkitPaddingStart(v) { this.setProperty('-webkit-padding-start', v); },
+    get webkitPerspective() { return this.getPropertyValue('-webkit-perspective'); },
+    set webkitPerspective(v) { this.setProperty('-webkit-perspective', v); },
+    get webkitPerspectiveOrigin() { return this.getPropertyValue('-webkit-perspective-origin'); },
+    set webkitPerspectiveOrigin(v) { this.setProperty('-webkit-perspective-origin', v); },
+    get webkitPerspectiveOriginX() { return this.getPropertyValue('-webkit-perspective-origin-x'); },
+    set webkitPerspectiveOriginX(v) { this.setProperty('-webkit-perspective-origin-x', v); },
+    get webkitPerspectiveOriginY() { return this.getPropertyValue('-webkit-perspective-origin-y'); },
+    set webkitPerspectiveOriginY(v) { this.setProperty('-webkit-perspective-origin-y', v); },
+    get webkitPrintColorAdjust() { return this.getPropertyValue('-webkit-print-color-adjust'); },
+    set webkitPrintColorAdjust(v) { this.setProperty('-webkit-print-color-adjust', v); },
+    get webkitRegionBreakAfter() { return this.getPropertyValue('-webkit-region-break-after'); },
+    set webkitRegionBreakAfter(v) { this.setProperty('-webkit-region-break-after', v); },
+    get webkitRegionBreakBefore() { return this.getPropertyValue('-webkit-region-break-before'); },
+    set webkitRegionBreakBefore(v) { this.setProperty('-webkit-region-break-before', v); },
+    get webkitRegionBreakInside() { return this.getPropertyValue('-webkit-region-break-inside'); },
+    set webkitRegionBreakInside(v) { this.setProperty('-webkit-region-break-inside', v); },
+    get webkitRegionOverflow() { return this.getPropertyValue('-webkit-region-overflow'); },
+    set webkitRegionOverflow(v) { this.setProperty('-webkit-region-overflow', v); },
+    get webkitRtlOrdering() { return this.getPropertyValue('-webkit-rtl-ordering'); },
+    set webkitRtlOrdering(v) { this.setProperty('-webkit-rtl-ordering', v); },
+    get webkitSvgShadow() { return this.getPropertyValue('-webkit-svg-shadow'); },
+    set webkitSvgShadow(v) { this.setProperty('-webkit-svg-shadow', v); },
+    get webkitTapHighlightColor() { return this.getPropertyValue('-webkit-tap-highlight-color'); },
+    set webkitTapHighlightColor(v) { this.setProperty('-webkit-tap-highlight-color', v); },
+    get webkitTextCombine() { return this.getPropertyValue('-webkit-text-combine'); },
+    set webkitTextCombine(v) { this.setProperty('-webkit-text-combine', v); },
+    get webkitTextDecorationsInEffect() { return this.getPropertyValue('-webkit-text-decorations-in-effect'); },
+    set webkitTextDecorationsInEffect(v) { this.setProperty('-webkit-text-decorations-in-effect', v); },
+    get webkitTextEmphasis() { return this.getPropertyValue('-webkit-text-emphasis'); },
+    set webkitTextEmphasis(v) { this.setProperty('-webkit-text-emphasis', v); },
+    get webkitTextEmphasisColor() { return this.getPropertyValue('-webkit-text-emphasis-color'); },
+    set webkitTextEmphasisColor(v) { this.setProperty('-webkit-text-emphasis-color', v); },
+    get webkitTextEmphasisPosition() { return this.getPropertyValue('-webkit-text-emphasis-position'); },
+    set webkitTextEmphasisPosition(v) { this.setProperty('-webkit-text-emphasis-position', v); },
+    get webkitTextEmphasisStyle() { return this.getPropertyValue('-webkit-text-emphasis-style'); },
+    set webkitTextEmphasisStyle(v) { this.setProperty('-webkit-text-emphasis-style', v); },
+    get webkitTextFillColor() { return this.getPropertyValue('-webkit-text-fill-color'); },
+    set webkitTextFillColor(v) { this.setProperty('-webkit-text-fill-color', v); },
+    get webkitTextOrientation() { return this.getPropertyValue('-webkit-text-orientation'); },
+    set webkitTextOrientation(v) { this.setProperty('-webkit-text-orientation', v); },
+    get webkitTextSecurity() { return this.getPropertyValue('-webkit-text-security'); },
+    set webkitTextSecurity(v) { this.setProperty('-webkit-text-security', v); },
+    get webkitTextSizeAdjust() { return this.getPropertyValue('-webkit-text-size-adjust'); },
+    set webkitTextSizeAdjust(v) { this.setProperty('-webkit-text-size-adjust', v); },
+    get webkitTextStroke() { return this.getPropertyValue('-webkit-text-stroke'); },
+    set webkitTextStroke(v) { this.setProperty('-webkit-text-stroke', v); },
+    get webkitTextStrokeColor() { return this.getPropertyValue('-webkit-text-stroke-color'); },
+    set webkitTextStrokeColor(v) { this.setProperty('-webkit-text-stroke-color', v); },
+    get webkitTextStrokeWidth() { return this.getPropertyValue('-webkit-text-stroke-width'); },
+    set webkitTextStrokeWidth(v) { this.setProperty('-webkit-text-stroke-width', v); },
+    get webkitTransform() { return this.getPropertyValue('-webkit-transform'); },
+    set webkitTransform(v) { this.setProperty('-webkit-transform', v); },
+    get webkitTransformOrigin() { return this.getPropertyValue('-webkit-transform-origin'); },
+    set webkitTransformOrigin(v) { this.setProperty('-webkit-transform-origin', v); },
+    get webkitTransformOriginX() { return this.getPropertyValue('-webkit-transform-origin-x'); },
+    set webkitTransformOriginX(v) { this.setProperty('-webkit-transform-origin-x', v); },
+    get webkitTransformOriginY() { return this.getPropertyValue('-webkit-transform-origin-y'); },
+    set webkitTransformOriginY(v) { this.setProperty('-webkit-transform-origin-y', v); },
+    get webkitTransformOriginZ() { return this.getPropertyValue('-webkit-transform-origin-z'); },
+    set webkitTransformOriginZ(v) { this.setProperty('-webkit-transform-origin-z', v); },
+    get webkitTransformStyle() { return this.getPropertyValue('-webkit-transform-style'); },
+    set webkitTransformStyle(v) { this.setProperty('-webkit-transform-style', v); },
+    get webkitTransition() { return this.getPropertyValue('-webkit-transition'); },
+    set webkitTransition(v) { this.setProperty('-webkit-transition', v); },
+    get webkitTransitionDelay() { return this.getPropertyValue('-webkit-transition-delay'); },
+    set webkitTransitionDelay(v) { this.setProperty('-webkit-transition-delay', v); },
+    get webkitTransitionDuration() { return this.getPropertyValue('-webkit-transition-duration'); },
+    set webkitTransitionDuration(v) { this.setProperty('-webkit-transition-duration', v); },
+    get webkitTransitionProperty() { return this.getPropertyValue('-webkit-transition-property'); },
+    set webkitTransitionProperty(v) { this.setProperty('-webkit-transition-property', v); },
+    get webkitTransitionTimingFunction() { return this.getPropertyValue('-webkit-transition-timing-function'); },
+    set webkitTransitionTimingFunction(v) { this.setProperty('-webkit-transition-timing-function', v); },
+    get webkitUserDrag() { return this.getPropertyValue('-webkit-user-drag'); },
+    set webkitUserDrag(v) { this.setProperty('-webkit-user-drag', v); },
+    get webkitUserModify() { return this.getPropertyValue('-webkit-user-modify'); },
+    set webkitUserModify(v) { this.setProperty('-webkit-user-modify', v); },
+    get webkitUserSelect() { return this.getPropertyValue('-webkit-user-select'); },
+    set webkitUserSelect(v) { this.setProperty('-webkit-user-select', v); },
+    get webkitWrap() { return this.getPropertyValue('-webkit-wrap'); },
+    set webkitWrap(v) { this.setProperty('-webkit-wrap', v); },
+    get webkitWrapFlow() { return this.getPropertyValue('-webkit-wrap-flow'); },
+    set webkitWrapFlow(v) { this.setProperty('-webkit-wrap-flow', v); },
+    get webkitWrapMargin() { return this.getPropertyValue('-webkit-wrap-margin'); },
+    set webkitWrapMargin(v) { this.setProperty('-webkit-wrap-margin', v); },
+    get webkitWrapPadding() { return this.getPropertyValue('-webkit-wrap-padding'); },
+    set webkitWrapPadding(v) { this.setProperty('-webkit-wrap-padding', v); },
+    get webkitWrapShapeInside() { return this.getPropertyValue('-webkit-wrap-shape-inside'); },
+    set webkitWrapShapeInside(v) { this.setProperty('-webkit-wrap-shape-inside', v); },
+    get webkitWrapShapeOutside() { return this.getPropertyValue('-webkit-wrap-shape-outside'); },
+    set webkitWrapShapeOutside(v) { this.setProperty('-webkit-wrap-shape-outside', v); },
+    get webkitWrapThrough() { return this.getPropertyValue('-webkit-wrap-through'); },
+    set webkitWrapThrough(v) { this.setProperty('-webkit-wrap-through', v); },
+    get webkitWritingMode() { return this.getPropertyValue('-webkit-writing-mode'); },
+    set webkitWritingMode(v) { this.setProperty('-webkit-writing-mode', v); },
+    get whiteSpace() { return this.getPropertyValue('white-space'); },
+    set whiteSpace(v) { this.setProperty('white-space', v); },
+    get widows() { return this.getPropertyValue('widows'); },
+    set widows(v) { this.setProperty('widows', v); },
+    get width() { return this.getPropertyValue('width'); },
+    set width(v) { this.setProperty('width', v); },
+    get wordBreak() { return this.getPropertyValue('word-break'); },
+    set wordBreak(v) { this.setProperty('word-break', v); },
+    get wordSpacing() { return this.getPropertyValue('word-spacing'); },
+    set wordSpacing(v) { this.setProperty('word-spacing', v); },
+    get wordWrap() { return this.getPropertyValue('word-wrap'); },
+    set wordWrap(v) { this.setProperty('word-wrap', v); },
+    get writingMode() { return this.getPropertyValue('writing-mode'); },
+    set writingMode(v) { this.setProperty('writing-mode', v); },
+    get zIndex() { return this.getPropertyValue('z-index'); },
+    set zIndex(v) { this.setProperty('z-index', v); },
+    get zoom() { return this.getPropertyValue('zoom'); },
+    set zoom(v) { this.setProperty('zoom', v); }
+
+};
+
+/*
+    var property_files = fs.readdirSync(__dirname + '/properties');
+    var self = this;
+    property_files.forEach(function (property) {
+        if (property.substr(-3) === '.js') {
+            property = path.basename(property, '.js');
+            Object.defineProperty(self, property, require('./properties/' + property));
+        }
+    });
+};
+*/
+
+exports.CSSStyleDeclaration = CSSStyleDeclaration;
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/alignmentBaseline.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/alignmentBaseline.js
new file mode 100644
index 0000000..d714dca
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/alignmentBaseline.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('alignment-baseline', v);
+    },
+    get: function () {
+        return this.getPropertyValue('alignment-baseline');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/azimuth.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/azimuth.js
new file mode 100644
index 0000000..1624050
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/azimuth.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('azimuth', v);
+    },
+    get: function () {
+        return this.getPropertyValue('azimuth');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/background.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/background.js
new file mode 100644
index 0000000..f2b9cd8
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/background.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('background', v);
+    },
+    get: function () {
+        return this.getPropertyValue('background');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundAttachment.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundAttachment.js
new file mode 100644
index 0000000..a453393
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundAttachment.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('background-attachment', v);
+    },
+    get: function () {
+        return this.getPropertyValue('background-attachment');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundClip.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundClip.js
new file mode 100644
index 0000000..59cae59
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundClip.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('background-clip', v);
+    },
+    get: function () {
+        return this.getPropertyValue('background-clip');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundColor.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundColor.js
new file mode 100644
index 0000000..0fcb4a5
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundColor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('background-color', v);
+    },
+    get: function () {
+        return this.getPropertyValue('background-color');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundImage.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundImage.js
new file mode 100644
index 0000000..ccd117f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundImage.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('background-image', v);
+    },
+    get: function () {
+        return this.getPropertyValue('background-image');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundOrigin.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundOrigin.js
new file mode 100644
index 0000000..347ebb1
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundOrigin.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('background-origin', v);
+    },
+    get: function () {
+        return this.getPropertyValue('background-origin');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundPosition.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundPosition.js
new file mode 100644
index 0000000..ad5d761
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundPosition.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('background-position', v);
+    },
+    get: function () {
+        return this.getPropertyValue('background-position');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundPositionX.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundPositionX.js
new file mode 100644
index 0000000..478c176
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundPositionX.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('background-position-x', v);
+    },
+    get: function () {
+        return this.getPropertyValue('background-position-x');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundPositionY.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundPositionY.js
new file mode 100644
index 0000000..feff9e8
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundPositionY.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('background-position-y', v);
+    },
+    get: function () {
+        return this.getPropertyValue('background-position-y');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundRepeat.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundRepeat.js
new file mode 100644
index 0000000..dba5f37
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundRepeat.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('background-repeat', v);
+    },
+    get: function () {
+        return this.getPropertyValue('background-repeat');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundRepeatX.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundRepeatX.js
new file mode 100644
index 0000000..230124a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundRepeatX.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('background-repeat-x', v);
+    },
+    get: function () {
+        return this.getPropertyValue('background-repeat-x');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundRepeatY.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundRepeatY.js
new file mode 100644
index 0000000..a5471fd
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundRepeatY.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('background-repeat-y', v);
+    },
+    get: function () {
+        return this.getPropertyValue('background-repeat-y');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundSize.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundSize.js
new file mode 100644
index 0000000..4e2d662
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundSize.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('background-size', v);
+    },
+    get: function () {
+        return this.getPropertyValue('background-size');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/baselineShift.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/baselineShift.js
new file mode 100644
index 0000000..1898648
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/baselineShift.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('baseline-shift', v);
+    },
+    get: function () {
+        return this.getPropertyValue('baseline-shift');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/border.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/border.js
new file mode 100644
index 0000000..6680d68
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/border.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottom.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottom.js
new file mode 100644
index 0000000..741226b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottom.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-bottom', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-bottom');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottomColor.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottomColor.js
new file mode 100644
index 0000000..17d64e2
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottomColor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-bottom-color', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-bottom-color');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottomLeftRadius.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottomLeftRadius.js
new file mode 100644
index 0000000..9a94458
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottomLeftRadius.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-bottom-left-radius', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-bottom-left-radius');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottomRightRadius.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottomRightRadius.js
new file mode 100644
index 0000000..893e290
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottomRightRadius.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-bottom-right-radius', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-bottom-right-radius');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottomStyle.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottomStyle.js
new file mode 100644
index 0000000..cb12907
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottomStyle.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-bottom-style', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-bottom-style');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottomWidth.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottomWidth.js
new file mode 100644
index 0000000..49e23c0
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottomWidth.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-bottom-width', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-bottom-width');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderCollapse.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderCollapse.js
new file mode 100644
index 0000000..b035cec
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderCollapse.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-collapse', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-collapse');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderColor.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderColor.js
new file mode 100644
index 0000000..49e0f20
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderColor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-color', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-color');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImage.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImage.js
new file mode 100644
index 0000000..142ccf5
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImage.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-image', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-image');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImageOutset.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImageOutset.js
new file mode 100644
index 0000000..17bc6ee
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImageOutset.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-image-outset', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-image-outset');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImageRepeat.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImageRepeat.js
new file mode 100644
index 0000000..8c7c9d0
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImageRepeat.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-image-repeat', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-image-repeat');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImageSlice.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImageSlice.js
new file mode 100644
index 0000000..10449b8
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImageSlice.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-image-slice', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-image-slice');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImageSource.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImageSource.js
new file mode 100644
index 0000000..e79f1ff
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImageSource.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-image-source', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-image-source');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImageWidth.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImageWidth.js
new file mode 100644
index 0000000..e2ab2e4
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImageWidth.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-image-width', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-image-width');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderLeft.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderLeft.js
new file mode 100644
index 0000000..d588900
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderLeft.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-left', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-left');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderLeftColor.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderLeftColor.js
new file mode 100644
index 0000000..814cfd4
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderLeftColor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-left-color', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-left-color');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderLeftStyle.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderLeftStyle.js
new file mode 100644
index 0000000..736f2b7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderLeftStyle.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-left-style', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-left-style');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderLeftWidth.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderLeftWidth.js
new file mode 100644
index 0000000..10a7948
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderLeftWidth.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-left-width', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-left-width');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderRadius.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderRadius.js
new file mode 100644
index 0000000..78dd43d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderRadius.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-radius', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-radius');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderRight.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderRight.js
new file mode 100644
index 0000000..9e2e7b7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderRight.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-right', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-right');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderRightColor.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderRightColor.js
new file mode 100644
index 0000000..60f1705
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderRightColor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-right-color', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-right-color');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderRightStyle.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderRightStyle.js
new file mode 100644
index 0000000..8d908bc
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderRightStyle.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-right-style', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-right-style');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderRightWidth.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderRightWidth.js
new file mode 100644
index 0000000..64be14b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderRightWidth.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-right-width', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-right-width');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderSpacing.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderSpacing.js
new file mode 100644
index 0000000..e9d12db
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderSpacing.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-spacing', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-spacing');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderStyle.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderStyle.js
new file mode 100644
index 0000000..fbab688
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderStyle.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-style', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-style');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTop.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTop.js
new file mode 100644
index 0000000..6c28c89
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTop.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-top', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-top');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTopColor.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTopColor.js
new file mode 100644
index 0000000..dc86e0f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTopColor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-top-color', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-top-color');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTopLeftRadius.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTopLeftRadius.js
new file mode 100644
index 0000000..7e9a2ba
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTopLeftRadius.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-top-left-radius', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-top-left-radius');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTopRightRadius.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTopRightRadius.js
new file mode 100644
index 0000000..83a5c54
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTopRightRadius.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-top-right-radius', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-top-right-radius');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTopStyle.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTopStyle.js
new file mode 100644
index 0000000..0b0473c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTopStyle.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-top-style', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-top-style');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTopWidth.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTopWidth.js
new file mode 100644
index 0000000..66d7fda
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTopWidth.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-top-width', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-top-width');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderWidth.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderWidth.js
new file mode 100644
index 0000000..fc11195
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/borderWidth.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('border-width', v);
+    },
+    get: function () {
+        return this.getPropertyValue('border-width');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/bottom.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/bottom.js
new file mode 100644
index 0000000..5146510
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/bottom.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('bottom', v);
+    },
+    get: function () {
+        return this.getPropertyValue('bottom');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/boxShadow.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/boxShadow.js
new file mode 100644
index 0000000..4f60633
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/boxShadow.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('box-shadow', v);
+    },
+    get: function () {
+        return this.getPropertyValue('box-shadow');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/boxSizing.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/boxSizing.js
new file mode 100644
index 0000000..1c1c700
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/boxSizing.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('box-sizing', v);
+    },
+    get: function () {
+        return this.getPropertyValue('box-sizing');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/captionSide.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/captionSide.js
new file mode 100644
index 0000000..f1a3a99
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/captionSide.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('caption-side', v);
+    },
+    get: function () {
+        return this.getPropertyValue('caption-side');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/clear.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/clear.js
new file mode 100644
index 0000000..1731f51
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/clear.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('clear', v);
+    },
+    get: function () {
+        return this.getPropertyValue('clear');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/clip.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/clip.js
new file mode 100644
index 0000000..a464ff9
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/clip.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('clip', v);
+    },
+    get: function () {
+        return this.getPropertyValue('clip');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/clipPath.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/clipPath.js
new file mode 100644
index 0000000..d83849e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/clipPath.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('clip-path', v);
+    },
+    get: function () {
+        return this.getPropertyValue('clip-path');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/clipRule.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/clipRule.js
new file mode 100644
index 0000000..9b0400d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/clipRule.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('clip-rule', v);
+    },
+    get: function () {
+        return this.getPropertyValue('clip-rule');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/color.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/color.js
new file mode 100644
index 0000000..339f62a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/color.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('color', v);
+    },
+    get: function () {
+        return this.getPropertyValue('color');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/colorInterpolation.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/colorInterpolation.js
new file mode 100644
index 0000000..60919ce
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/colorInterpolation.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('color-interpolation', v);
+    },
+    get: function () {
+        return this.getPropertyValue('color-interpolation');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/colorInterpolationFilters.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/colorInterpolationFilters.js
new file mode 100644
index 0000000..7222ef3
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/colorInterpolationFilters.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('color-interpolation-filters', v);
+    },
+    get: function () {
+        return this.getPropertyValue('color-interpolation-filters');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/colorProfile.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/colorProfile.js
new file mode 100644
index 0000000..15977a9
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/colorProfile.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('color-profile', v);
+    },
+    get: function () {
+        return this.getPropertyValue('color-profile');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/colorRendering.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/colorRendering.js
new file mode 100644
index 0000000..d7bb355
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/colorRendering.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('color-rendering', v);
+    },
+    get: function () {
+        return this.getPropertyValue('color-rendering');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/content.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/content.js
new file mode 100644
index 0000000..52b496d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/content.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('content', v);
+    },
+    get: function () {
+        return this.getPropertyValue('content');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/counterIncrement.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/counterIncrement.js
new file mode 100644
index 0000000..5c7899d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/counterIncrement.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('counter-increment', v);
+    },
+    get: function () {
+        return this.getPropertyValue('counter-increment');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/counterReset.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/counterReset.js
new file mode 100644
index 0000000..791ed5e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/counterReset.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('counter-reset', v);
+    },
+    get: function () {
+        return this.getPropertyValue('counter-reset');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/cssFloat.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/cssFloat.js
new file mode 100644
index 0000000..08ef593
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/cssFloat.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('float', v);
+    },
+    get: function () {
+        return this.getPropertyValue('float');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/cue.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/cue.js
new file mode 100644
index 0000000..3c96700
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/cue.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('cue', v);
+    },
+    get: function () {
+        return this.getPropertyValue('cue');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/cueAfter.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/cueAfter.js
new file mode 100644
index 0000000..78acf5b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/cueAfter.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('cue-after', v);
+    },
+    get: function () {
+        return this.getPropertyValue('cue-after');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/cueBefore.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/cueBefore.js
new file mode 100644
index 0000000..d1a2025
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/cueBefore.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('cue-before', v);
+    },
+    get: function () {
+        return this.getPropertyValue('cue-before');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/cursor.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/cursor.js
new file mode 100644
index 0000000..56962fd
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/cursor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('cursor', v);
+    },
+    get: function () {
+        return this.getPropertyValue('cursor');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/direction.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/direction.js
new file mode 100644
index 0000000..b82799b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/direction.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('direction', v);
+    },
+    get: function () {
+        return this.getPropertyValue('direction');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/display.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/display.js
new file mode 100644
index 0000000..bcd33d2
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/display.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('display', v);
+    },
+    get: function () {
+        return this.getPropertyValue('display');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/dominantBaseline.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/dominantBaseline.js
new file mode 100644
index 0000000..e10b140
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/dominantBaseline.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('dominant-baseline', v);
+    },
+    get: function () {
+        return this.getPropertyValue('dominant-baseline');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/elevation.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/elevation.js
new file mode 100644
index 0000000..14a2aae
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/elevation.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('elevation', v);
+    },
+    get: function () {
+        return this.getPropertyValue('elevation');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/emptyCells.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/emptyCells.js
new file mode 100644
index 0000000..cd375eb
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/emptyCells.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('empty-cells', v);
+    },
+    get: function () {
+        return this.getPropertyValue('empty-cells');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/enableBackground.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/enableBackground.js
new file mode 100644
index 0000000..6a203a6
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/enableBackground.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('enable-background', v);
+    },
+    get: function () {
+        return this.getPropertyValue('enable-background');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fill.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fill.js
new file mode 100644
index 0000000..23a3351
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fill.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('fill', v);
+    },
+    get: function () {
+        return this.getPropertyValue('fill');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fillOpacity.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fillOpacity.js
new file mode 100644
index 0000000..02efc30
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fillOpacity.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('fill-opacity', v);
+    },
+    get: function () {
+        return this.getPropertyValue('fill-opacity');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fillRule.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fillRule.js
new file mode 100644
index 0000000..5fc9f4a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fillRule.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('fill-rule', v);
+    },
+    get: function () {
+        return this.getPropertyValue('fill-rule');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/filter.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/filter.js
new file mode 100644
index 0000000..683f0a0
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/filter.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('filter', v);
+    },
+    get: function () {
+        return this.getPropertyValue('filter');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/floodColor.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/floodColor.js
new file mode 100644
index 0000000..5b4372e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/floodColor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('flood-color', v);
+    },
+    get: function () {
+        return this.getPropertyValue('flood-color');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/floodOpacity.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/floodOpacity.js
new file mode 100644
index 0000000..499887a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/floodOpacity.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('flood-opacity', v);
+    },
+    get: function () {
+        return this.getPropertyValue('flood-opacity');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/font.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/font.js
new file mode 100644
index 0000000..bd3c67d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/font.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('font', v);
+    },
+    get: function () {
+        return this.getPropertyValue('font');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fontFamily.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fontFamily.js
new file mode 100644
index 0000000..425a522
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fontFamily.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('font-family', v);
+    },
+    get: function () {
+        return this.getPropertyValue('font-family');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fontSize.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fontSize.js
new file mode 100644
index 0000000..ac67bca
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fontSize.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('font-size', v);
+    },
+    get: function () {
+        return this.getPropertyValue('font-size');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fontSizeAdjust.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fontSizeAdjust.js
new file mode 100644
index 0000000..5b04a5b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fontSizeAdjust.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('font-size-adjust', v);
+    },
+    get: function () {
+        return this.getPropertyValue('font-size-adjust');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fontStretch.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fontStretch.js
new file mode 100644
index 0000000..7498fff
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fontStretch.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('font-stretch', v);
+    },
+    get: function () {
+        return this.getPropertyValue('font-stretch');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fontStyle.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fontStyle.js
new file mode 100644
index 0000000..f8778cd
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fontStyle.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('font-style', v);
+    },
+    get: function () {
+        return this.getPropertyValue('font-style');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fontVariant.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fontVariant.js
new file mode 100644
index 0000000..aafd6de
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fontVariant.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('font-variant', v);
+    },
+    get: function () {
+        return this.getPropertyValue('font-variant');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fontWeight.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fontWeight.js
new file mode 100644
index 0000000..c40a02d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/fontWeight.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('font-weight', v);
+    },
+    get: function () {
+        return this.getPropertyValue('font-weight');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/glyphOrientationHorizontal.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/glyphOrientationHorizontal.js
new file mode 100644
index 0000000..067fa05
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/glyphOrientationHorizontal.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('glyph-orientation-horizontal', v);
+    },
+    get: function () {
+        return this.getPropertyValue('glyph-orientation-horizontal');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/glyphOrientationVertical.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/glyphOrientationVertical.js
new file mode 100644
index 0000000..a8401db
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/glyphOrientationVertical.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('glyph-orientation-vertical', v);
+    },
+    get: function () {
+        return this.getPropertyValue('glyph-orientation-vertical');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/height.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/height.js
new file mode 100644
index 0000000..cccca13
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/height.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('height', v);
+    },
+    get: function () {
+        return this.getPropertyValue('height');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/imageRendering.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/imageRendering.js
new file mode 100644
index 0000000..4af2356
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/imageRendering.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('image-rendering', v);
+    },
+    get: function () {
+        return this.getPropertyValue('image-rendering');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/kerning.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/kerning.js
new file mode 100644
index 0000000..f56d032
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/kerning.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('kerning', v);
+    },
+    get: function () {
+        return this.getPropertyValue('kerning');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/left.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/left.js
new file mode 100644
index 0000000..96e4cfa
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/left.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('left', v);
+    },
+    get: function () {
+        return this.getPropertyValue('left');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/letterSpacing.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/letterSpacing.js
new file mode 100644
index 0000000..8b589b3
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/letterSpacing.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('letter-spacing', v);
+    },
+    get: function () {
+        return this.getPropertyValue('letter-spacing');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/lightingColor.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/lightingColor.js
new file mode 100644
index 0000000..b2b914b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/lightingColor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('lighting-color', v);
+    },
+    get: function () {
+        return this.getPropertyValue('lighting-color');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/lineHeight.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/lineHeight.js
new file mode 100644
index 0000000..e0167c0
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/lineHeight.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('line-height', v);
+    },
+    get: function () {
+        return this.getPropertyValue('line-height');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/listStyle.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/listStyle.js
new file mode 100644
index 0000000..27a18de
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/listStyle.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('list-style', v);
+    },
+    get: function () {
+        return this.getPropertyValue('list-style');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/listStyleImage.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/listStyleImage.js
new file mode 100644
index 0000000..4ebb7d9
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/listStyleImage.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('list-style-image', v);
+    },
+    get: function () {
+        return this.getPropertyValue('list-style-image');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/listStylePosition.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/listStylePosition.js
new file mode 100644
index 0000000..b554a93
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/listStylePosition.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('list-style-position', v);
+    },
+    get: function () {
+        return this.getPropertyValue('list-style-position');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/listStyleType.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/listStyleType.js
new file mode 100644
index 0000000..4d1f291
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/listStyleType.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('list-style-type', v);
+    },
+    get: function () {
+        return this.getPropertyValue('list-style-type');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/margin.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/margin.js
new file mode 100644
index 0000000..29d77c5
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/margin.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('margin', v);
+    },
+    get: function () {
+        return this.getPropertyValue('margin');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/marginBottom.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/marginBottom.js
new file mode 100644
index 0000000..19d9b9b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/marginBottom.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('margin-bottom', v);
+    },
+    get: function () {
+        return this.getPropertyValue('margin-bottom');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/marginLeft.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/marginLeft.js
new file mode 100644
index 0000000..6597dc2
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/marginLeft.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('margin-left', v);
+    },
+    get: function () {
+        return this.getPropertyValue('margin-left');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/marginRight.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/marginRight.js
new file mode 100644
index 0000000..1e9d4ba
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/marginRight.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('margin-right', v);
+    },
+    get: function () {
+        return this.getPropertyValue('margin-right');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/marginTop.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/marginTop.js
new file mode 100644
index 0000000..d698cb8
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/marginTop.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('margin-top', v);
+    },
+    get: function () {
+        return this.getPropertyValue('margin-top');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/marker.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/marker.js
new file mode 100644
index 0000000..09510e3
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/marker.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('marker', v);
+    },
+    get: function () {
+        return this.getPropertyValue('marker');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/markerEnd.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/markerEnd.js
new file mode 100644
index 0000000..70abca5
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/markerEnd.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('marker-end', v);
+    },
+    get: function () {
+        return this.getPropertyValue('marker-end');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/markerMid.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/markerMid.js
new file mode 100644
index 0000000..e25c67b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/markerMid.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('marker-mid', v);
+    },
+    get: function () {
+        return this.getPropertyValue('marker-mid');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/markerOffset.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/markerOffset.js
new file mode 100644
index 0000000..43497f0
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/markerOffset.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('marker-offset', v);
+    },
+    get: function () {
+        return this.getPropertyValue('marker-offset');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/markerStart.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/markerStart.js
new file mode 100644
index 0000000..8748073
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/markerStart.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('marker-start', v);
+    },
+    get: function () {
+        return this.getPropertyValue('marker-start');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/marks.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/marks.js
new file mode 100644
index 0000000..add1ff7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/marks.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('marks', v);
+    },
+    get: function () {
+        return this.getPropertyValue('marks');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/mask.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/mask.js
new file mode 100644
index 0000000..bbc8b8b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/mask.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('mask', v);
+    },
+    get: function () {
+        return this.getPropertyValue('mask');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/maxHeight.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/maxHeight.js
new file mode 100644
index 0000000..d0073e0
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/maxHeight.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('max-height', v);
+    },
+    get: function () {
+        return this.getPropertyValue('max-height');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/maxWidth.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/maxWidth.js
new file mode 100644
index 0000000..9f18490
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/maxWidth.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('max-width', v);
+    },
+    get: function () {
+        return this.getPropertyValue('max-width');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/minHeight.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/minHeight.js
new file mode 100644
index 0000000..15c0804
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/minHeight.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('min-height', v);
+    },
+    get: function () {
+        return this.getPropertyValue('min-height');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/minWidth.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/minWidth.js
new file mode 100644
index 0000000..88f8e59
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/minWidth.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('min-width', v);
+    },
+    get: function () {
+        return this.getPropertyValue('min-width');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/opacity.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/opacity.js
new file mode 100644
index 0000000..c8720b7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/opacity.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('opacity', v);
+    },
+    get: function () {
+        return this.getPropertyValue('opacity');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/orphans.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/orphans.js
new file mode 100644
index 0000000..cbec61a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/orphans.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('orphans', v);
+    },
+    get: function () {
+        return this.getPropertyValue('orphans');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/outline.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/outline.js
new file mode 100644
index 0000000..86f1bfb
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/outline.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('outline', v);
+    },
+    get: function () {
+        return this.getPropertyValue('outline');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/outlineColor.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/outlineColor.js
new file mode 100644
index 0000000..e8c359c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/outlineColor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('outline-color', v);
+    },
+    get: function () {
+        return this.getPropertyValue('outline-color');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/outlineOffset.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/outlineOffset.js
new file mode 100644
index 0000000..09d1dee
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/outlineOffset.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('outline-offset', v);
+    },
+    get: function () {
+        return this.getPropertyValue('outline-offset');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/outlineStyle.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/outlineStyle.js
new file mode 100644
index 0000000..0195ddd
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/outlineStyle.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('outline-style', v);
+    },
+    get: function () {
+        return this.getPropertyValue('outline-style');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/outlineWidth.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/outlineWidth.js
new file mode 100644
index 0000000..93ee1d6
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/outlineWidth.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('outline-width', v);
+    },
+    get: function () {
+        return this.getPropertyValue('outline-width');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/overflow.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/overflow.js
new file mode 100644
index 0000000..0d39802
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/overflow.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('overflow', v);
+    },
+    get: function () {
+        return this.getPropertyValue('overflow');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/overflowX.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/overflowX.js
new file mode 100644
index 0000000..6e0ba52
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/overflowX.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('overflow-x', v);
+    },
+    get: function () {
+        return this.getPropertyValue('overflow-x');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/overflowY.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/overflowY.js
new file mode 100644
index 0000000..334ebbe
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/overflowY.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('overflow-y', v);
+    },
+    get: function () {
+        return this.getPropertyValue('overflow-y');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/padding.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/padding.js
new file mode 100644
index 0000000..1e5fb46
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/padding.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('padding', v);
+    },
+    get: function () {
+        return this.getPropertyValue('padding');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/paddingBottom.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/paddingBottom.js
new file mode 100644
index 0000000..fc2118d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/paddingBottom.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('padding-bottom', v);
+    },
+    get: function () {
+        return this.getPropertyValue('padding-bottom');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/paddingLeft.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/paddingLeft.js
new file mode 100644
index 0000000..66c0f5c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/paddingLeft.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('padding-left', v);
+    },
+    get: function () {
+        return this.getPropertyValue('padding-left');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/paddingRight.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/paddingRight.js
new file mode 100644
index 0000000..f431616
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/paddingRight.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('padding-right', v);
+    },
+    get: function () {
+        return this.getPropertyValue('padding-right');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/paddingTop.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/paddingTop.js
new file mode 100644
index 0000000..b64cde4
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/paddingTop.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('padding-top', v);
+    },
+    get: function () {
+        return this.getPropertyValue('padding-top');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/page.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/page.js
new file mode 100644
index 0000000..0fdaa6b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/page.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('page', v);
+    },
+    get: function () {
+        return this.getPropertyValue('page');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pageBreakAfter.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pageBreakAfter.js
new file mode 100644
index 0000000..18d99d0
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pageBreakAfter.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('page-break-after', v);
+    },
+    get: function () {
+        return this.getPropertyValue('page-break-after');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pageBreakBefore.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pageBreakBefore.js
new file mode 100644
index 0000000..2323b6a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pageBreakBefore.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('page-break-before', v);
+    },
+    get: function () {
+        return this.getPropertyValue('page-break-before');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pageBreakInside.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pageBreakInside.js
new file mode 100644
index 0000000..04cb253
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pageBreakInside.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('page-break-inside', v);
+    },
+    get: function () {
+        return this.getPropertyValue('page-break-inside');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pause.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pause.js
new file mode 100644
index 0000000..5bceee2
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pause.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('pause', v);
+    },
+    get: function () {
+        return this.getPropertyValue('pause');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pauseAfter.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pauseAfter.js
new file mode 100644
index 0000000..b603d8f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pauseAfter.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('pause-after', v);
+    },
+    get: function () {
+        return this.getPropertyValue('pause-after');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pauseBefore.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pauseBefore.js
new file mode 100644
index 0000000..02ad3aa
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pauseBefore.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('pause-before', v);
+    },
+    get: function () {
+        return this.getPropertyValue('pause-before');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pitch.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pitch.js
new file mode 100644
index 0000000..c3f0dd2
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pitch.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('pitch', v);
+    },
+    get: function () {
+        return this.getPropertyValue('pitch');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pitchRange.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pitchRange.js
new file mode 100644
index 0000000..fede5cf
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pitchRange.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('pitch-range', v);
+    },
+    get: function () {
+        return this.getPropertyValue('pitch-range');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/playDuring.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/playDuring.js
new file mode 100644
index 0000000..fe60c10
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/playDuring.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('play-during', v);
+    },
+    get: function () {
+        return this.getPropertyValue('play-during');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pointerEvents.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pointerEvents.js
new file mode 100644
index 0000000..4319c4d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/pointerEvents.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('pointer-events', v);
+    },
+    get: function () {
+        return this.getPropertyValue('pointer-events');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/position.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/position.js
new file mode 100644
index 0000000..82af9aa
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/position.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('position', v);
+    },
+    get: function () {
+        return this.getPropertyValue('position');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/quotes.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/quotes.js
new file mode 100644
index 0000000..f905d5a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/quotes.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('quotes', v);
+    },
+    get: function () {
+        return this.getPropertyValue('quotes');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/resize.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/resize.js
new file mode 100644
index 0000000..8d61185
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/resize.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('resize', v);
+    },
+    get: function () {
+        return this.getPropertyValue('resize');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/richness.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/richness.js
new file mode 100644
index 0000000..38a55c2
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/richness.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('richness', v);
+    },
+    get: function () {
+        return this.getPropertyValue('richness');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/right.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/right.js
new file mode 100644
index 0000000..48b7a99
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/right.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('right', v);
+    },
+    get: function () {
+        return this.getPropertyValue('right');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/shapeRendering.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/shapeRendering.js
new file mode 100644
index 0000000..2222058
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/shapeRendering.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('shape-rendering', v);
+    },
+    get: function () {
+        return this.getPropertyValue('shape-rendering');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/size.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/size.js
new file mode 100644
index 0000000..f246788
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/size.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('size', v);
+    },
+    get: function () {
+        return this.getPropertyValue('size');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/speak.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/speak.js
new file mode 100644
index 0000000..6d3e07a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/speak.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('speak', v);
+    },
+    get: function () {
+        return this.getPropertyValue('speak');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/speakHeader.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/speakHeader.js
new file mode 100644
index 0000000..cf3434f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/speakHeader.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('speak-header', v);
+    },
+    get: function () {
+        return this.getPropertyValue('speak-header');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/speakNumeral.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/speakNumeral.js
new file mode 100644
index 0000000..48773ff
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/speakNumeral.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('speak-numeral', v);
+    },
+    get: function () {
+        return this.getPropertyValue('speak-numeral');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/speakPunctuation.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/speakPunctuation.js
new file mode 100644
index 0000000..2062678
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/speakPunctuation.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('speak-punctuation', v);
+    },
+    get: function () {
+        return this.getPropertyValue('speak-punctuation');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/speechRate.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/speechRate.js
new file mode 100644
index 0000000..6e38e1b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/speechRate.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('speech-rate', v);
+    },
+    get: function () {
+        return this.getPropertyValue('speech-rate');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/src.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/src.js
new file mode 100644
index 0000000..e222956
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/src.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('src', v);
+    },
+    get: function () {
+        return this.getPropertyValue('src');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/stopColor.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/stopColor.js
new file mode 100644
index 0000000..6a1e43b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/stopColor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('stop-color', v);
+    },
+    get: function () {
+        return this.getPropertyValue('stop-color');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/stopOpacity.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/stopOpacity.js
new file mode 100644
index 0000000..e5bfc1b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/stopOpacity.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('stop-opacity', v);
+    },
+    get: function () {
+        return this.getPropertyValue('stop-opacity');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/stress.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/stress.js
new file mode 100644
index 0000000..2e7b5d5
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/stress.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('stress', v);
+    },
+    get: function () {
+        return this.getPropertyValue('stress');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/stroke.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/stroke.js
new file mode 100644
index 0000000..dc5ef00
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/stroke.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('stroke', v);
+    },
+    get: function () {
+        return this.getPropertyValue('stroke');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeDasharray.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeDasharray.js
new file mode 100644
index 0000000..169b682
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeDasharray.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('stroke-dasharray', v);
+    },
+    get: function () {
+        return this.getPropertyValue('stroke-dasharray');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeDashoffset.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeDashoffset.js
new file mode 100644
index 0000000..a5c8a96
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeDashoffset.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('stroke-dashoffset', v);
+    },
+    get: function () {
+        return this.getPropertyValue('stroke-dashoffset');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeLinecap.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeLinecap.js
new file mode 100644
index 0000000..225c636
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeLinecap.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('stroke-linecap', v);
+    },
+    get: function () {
+        return this.getPropertyValue('stroke-linecap');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeLinejoin.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeLinejoin.js
new file mode 100644
index 0000000..3921d2e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeLinejoin.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('stroke-linejoin', v);
+    },
+    get: function () {
+        return this.getPropertyValue('stroke-linejoin');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeMiterlimit.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeMiterlimit.js
new file mode 100644
index 0000000..ae2e9f3
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeMiterlimit.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('stroke-miterlimit', v);
+    },
+    get: function () {
+        return this.getPropertyValue('stroke-miterlimit');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeOpacity.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeOpacity.js
new file mode 100644
index 0000000..92699a8
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeOpacity.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('stroke-opacity', v);
+    },
+    get: function () {
+        return this.getPropertyValue('stroke-opacity');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeWidth.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeWidth.js
new file mode 100644
index 0000000..b6b920d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeWidth.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('stroke-width', v);
+    },
+    get: function () {
+        return this.getPropertyValue('stroke-width');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/tableLayout.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/tableLayout.js
new file mode 100644
index 0000000..191cebe
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/tableLayout.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('table-layout', v);
+    },
+    get: function () {
+        return this.getPropertyValue('table-layout');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textAlign.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textAlign.js
new file mode 100644
index 0000000..e55304f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textAlign.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('text-align', v);
+    },
+    get: function () {
+        return this.getPropertyValue('text-align');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textAnchor.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textAnchor.js
new file mode 100644
index 0000000..d1090c4
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textAnchor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('text-anchor', v);
+    },
+    get: function () {
+        return this.getPropertyValue('text-anchor');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textDecoration.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textDecoration.js
new file mode 100644
index 0000000..f537022
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textDecoration.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('text-decoration', v);
+    },
+    get: function () {
+        return this.getPropertyValue('text-decoration');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textIndent.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textIndent.js
new file mode 100644
index 0000000..c96c7fe
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textIndent.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('text-indent', v);
+    },
+    get: function () {
+        return this.getPropertyValue('text-indent');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textLineThrough.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textLineThrough.js
new file mode 100644
index 0000000..28d7a35
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textLineThrough.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('text-line-through', v);
+    },
+    get: function () {
+        return this.getPropertyValue('text-line-through');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textLineThroughColor.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textLineThroughColor.js
new file mode 100644
index 0000000..96f9d11
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textLineThroughColor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('text-line-through-color', v);
+    },
+    get: function () {
+        return this.getPropertyValue('text-line-through-color');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textLineThroughMode.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textLineThroughMode.js
new file mode 100644
index 0000000..0bc6531
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textLineThroughMode.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('text-line-through-mode', v);
+    },
+    get: function () {
+        return this.getPropertyValue('text-line-through-mode');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textLineThroughStyle.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textLineThroughStyle.js
new file mode 100644
index 0000000..c7fd703
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textLineThroughStyle.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('text-line-through-style', v);
+    },
+    get: function () {
+        return this.getPropertyValue('text-line-through-style');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textLineThroughWidth.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textLineThroughWidth.js
new file mode 100644
index 0000000..d526960
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textLineThroughWidth.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('text-line-through-width', v);
+    },
+    get: function () {
+        return this.getPropertyValue('text-line-through-width');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverflow.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverflow.js
new file mode 100644
index 0000000..cdd35df
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverflow.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('text-overflow', v);
+    },
+    get: function () {
+        return this.getPropertyValue('text-overflow');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverline.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverline.js
new file mode 100644
index 0000000..e0d17c8
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverline.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('text-overline', v);
+    },
+    get: function () {
+        return this.getPropertyValue('text-overline');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverlineColor.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverlineColor.js
new file mode 100644
index 0000000..311c94f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverlineColor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('text-overline-color', v);
+    },
+    get: function () {
+        return this.getPropertyValue('text-overline-color');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverlineMode.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverlineMode.js
new file mode 100644
index 0000000..ccb93bc
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverlineMode.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('text-overline-mode', v);
+    },
+    get: function () {
+        return this.getPropertyValue('text-overline-mode');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverlineStyle.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverlineStyle.js
new file mode 100644
index 0000000..c501d85
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverlineStyle.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('text-overline-style', v);
+    },
+    get: function () {
+        return this.getPropertyValue('text-overline-style');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverlineWidth.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverlineWidth.js
new file mode 100644
index 0000000..db05977
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverlineWidth.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('text-overline-width', v);
+    },
+    get: function () {
+        return this.getPropertyValue('text-overline-width');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textRendering.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textRendering.js
new file mode 100644
index 0000000..7b68d93
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textRendering.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('text-rendering', v);
+    },
+    get: function () {
+        return this.getPropertyValue('text-rendering');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textShadow.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textShadow.js
new file mode 100644
index 0000000..707731a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textShadow.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('text-shadow', v);
+    },
+    get: function () {
+        return this.getPropertyValue('text-shadow');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textTransform.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textTransform.js
new file mode 100644
index 0000000..388745d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textTransform.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('text-transform', v);
+    },
+    get: function () {
+        return this.getPropertyValue('text-transform');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textUnderline.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textUnderline.js
new file mode 100644
index 0000000..a414c1f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textUnderline.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('text-underline', v);
+    },
+    get: function () {
+        return this.getPropertyValue('text-underline');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textUnderlineColor.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textUnderlineColor.js
new file mode 100644
index 0000000..7efd1f7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textUnderlineColor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('text-underline-color', v);
+    },
+    get: function () {
+        return this.getPropertyValue('text-underline-color');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textUnderlineMode.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textUnderlineMode.js
new file mode 100644
index 0000000..ff94792
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textUnderlineMode.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('text-underline-mode', v);
+    },
+    get: function () {
+        return this.getPropertyValue('text-underline-mode');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textUnderlineStyle.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textUnderlineStyle.js
new file mode 100644
index 0000000..718c35b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textUnderlineStyle.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('text-underline-style', v);
+    },
+    get: function () {
+        return this.getPropertyValue('text-underline-style');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textUnderlineWidth.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textUnderlineWidth.js
new file mode 100644
index 0000000..f4e108d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/textUnderlineWidth.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('text-underline-width', v);
+    },
+    get: function () {
+        return this.getPropertyValue('text-underline-width');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/top.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/top.js
new file mode 100644
index 0000000..598f4b5
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/top.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('top', v);
+    },
+    get: function () {
+        return this.getPropertyValue('top');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/unicodeBidi.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/unicodeBidi.js
new file mode 100644
index 0000000..197a679
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/unicodeBidi.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('unicode-bidi', v);
+    },
+    get: function () {
+        return this.getPropertyValue('unicode-bidi');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/unicodeRange.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/unicodeRange.js
new file mode 100644
index 0000000..20acaa0
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/unicodeRange.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('unicode-range', v);
+    },
+    get: function () {
+        return this.getPropertyValue('unicode-range');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/vectorEffect.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/vectorEffect.js
new file mode 100644
index 0000000..451ae66
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/vectorEffect.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('vector-effect', v);
+    },
+    get: function () {
+        return this.getPropertyValue('vector-effect');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/verticalAlign.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/verticalAlign.js
new file mode 100644
index 0000000..2c8b770
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/verticalAlign.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('vertical-align', v);
+    },
+    get: function () {
+        return this.getPropertyValue('vertical-align');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/visibility.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/visibility.js
new file mode 100644
index 0000000..0ede3e4
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/visibility.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('visibility', v);
+    },
+    get: function () {
+        return this.getPropertyValue('visibility');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/voiceFamily.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/voiceFamily.js
new file mode 100644
index 0000000..3fd83d6
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/voiceFamily.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('voic-family', v);
+    },
+    get: function () {
+        return this.getPropertyValue('voice-family');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/volume.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/volume.js
new file mode 100644
index 0000000..0e68c91
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/volume.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('volume', v);
+    },
+    get: function () {
+        return this.getPropertyValue('volume');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimation.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimation.js
new file mode 100644
index 0000000..f88d5f0
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimation.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-animation', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-animation');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationDelay.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationDelay.js
new file mode 100644
index 0000000..bcf531f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationDelay.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-animation-delay', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-animation-delay');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationDirection.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationDirection.js
new file mode 100644
index 0000000..f538e4b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationDirection.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-animation-direction', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-animation-direction');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationDuration.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationDuration.js
new file mode 100644
index 0000000..883e0e5
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationDuration.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-animation-duration', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-animation-duration');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationFillMode.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationFillMode.js
new file mode 100644
index 0000000..2e75fc7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationFillMode.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-animation-fill-mode', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-animation-fill-mode');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationIterationCount.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationIterationCount.js
new file mode 100644
index 0000000..1f36353
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationIterationCount.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-animation-iteration-count', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-animation-iteration-count');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationName.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationName.js
new file mode 100644
index 0000000..743cc49
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationName.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-animation-name', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-animation-name');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationPlayState.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationPlayState.js
new file mode 100644
index 0000000..2502b24
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationPlayState.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-animation-play-state', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-animation-play-state');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationTimingFunction.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationTimingFunction.js
new file mode 100644
index 0000000..6f10914
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationTimingFunction.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-animation-timing-function', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-animation-timing-function');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAppearance.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAppearance.js
new file mode 100644
index 0000000..91ddf41
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAppearance.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-appearance', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-appearance');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAspectRatio.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAspectRatio.js
new file mode 100644
index 0000000..a27c49f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAspectRatio.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-aspect-ratio', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-aspect-ratio');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBackfaceVisibility.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBackfaceVisibility.js
new file mode 100644
index 0000000..2cf203c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBackfaceVisibility.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-backface-visibility', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-backface-visibility');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBackgroundClip.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBackgroundClip.js
new file mode 100644
index 0000000..0a17fa6
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBackgroundClip.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-background-clip', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-background-clip');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBackgroundComposite.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBackgroundComposite.js
new file mode 100644
index 0000000..13e79df
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBackgroundComposite.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-background-composite', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-background-composite');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBackgroundOrigin.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBackgroundOrigin.js
new file mode 100644
index 0000000..fd24141
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBackgroundOrigin.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-background-origin', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-background-origin');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBackgroundSize.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBackgroundSize.js
new file mode 100644
index 0000000..06fe7d1
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBackgroundSize.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-background-size', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-background-size');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderAfter.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderAfter.js
new file mode 100644
index 0000000..827a08b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderAfter.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-border-after', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-border-after');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderAfterColor.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderAfterColor.js
new file mode 100644
index 0000000..6ed9cc5
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderAfterColor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-border-after-color', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-border-after-color');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderAfterStyle.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderAfterStyle.js
new file mode 100644
index 0000000..aa57436
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderAfterStyle.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-border-after-style', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-border-after-style');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderAfterWidth.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderAfterWidth.js
new file mode 100644
index 0000000..a15ca9b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderAfterWidth.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-border-after-width', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-border-after-width');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderBefore.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderBefore.js
new file mode 100644
index 0000000..3022930
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderBefore.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-border-before', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-border-before');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderBeforeColor.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderBeforeColor.js
new file mode 100644
index 0000000..847f9be
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderBeforeColor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-border-before-color', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-border-before-color');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderBeforeStyle.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderBeforeStyle.js
new file mode 100644
index 0000000..cb80965
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderBeforeStyle.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-border-before-style', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-border-before-style');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderBeforeWidth.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderBeforeWidth.js
new file mode 100644
index 0000000..5b2d038
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderBeforeWidth.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-border-before-width', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-border-before-width');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderEnd.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderEnd.js
new file mode 100644
index 0000000..c747b04
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderEnd.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-border-end', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-border-end');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderEndColor.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderEndColor.js
new file mode 100644
index 0000000..dcd0bae
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderEndColor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-border-end-color', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-border-end-color');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderEndStyle.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderEndStyle.js
new file mode 100644
index 0000000..72aab80
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderEndStyle.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-border-end-style', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-border-end-style');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderEndWidth.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderEndWidth.js
new file mode 100644
index 0000000..1f0faa1
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderEndWidth.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-border-end-width', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-border-end-width');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderFit.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderFit.js
new file mode 100644
index 0000000..9f70625
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderFit.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-border-fit', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-border-fit');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderHorizontalSpacing.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderHorizontalSpacing.js
new file mode 100644
index 0000000..1ca12ab
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderHorizontalSpacing.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-border-horizontal-spacing', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-border-horizontal-spacing');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderImage.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderImage.js
new file mode 100644
index 0000000..cdd02cc
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderImage.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-border-image', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-border-image');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderRadius.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderRadius.js
new file mode 100644
index 0000000..01e0d76
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderRadius.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-border-radius', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-border-radius');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderStart.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderStart.js
new file mode 100644
index 0000000..f0f62da
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderStart.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-border-start', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-border-start');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderStartColor.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderStartColor.js
new file mode 100644
index 0000000..447af2f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderStartColor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-border-start-color', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-border-start-color');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderStartStyle.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderStartStyle.js
new file mode 100644
index 0000000..01d9688
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderStartStyle.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-border-start-style', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-border-start-style');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderStartWidth.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderStartWidth.js
new file mode 100644
index 0000000..890b9b0
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderStartWidth.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-border-start-width', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-border-start-width');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderVerticalSpacing.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderVerticalSpacing.js
new file mode 100644
index 0000000..a517ed9
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderVerticalSpacing.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-border-vertical-spacing', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-border-vertical-spacing');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxAlign.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxAlign.js
new file mode 100644
index 0000000..200387f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxAlign.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-box-align', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-box-align');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxDirection.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxDirection.js
new file mode 100644
index 0000000..ed2dc48
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxDirection.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-box-direction', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-box-direction');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxFlex.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxFlex.js
new file mode 100644
index 0000000..945f888
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxFlex.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-box-flex', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-box-flex');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxFlexGroup.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxFlexGroup.js
new file mode 100644
index 0000000..dba0b25
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxFlexGroup.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-box-flex-group', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-box-flex-group');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxLines.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxLines.js
new file mode 100644
index 0000000..006574e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxLines.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-box-lines', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-box-lines');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxOrdinalGroup.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxOrdinalGroup.js
new file mode 100644
index 0000000..eaa373c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxOrdinalGroup.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-box-ordinal-group', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-box-ordinal-group');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxOrient.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxOrient.js
new file mode 100644
index 0000000..7e34c3b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxOrient.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-box-orient', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-box-orient');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxPack.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxPack.js
new file mode 100644
index 0000000..b6966af
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxPack.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-box-pack', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-box-pack');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxReflect.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxReflect.js
new file mode 100644
index 0000000..f01c20c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxReflect.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-box-reflect', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-box-reflect');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxShadow.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxShadow.js
new file mode 100644
index 0000000..013180f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxShadow.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-box-shadow', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-box-shadow');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColorCorrection.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColorCorrection.js
new file mode 100644
index 0000000..b03fccc
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColorCorrection.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-color-correction', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-color-correction');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnAxis.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnAxis.js
new file mode 100644
index 0000000..681ab5b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnAxis.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-column-axis', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-column-axis');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnBreakAfter.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnBreakAfter.js
new file mode 100644
index 0000000..9f11205
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnBreakAfter.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-column-break-after', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-column-break-after');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnBreakBefore.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnBreakBefore.js
new file mode 100644
index 0000000..09441b6
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnBreakBefore.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-column-break-before', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-column-break-before');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnBreakInside.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnBreakInside.js
new file mode 100644
index 0000000..ae25b28
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnBreakInside.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-column-break-inside', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-column-break-inside');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnCount.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnCount.js
new file mode 100644
index 0000000..e41d052
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnCount.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-column-count', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-column-count');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnGap.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnGap.js
new file mode 100644
index 0000000..c863817
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnGap.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-column-gap', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-column-gap');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnRule.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnRule.js
new file mode 100644
index 0000000..50fdcc7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnRule.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-column-rule', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-column-rule');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnRuleColor.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnRuleColor.js
new file mode 100644
index 0000000..b54ce73
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnRuleColor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-column-rule-color', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-column-rule-color');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnRuleStyle.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnRuleStyle.js
new file mode 100644
index 0000000..ea7bba7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnRuleStyle.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-column-rule-style', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-column-rule-style');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnRuleWidth.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnRuleWidth.js
new file mode 100644
index 0000000..30a3732
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnRuleWidth.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-column-rule-width', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-column-rule-width');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnSpan.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnSpan.js
new file mode 100644
index 0000000..e203ce8
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnSpan.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-column-span', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-column-span');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnWidth.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnWidth.js
new file mode 100644
index 0000000..813f7b3
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnWidth.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-column-width', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-column-width');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumns.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumns.js
new file mode 100644
index 0000000..2bfc219
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumns.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-columns', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-columns');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFilter.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFilter.js
new file mode 100644
index 0000000..2ec0f6d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFilter.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-filter', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-filter');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexAlign.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexAlign.js
new file mode 100644
index 0000000..a5d6095
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexAlign.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-flex-align', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-flex-align');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexDirection.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexDirection.js
new file mode 100644
index 0000000..3c38731
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexDirection.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-flex-direction', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-flex-direction');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexFlow.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexFlow.js
new file mode 100644
index 0000000..caf24d6
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexFlow.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-flex-flow', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-flex-flow');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexItemAlign.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexItemAlign.js
new file mode 100644
index 0000000..34b70e5
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexItemAlign.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-flex-item-align', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-flex-item-align');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexLinePack.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexLinePack.js
new file mode 100644
index 0000000..fd5fb3d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexLinePack.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-flex-line-pack', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-flex-line-pack');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexOrder.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexOrder.js
new file mode 100644
index 0000000..74989f1
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexOrder.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-flex-order', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-flex-order');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexPack.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexPack.js
new file mode 100644
index 0000000..b678f9c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexPack.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-flex-pack', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-flex-pack');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexWrap.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexWrap.js
new file mode 100644
index 0000000..b4a2f2c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexWrap.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-flex-wrap', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-flex-wrap');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlowFrom.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlowFrom.js
new file mode 100644
index 0000000..4ee5f6e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlowFrom.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-flow-from', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-flow-from');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlowInto.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlowInto.js
new file mode 100644
index 0000000..5e82dd6
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlowInto.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-flow-into', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-flow-into');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFontFeatureSettings.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFontFeatureSettings.js
new file mode 100644
index 0000000..2d0eb3a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFontFeatureSettings.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-font-feature-settings', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-font-feature-settings');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFontKerning.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFontKerning.js
new file mode 100644
index 0000000..15568a1
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFontKerning.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-font-kerning', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-font-kerning');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFontSizeDelta.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFontSizeDelta.js
new file mode 100644
index 0000000..515ca72
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFontSizeDelta.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-font-size-delta', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-font-size-delta');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFontSmoothing.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFontSmoothing.js
new file mode 100644
index 0000000..2a16ae0
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFontSmoothing.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-font-smoothing', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-font-smoothing');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFontVariantLigatures.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFontVariantLigatures.js
new file mode 100644
index 0000000..3496d6e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFontVariantLigatures.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-font-variant-ligatures', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-font-variant-ligatures');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHighlight.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHighlight.js
new file mode 100644
index 0000000..a0efa5b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHighlight.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-highlight', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-highlight');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHyphenateCharacter.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHyphenateCharacter.js
new file mode 100644
index 0000000..bc893d9
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHyphenateCharacter.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-hyphenate-character', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-hyphenate-character');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHyphenateLimitAfter.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHyphenateLimitAfter.js
new file mode 100644
index 0000000..a42bf6b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHyphenateLimitAfter.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-hyphenate-limit-after', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-hyphenate-limit-after');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHyphenateLimitBefore.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHyphenateLimitBefore.js
new file mode 100644
index 0000000..ce82f23
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHyphenateLimitBefore.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-hyphenate-limit-before', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-hyphenate-limit-before');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHyphenateLimitLines.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHyphenateLimitLines.js
new file mode 100644
index 0000000..96ead8b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHyphenateLimitLines.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-hyphenate-limit-lines', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-hyphenate-limit-lines');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHyphens.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHyphens.js
new file mode 100644
index 0000000..e6ea1a8
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHyphens.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-hyphens', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-hyphens');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineAlign.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineAlign.js
new file mode 100644
index 0000000..26dedce
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineAlign.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-line-align', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-line-align');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineBoxContain.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineBoxContain.js
new file mode 100644
index 0000000..dd7bcdf
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineBoxContain.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-line-box-contain', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-line-box-contain');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineBreak.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineBreak.js
new file mode 100644
index 0000000..e872d7a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineBreak.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-line-break', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-line-break');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineClamp.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineClamp.js
new file mode 100644
index 0000000..c0bfd71
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineClamp.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-line-clamp', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-line-clamp');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineGrid.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineGrid.js
new file mode 100644
index 0000000..4c2b18f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineGrid.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-line-grid', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-line-grid');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineSnap.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineSnap.js
new file mode 100644
index 0000000..69c98ce
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineSnap.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-line-snap', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-line-snap');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLocale.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLocale.js
new file mode 100644
index 0000000..cc47ee9
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLocale.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-locale', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-locale');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLogicalHeight.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLogicalHeight.js
new file mode 100644
index 0000000..7eb5105
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLogicalHeight.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-logical-height', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-logical-height');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLogicalWidth.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLogicalWidth.js
new file mode 100644
index 0000000..89dc9dd
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLogicalWidth.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-logical-width', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-logical-width');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginAfter.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginAfter.js
new file mode 100644
index 0000000..1a9b7e7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginAfter.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-margin-after', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-margin-after');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginAfterCollapse.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginAfterCollapse.js
new file mode 100644
index 0000000..2bae70c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginAfterCollapse.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-margin-after-collapse', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-margin-after-collapse');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginBefore.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginBefore.js
new file mode 100644
index 0000000..5248fc2
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginBefore.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-margin-before', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-margin-before');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginBeforeCollapse.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginBeforeCollapse.js
new file mode 100644
index 0000000..017da7b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginBeforeCollapse.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-margin-before-collapse', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-margin-before-collapse');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginBottomCollapse.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginBottomCollapse.js
new file mode 100644
index 0000000..05a0ce2
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginBottomCollapse.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-margin-bottom-collapse', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-margin-bottom-collapse');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginCollapse.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginCollapse.js
new file mode 100644
index 0000000..3ee0ad4
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginCollapse.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-margin-collapse', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-margin-collapse');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginEnd.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginEnd.js
new file mode 100644
index 0000000..639fa51
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginEnd.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-margin-end', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-margin-end');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginStart.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginStart.js
new file mode 100644
index 0000000..7aa23fa
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginStart.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-margin-start', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-margin-start');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginTopCollapse.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginTopCollapse.js
new file mode 100644
index 0000000..1858213
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginTopCollapse.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-margin-top-collapse', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-margin-top-collapse');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarquee.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarquee.js
new file mode 100644
index 0000000..0328f6b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarquee.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-marquee', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-marquee');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarqueeDirection.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarqueeDirection.js
new file mode 100644
index 0000000..a413c6b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarqueeDirection.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-marquee-direction', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-marquee-direction');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarqueeIncrement.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarqueeIncrement.js
new file mode 100644
index 0000000..57b501e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarqueeIncrement.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-marquee-increment', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-marquee-increment');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarqueeRepetition.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarqueeRepetition.js
new file mode 100644
index 0000000..93c89de
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarqueeRepetition.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-marquee-repetition', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-marquee-repetition');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarqueeSpeed.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarqueeSpeed.js
new file mode 100644
index 0000000..63aec22
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarqueeSpeed.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-marquee-speed', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-marquee-speed');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarqueeStyle.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarqueeStyle.js
new file mode 100644
index 0000000..7e2a258
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarqueeStyle.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-marquee-style', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-marquee-style');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMask.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMask.js
new file mode 100644
index 0000000..26266f8
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMask.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-mask', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-mask');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskAttachment.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskAttachment.js
new file mode 100644
index 0000000..29b5491
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskAttachment.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-mask-attachment', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-mask-attachment');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImage.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImage.js
new file mode 100644
index 0000000..fc24bc7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImage.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-mask-box-image', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-mask-box-image');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImageOutset.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImageOutset.js
new file mode 100644
index 0000000..dc95bd2
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImageOutset.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-mask-box-image-outset', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-mask-box-image-outset');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImageRepeat.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImageRepeat.js
new file mode 100644
index 0000000..b557b79
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImageRepeat.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-mask-box-image-repeat', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-mask-box-image-repeat');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImageSlice.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImageSlice.js
new file mode 100644
index 0000000..2408a40
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImageSlice.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-mask-box-image-slice', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-mask-box-image-slice');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImageSource.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImageSource.js
new file mode 100644
index 0000000..70a4540
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImageSource.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-mask-box-image-source', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-mask-box-image-source');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImageWidth.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImageWidth.js
new file mode 100644
index 0000000..a041d7e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImageWidth.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-mask-box-image-width', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-mask-box-image-width');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskClip.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskClip.js
new file mode 100644
index 0000000..0eeeb8b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskClip.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-mask-clip', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-mask-clip');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskComposite.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskComposite.js
new file mode 100644
index 0000000..af8e54c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskComposite.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-mask-composite', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-mask-composite');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskImage.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskImage.js
new file mode 100644
index 0000000..e5206ba
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskImage.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-mask-image', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-mask-image');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskOrigin.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskOrigin.js
new file mode 100644
index 0000000..9a4fbb8
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskOrigin.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-mask-origin', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-mask-origin');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskPosition.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskPosition.js
new file mode 100644
index 0000000..6ce2653
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskPosition.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-mask-position', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-mask-position');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskPositionX.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskPositionX.js
new file mode 100644
index 0000000..e33d737
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskPositionX.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-mask-position-x', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-mask-position-x');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskPositionY.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskPositionY.js
new file mode 100644
index 0000000..3b0e335
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskPositionY.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-mask-position-y', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-mask-position-y');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskRepeat.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskRepeat.js
new file mode 100644
index 0000000..26517dd
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskRepeat.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-mask-repeat', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-mask-repeat');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskRepeatX.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskRepeatX.js
new file mode 100644
index 0000000..59b0968
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskRepeatX.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-mask-repeat-x', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-mask-repeat-x');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskRepeatY.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskRepeatY.js
new file mode 100644
index 0000000..dc5d06c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskRepeatY.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-mask-repeat-y', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-mask-repeat-y');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskSize.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskSize.js
new file mode 100644
index 0000000..b204900
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskSize.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-mask-size', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-mask-size');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMatchNearestMailBlockquoteColor.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMatchNearestMailBlockquoteColor.js
new file mode 100644
index 0000000..31e3ffa
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMatchNearestMailBlockquoteColor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-match-nearest-mail-blockquote-color', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-match-nearest-mail-blockquote-color');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaxLogicalHeight.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaxLogicalHeight.js
new file mode 100644
index 0000000..1474162
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaxLogicalHeight.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-max-logical-height', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-max-logical-height');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaxLogicalWidth.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaxLogicalWidth.js
new file mode 100644
index 0000000..4223cf1
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaxLogicalWidth.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-max-logical-width', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-max-logical-width');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMinLogicalHeight.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMinLogicalHeight.js
new file mode 100644
index 0000000..36afbef
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMinLogicalHeight.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-min-logical-height', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-min-logical-height');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMinLogicalWidth.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMinLogicalWidth.js
new file mode 100644
index 0000000..b5b6c9a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMinLogicalWidth.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-min-logical-width', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-min-logical-width');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitNbspMode.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitNbspMode.js
new file mode 100644
index 0000000..8f814f5
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitNbspMode.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-nbsp-mode', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-nbsp-mode');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitOverflowScrolling.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitOverflowScrolling.js
new file mode 100644
index 0000000..9aab87f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitOverflowScrolling.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-overflow-scrolling', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-overflow-scrolling');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPaddingAfter.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPaddingAfter.js
new file mode 100644
index 0000000..dc268f7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPaddingAfter.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-padding-after', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-padding-after');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPaddingBefore.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPaddingBefore.js
new file mode 100644
index 0000000..4c686bb
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPaddingBefore.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-padding-before', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-padding-before');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPaddingEnd.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPaddingEnd.js
new file mode 100644
index 0000000..b4a4640
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPaddingEnd.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-padding-end', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-padding-end');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPaddingStart.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPaddingStart.js
new file mode 100644
index 0000000..77acaf3
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPaddingStart.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-padding-start', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-padding-start');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPerspective.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPerspective.js
new file mode 100644
index 0000000..ab4c28c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPerspective.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-perspective', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-perspective');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPerspectiveOrigin.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPerspectiveOrigin.js
new file mode 100644
index 0000000..e72e614
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPerspectiveOrigin.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-perspective-origin', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-perspective-origin');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPerspectiveOriginX.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPerspectiveOriginX.js
new file mode 100644
index 0000000..c4e30e2
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPerspectiveOriginX.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-perspective-origin-x', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-perspective-origin-x');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPerspectiveOriginY.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPerspectiveOriginY.js
new file mode 100644
index 0000000..0aefab5
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPerspectiveOriginY.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-perspective-origin-y', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-perspective-origin-y');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPrintColorAdjust.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPrintColorAdjust.js
new file mode 100644
index 0000000..6442f32
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPrintColorAdjust.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-print-color-adjust', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-print-color-adjust');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitRegionBreakAfter.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitRegionBreakAfter.js
new file mode 100644
index 0000000..6ac309a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitRegionBreakAfter.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-region-break-after', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-region-break-after');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitRegionBreakBefore.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitRegionBreakBefore.js
new file mode 100644
index 0000000..10de4cb
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitRegionBreakBefore.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-region-break-before', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-region-break-before');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitRegionBreakInside.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitRegionBreakInside.js
new file mode 100644
index 0000000..1dc694b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitRegionBreakInside.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-region-break-inside', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-region-break-inside');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitRegionOverflow.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitRegionOverflow.js
new file mode 100644
index 0000000..00384d1
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitRegionOverflow.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-region-overflow', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-region-overflow');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitRtlOrdering.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitRtlOrdering.js
new file mode 100644
index 0000000..7b54ffb
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitRtlOrdering.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-rtl-ordering', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-rtl-ordering');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitSvgShadow.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitSvgShadow.js
new file mode 100644
index 0000000..9c5cb24
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitSvgShadow.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-svg-shadow', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-svg-shadow');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTapHighlightColor.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTapHighlightColor.js
new file mode 100644
index 0000000..deaf87b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTapHighlightColor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-tap-highlight-color', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-tap-highlight-color');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextCombine.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextCombine.js
new file mode 100644
index 0000000..17bbe25
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextCombine.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-text-combine', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-text-combine');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextDecorationsInEffect.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextDecorationsInEffect.js
new file mode 100644
index 0000000..89d09d7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextDecorationsInEffect.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-text-decorations-in-effect', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-text-decorations-in-effect');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextEmphasis.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextEmphasis.js
new file mode 100644
index 0000000..efd0f19
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextEmphasis.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-text-emphasis', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-text-emphasis');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextEmphasisColor.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextEmphasisColor.js
new file mode 100644
index 0000000..4be1184
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextEmphasisColor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-text-emphasis-color', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-text-emphasis-color');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextEmphasisPosition.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextEmphasisPosition.js
new file mode 100644
index 0000000..be6d5df
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextEmphasisPosition.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-text-emphasis-position', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-text-emphasis-position');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextEmphasisStyle.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextEmphasisStyle.js
new file mode 100644
index 0000000..45ca0fc
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextEmphasisStyle.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-text-emphasis-style', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-text-emphasis-style');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextFillColor.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextFillColor.js
new file mode 100644
index 0000000..4d39fa7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextFillColor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-text-fill-color', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-text-fill-color');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextOrientation.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextOrientation.js
new file mode 100644
index 0000000..33d2233
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextOrientation.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-text-orientation', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-text-orientation');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextSecurity.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextSecurity.js
new file mode 100644
index 0000000..7fae7d0
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextSecurity.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-text-security', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-text-security');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextSizeAdjust.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextSizeAdjust.js
new file mode 100644
index 0000000..9bed069
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextSizeAdjust.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-text-size-adjust', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-text-size-adjust');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextStroke.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextStroke.js
new file mode 100644
index 0000000..fee742e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextStroke.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-text-stroke', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-text-stroke');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextStrokeColor.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextStrokeColor.js
new file mode 100644
index 0000000..edd9828
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextStrokeColor.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-text-stroke-color', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-text-stroke-color');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextStrokeWidth.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextStrokeWidth.js
new file mode 100644
index 0000000..f63983d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextStrokeWidth.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-text-stroke-width', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-text-stroke-width');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransform.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransform.js
new file mode 100644
index 0000000..a8c3f1f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransform.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-transform', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-transform');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransformOrigin.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransformOrigin.js
new file mode 100644
index 0000000..1d2287f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransformOrigin.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-transform-origin', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-transform-origin');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransformOriginX.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransformOriginX.js
new file mode 100644
index 0000000..2ec860d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransformOriginX.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-transform-origin-x', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-transform-origin-x');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransformOriginY.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransformOriginY.js
new file mode 100644
index 0000000..e1f5f90
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransformOriginY.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-transform-origin-y', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-transform-origin-y');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransformOriginZ.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransformOriginZ.js
new file mode 100644
index 0000000..2d465bb
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransformOriginZ.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-transform-origin-z', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-transform-origin-z');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransformStyle.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransformStyle.js
new file mode 100644
index 0000000..3d41bac
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransformStyle.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-transform-style', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-transform-style');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransition.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransition.js
new file mode 100644
index 0000000..f7bd0a0
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransition.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-transition', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-transition');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransitionDelay.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransitionDelay.js
new file mode 100644
index 0000000..24913a0
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransitionDelay.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-transition-delay', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-transition-delay');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransitionDuration.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransitionDuration.js
new file mode 100644
index 0000000..042200b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransitionDuration.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-transition-duration', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-transition-duration');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransitionProperty.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransitionProperty.js
new file mode 100644
index 0000000..0bfa846
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransitionProperty.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-transition-property', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-transition-property');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransitionTimingFunction.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransitionTimingFunction.js
new file mode 100644
index 0000000..d194872
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransitionTimingFunction.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-transition-timing-function', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-transition-timing-function');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitUserDrag.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitUserDrag.js
new file mode 100644
index 0000000..ff84ba5
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitUserDrag.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-user-drag', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-user-drag');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitUserModify.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitUserModify.js
new file mode 100644
index 0000000..efc8367
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitUserModify.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-user-modify', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-user-modify');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitUserSelect.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitUserSelect.js
new file mode 100644
index 0000000..8f63eea
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitUserSelect.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-user-select', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-user-select');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrap.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrap.js
new file mode 100644
index 0000000..cda0d6c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrap.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-wrap', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-wrap');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapFlow.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapFlow.js
new file mode 100644
index 0000000..0724290
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapFlow.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-wrap-flow', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-wrap-flow');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapMargin.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapMargin.js
new file mode 100644
index 0000000..ed74ee2
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapMargin.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-wrap-margin', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-wrap-margin');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapPadding.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapPadding.js
new file mode 100644
index 0000000..d9cd6df
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapPadding.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-wrap-padding', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-wrap-padding');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapShapeInside.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapShapeInside.js
new file mode 100644
index 0000000..1b57fd3
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapShapeInside.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-wrap-shape-inside', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-wrap-shape-inside');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapShapeOutside.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapShapeOutside.js
new file mode 100644
index 0000000..a981d26
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapShapeOutside.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-wrap-shape-outside', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-wrap-shape-outside');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapThrough.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapThrough.js
new file mode 100644
index 0000000..912ed5c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapThrough.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-wrap-through', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-wrap-through');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWritingMode.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWritingMode.js
new file mode 100644
index 0000000..9f7cc2f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWritingMode.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('-webkit-writing-mode', v);
+    },
+    get: function () {
+        return this.getPropertyValue('-webkit-writing-mode');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/whiteSpace.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/whiteSpace.js
new file mode 100644
index 0000000..e3abb82
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/whiteSpace.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('white-space', v);
+    },
+    get: function () {
+        return this.getPropertyValue('white-space');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/widows.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/widows.js
new file mode 100644
index 0000000..eed4689
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/widows.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('widows', v);
+    },
+    get: function () {
+        return this.getPropertyValue('widows');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/width.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/width.js
new file mode 100644
index 0000000..9016edc
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/width.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('width', v);
+    },
+    get: function () {
+        return this.getPropertyValue('width');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/wordBreak.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/wordBreak.js
new file mode 100644
index 0000000..0789b6d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/wordBreak.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('word-break', v);
+    },
+    get: function () {
+        return this.getPropertyValue('word-break');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/wordSpacing.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/wordSpacing.js
new file mode 100644
index 0000000..a5f9837
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/wordSpacing.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('word-spacing', v);
+    },
+    get: function () {
+        return this.getPropertyValue('word-spacing');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/wordWrap.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/wordWrap.js
new file mode 100644
index 0000000..20ae48b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/wordWrap.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('word-wrap', v);
+    },
+    get: function () {
+        return this.getPropertyValue('word-wrap');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/writingMode.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/writingMode.js
new file mode 100644
index 0000000..a561e9f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/writingMode.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('writing-mode', v);
+    },
+    get: function () {
+        return this.getPropertyValue('writing-mode');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/zIndex.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/zIndex.js
new file mode 100644
index 0000000..a1db82d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/zIndex.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('z-index', v);
+    },
+    get: function () {
+        return this.getPropertyValue('z-index');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/zoom.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/zoom.js
new file mode 100644
index 0000000..49ebdac
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/properties/zoom.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = {
+    set: function (v) {
+        this.setProperty('zoom', v);
+    },
+    get: function () {
+        return this.getPropertyValue('zoom');
+    },
+    enumerable: true
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/props b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/props
new file mode 100644
index 0000000..f4015b1
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/lib/props
@@ -0,0 +1,788 @@
+    get alignmentBaseline() { return this.getPropertyValue('alignment-baseline'); },
+    set alignmentBaseline(v) { this.setProperty('alignment-baseline', v); },
+    get azimuth() { return this.getPropertyValue('azimuth'); },
+    set azimuth(v) { this.setProperty('azimuth', v); },
+    get background() { return this.getPropertyValue('background'); },
+    set background(v) { this.setProperty('background', v); },
+    get backgroundAttachment() { return this.getPropertyValue('background-attachment'); },
+    set backgroundAttachment(v) { this.setProperty('background-attachment', v); },
+    get backgroundClip() { return this.getPropertyValue('background-clip'); },
+    set backgroundClip(v) { this.setProperty('background-clip', v); },
+    get backgroundColor() { return this.getPropertyValue('background-color'); },
+    set backgroundColor(v) { this.setProperty('background-color', v); },
+    get backgroundImage() { return this.getPropertyValue('background-image'); },
+    set backgroundImage(v) { this.setProperty('background-image', v); },
+    get backgroundOrigin() { return this.getPropertyValue('background-origin'); },
+    set backgroundOrigin(v) { this.setProperty('background-origin', v); },
+    get backgroundPosition() { return this.getPropertyValue('background-position'); },
+    set backgroundPosition(v) { this.setProperty('background-position', v); },
+    get backgroundPositionX() { return this.getPropertyValue('background-position-x'); },
+    set backgroundPositionX(v) { this.setProperty('background-position-x', v); },
+    get backgroundPositionY() { return this.getPropertyValue('background-position-y'); },
+    set backgroundPositionY(v) { this.setProperty('background-position-y', v); },
+    get backgroundRepeat() { return this.getPropertyValue('background-repeat'); },
+    set backgroundRepeat(v) { this.setProperty('background-repeat', v); },
+    get backgroundRepeatX() { return this.getPropertyValue('background-repeat-x'); },
+    set backgroundRepeatX(v) { this.setProperty('background-repeat-x', v); },
+    get backgroundRepeatY() { return this.getPropertyValue('background-repeat-y'); },
+    set backgroundRepeatY(v) { this.setProperty('background-repeat-y', v); },
+    get backgroundSize() { return this.getPropertyValue('background-size'); },
+    set backgroundSize(v) { this.setProperty('background-size', v); },
+    get baselineShift() { return this.getPropertyValue('baseline-shift'); },
+    set baselineShift(v) { this.setProperty('baseline-shift', v); },
+    get border() { return this.getPropertyValue('border'); },
+    set border(v) { this.setProperty('border', v); },
+    get borderBottom() { return this.getPropertyValue('border-bottom'); },
+    set borderBottom(v) { this.setProperty('border-bottom', v); },
+    get borderBottomColor() { return this.getPropertyValue('border-bottom-color'); },
+    set borderBottomColor(v) { this.setProperty('border-bottom-color', v); },
+    get borderBottomLeftRadius() { return this.getPropertyValue('border-bottom-left-radius'); },
+    set borderBottomLeftRadius(v) { this.setProperty('border-bottom-left-radius', v); },
+    get borderBottomRightRadius() { return this.getPropertyValue('border-bottom-right-radius'); },
+    set borderBottomRightRadius(v) { this.setProperty('border-bottom-right-radius', v); },
+    get borderBottomStyle() { return this.getPropertyValue('border-bottom-style'); },
+    set borderBottomStyle(v) { this.setProperty('border-bottom-style', v); },
+    get borderBottomWidth() { return this.getPropertyValue('border-bottom-width'); },
+    set borderBottomWidth(v) { this.setProperty('border-bottom-width', v); },
+    get borderCollapse() { return this.getPropertyValue('border-collapse'); },
+    set borderCollapse(v) { this.setProperty('border-collapse', v); },
+    get borderColor() { return this.getPropertyValue('border-color'); },
+    set borderColor(v) { this.setProperty('border-color', v); },
+    get borderImage() { return this.getPropertyValue('border-image'); },
+    set borderImage(v) { this.setProperty('border-image', v); },
+    get borderImageOutset() { return this.getPropertyValue('border-image-outset'); },
+    set borderImageOutset(v) { this.setProperty('border-image-outset', v); },
+    get borderImageRepeat() { return this.getPropertyValue('border-image-repeat'); },
+    set borderImageRepeat(v) { this.setProperty('border-image-repeat', v); },
+    get borderImageSlice() { return this.getPropertyValue('border-image-slice'); },
+    set borderImageSlice(v) { this.setProperty('border-image-slice', v); },
+    get borderImageSource() { return this.getPropertyValue('border-image-source'); },
+    set borderImageSource(v) { this.setProperty('border-image-source', v); },
+    get borderImageWidth() { return this.getPropertyValue('border-image-width'); },
+    set borderImageWidth(v) { this.setProperty('border-image-width', v); },
+    get borderLeft() { return this.getPropertyValue('border-left'); },
+    set borderLeft(v) { this.setProperty('border-left', v); },
+    get borderLeftColor() { return this.getPropertyValue('border-left-color'); },
+    set borderLeftColor(v) { this.setProperty('border-left-color', v); },
+    get borderLeftStyle() { return this.getPropertyValue('border-left-style'); },
+    set borderLeftStyle(v) { this.setProperty('border-left-style', v); },
+    get borderLeftWidth() { return this.getPropertyValue('border-left-width'); },
+    set borderLeftWidth(v) { this.setProperty('border-left-width', v); },
+    get borderRadius() { return this.getPropertyValue('border-radius'); },
+    set borderRadius(v) { this.setProperty('border-radius', v); },
+    get borderRight() { return this.getPropertyValue('border-right'); },
+    set borderRight(v) { this.setProperty('border-right', v); },
+    get borderRightColor() { return this.getPropertyValue('border-right-color'); },
+    set borderRightColor(v) { this.setProperty('border-right-color', v); },
+    get borderRightStyle() { return this.getPropertyValue('border-right-style'); },
+    set borderRightStyle(v) { this.setProperty('border-right-style', v); },
+    get borderRightWidth() { return this.getPropertyValue('border-right-width'); },
+    set borderRightWidth(v) { this.setProperty('border-right-width', v); },
+    get borderSpacing() { return this.getPropertyValue('border-spacing'); },
+    set borderSpacing(v) { this.setProperty('border-spacing', v); },
+    get borderStyle() { return this.getPropertyValue('border-style'); },
+    set borderStyle(v) { this.setProperty('border-style', v); },
+    get borderTop() { return this.getPropertyValue('border-top'); },
+    set borderTop(v) { this.setProperty('border-top', v); },
+    get borderTopColor() { return this.getPropertyValue('border-top-color'); },
+    set borderTopColor(v) { this.setProperty('border-top-color', v); },
+    get borderTopLeftRadius() { return this.getPropertyValue('border-top-left-radius'); },
+    set borderTopLeftRadius(v) { this.setProperty('border-top-left-radius', v); },
+    get borderTopRightRadius() { return this.getPropertyValue('border-top-right-radius'); },
+    set borderTopRightRadius(v) { this.setProperty('border-top-right-radius', v); },
+    get borderTopStyle() { return this.getPropertyValue('border-top-style'); },
+    set borderTopStyle(v) { this.setProperty('border-top-style', v); },
+    get borderTopWidth() { return this.getPropertyValue('border-top-width'); },
+    set borderTopWidth(v) { this.setProperty('border-top-width', v); },
+    get borderWidth() { return this.getPropertyValue('border-width'); },
+    set borderWidth(v) { this.setProperty('border-width', v); },
+    get bottom() { return this.getPropertyValue('bottom'); },
+    set bottom(v) { this.setProperty('bottom', v); },
+    get boxShadow() { return this.getPropertyValue('box-shadow'); },
+    set boxShadow(v) { this.setProperty('box-shadow', v); },
+    get boxSizing() { return this.getPropertyValue('box-sizing'); },
+    set boxSizing(v) { this.setProperty('box-sizing', v); },
+    get captionSide() { return this.getPropertyValue('caption-side'); },
+    set captionSide(v) { this.setProperty('caption-side', v); },
+    get clear() { return this.getPropertyValue('clear'); },
+    set clear(v) { this.setProperty('clear', v); },
+    get clip() { return this.getPropertyValue('clip'); },
+    set clip(v) { this.setProperty('clip', v); },
+    get clipPath() { return this.getPropertyValue('clip-path'); },
+    set clipPath(v) { this.setProperty('clip-path', v); },
+    get clipRule() { return this.getPropertyValue('clip-rule'); },
+    set clipRule(v) { this.setProperty('clip-rule', v); },
+    get color() { return this.getPropertyValue('color'); },
+    set color(v) { this.setProperty('color', v); },
+    get colorInterpolation() { return this.getPropertyValue('color-interpolation'); },
+    set colorInterpolation(v) { this.setProperty('color-interpolation', v); },
+    get colorInterpolationFilters() { return this.getPropertyValue('color-interpolation-filters'); },
+    set colorInterpolationFilters(v) { this.setProperty('color-interpolation-filters', v); },
+    get colorProfile() { return this.getPropertyValue('color-profile'); },
+    set colorProfile(v) { this.setProperty('color-profile', v); },
+    get colorRendering() { return this.getPropertyValue('color-rendering'); },
+    set colorRendering(v) { this.setProperty('color-rendering', v); },
+    get content() { return this.getPropertyValue('content'); },
+    set content(v) { this.setProperty('content', v); },
+    get counterIncrement() { return this.getPropertyValue('counter-increment'); },
+    set counterIncrement(v) { this.setProperty('counter-increment', v); },
+    get counterReset() { return this.getPropertyValue('counter-reset'); },
+    set counterReset(v) { this.setProperty('counter-reset', v); },
+    get cssFloat() { return this.getPropertyValue('float'); },
+    set cssFloat(v) { this.setProperty('float', v); },
+    get cue() { return this.getPropertyValue('cue'); },
+    set cue(v) { this.setProperty('cue', v); },
+    get cueAfter() { return this.getPropertyValue('cue-after'); },
+    set cueAfter(v) { this.setProperty('cue-after', v); },
+    get cueBefore() { return this.getPropertyValue('cue-before'); },
+    set cueBefore(v) { this.setProperty('cue-before', v); },
+    get cursor() { return this.getPropertyValue('cursor'); },
+    set cursor(v) { this.setProperty('cursor', v); },
+    get direction() { return this.getPropertyValue('direction'); },
+    set direction(v) { this.setProperty('direction', v); },
+    get display() { return this.getPropertyValue('display'); },
+    set display(v) { this.setProperty('display', v); },
+    get dominantBaseline() { return this.getPropertyValue('dominant-baseline'); },
+    set dominantBaseline(v) { this.setProperty('dominant-baseline', v); },
+    get elevation() { return this.getPropertyValue('elevation'); },
+    set elevation(v) { this.setProperty('elevation', v); },
+    get emptyCells() { return this.getPropertyValue('empty-cells'); },
+    set emptyCells(v) { this.setProperty('empty-cells', v); },
+    get enableBackground() { return this.getPropertyValue('enable-background'); },
+    set enableBackground(v) { this.setProperty('enable-background', v); },
+    get fill() { return this.getPropertyValue('fill'); },
+    set fill(v) { this.setProperty('fill', v); },
+    get fillOpacity() { return this.getPropertyValue('fill-opacity'); },
+    set fillOpacity(v) { this.setProperty('fill-opacity', v); },
+    get fillRule() { return this.getPropertyValue('fill-rule'); },
+    set fillRule(v) { this.setProperty('fill-rule', v); },
+    get filter() { return this.getPropertyValue('filter'); },
+    set filter(v) { this.setProperty('filter', v); },
+    get floodColor() { return this.getPropertyValue('flood-color'); },
+    set floodColor(v) { this.setProperty('flood-color', v); },
+    get floodOpacity() { return this.getPropertyValue('flood-opacity'); },
+    set floodOpacity(v) { this.setProperty('flood-opacity', v); },
+    get font() { return this.getPropertyValue('font'); },
+    set font(v) { this.setProperty('font', v); },
+    get fontFamily() { return this.getPropertyValue('font-family'); },
+    set fontFamily(v) { this.setProperty('font-family', v); },
+    get fontSize() { return this.getPropertyValue('font-size'); },
+    set fontSize(v) { this.setProperty('font-size', v); },
+    get fontSizeAdjust() { return this.getPropertyValue('font-size-adjust'); },
+    set fontSizeAdjust(v) { this.setProperty('font-size-adjust', v); },
+    get fontStretch() { return this.getPropertyValue('font-stretch'); },
+    set fontStretch(v) { this.setProperty('font-stretch', v); },
+    get fontStyle() { return this.getPropertyValue('font-style'); },
+    set fontStyle(v) { this.setProperty('font-style', v); },
+    get fontVariant() { return this.getPropertyValue('font-variant'); },
+    set fontVariant(v) { this.setProperty('font-variant', v); },
+    get fontWeight() { return this.getPropertyValue('font-weight'); },
+    set fontWeight(v) { this.setProperty('font-weight', v); },
+    get glyphOrientationHorizontal() { return this.getPropertyValue('glyph-orientation-horizontal'); },
+    set glyphOrientationHorizontal(v) { this.setProperty('glyph-orientation-horizontal', v); },
+    get glyphOrientationVertical() { return this.getPropertyValue('glyph-orientation-vertical'); },
+    set glyphOrientationVertical(v) { this.setProperty('glyph-orientation-vertical', v); },
+    get height() { return this.getPropertyValue('height'); },
+    set height(v) { this.setProperty('height', v); },
+    get imageRendering() { return this.getPropertyValue('image-rendering'); },
+    set imageRendering(v) { this.setProperty('image-rendering', v); },
+    get kerning() { return this.getPropertyValue('kerning'); },
+    set kerning(v) { this.setProperty('kerning', v); },
+    get left() { return this.getPropertyValue('left'); },
+    set left(v) { this.setProperty('left', v); },
+    get letterSpacing() { return this.getPropertyValue('letter-spacing'); },
+    set letterSpacing(v) { this.setProperty('letter-spacing', v); },
+    get lightingColor() { return this.getPropertyValue('lighting-color'); },
+    set lightingColor(v) { this.setProperty('lighting-color', v); },
+    get lineHeight() { return this.getPropertyValue('line-height'); },
+    set lineHeight(v) { this.setProperty('line-height', v); },
+    get listStyle() { return this.getPropertyValue('list-style'); },
+    set listStyle(v) { this.setProperty('list-style', v); },
+    get listStyleImage() { return this.getPropertyValue('list-style-image'); },
+    set listStyleImage(v) { this.setProperty('list-style-image', v); },
+    get listStylePosition() { return this.getPropertyValue('list-style-position'); },
+    set listStylePosition(v) { this.setProperty('list-style-position', v); },
+    get listStyleType() { return this.getPropertyValue('list-style-type'); },
+    set listStyleType(v) { this.setProperty('list-style-type', v); },
+    get margin() { return this.getPropertyValue('margin'); },
+    set margin(v) { this.setProperty('margin', v); },
+    get marginBottom() { return this.getPropertyValue('margin-bottom'); },
+    set marginBottom(v) { this.setProperty('margin-bottom', v); },
+    get marginLeft() { return this.getPropertyValue('margin-left'); },
+    set marginLeft(v) { this.setProperty('margin-left', v); },
+    get marginRight() { return this.getPropertyValue('margin-right'); },
+    set marginRight(v) { this.setProperty('margin-right', v); },
+    get marginTop() { return this.getPropertyValue('margin-top'); },
+    set marginTop(v) { this.setProperty('margin-top', v); },
+    get marker() { return this.getPropertyValue('marker'); },
+    set marker(v) { this.setProperty('marker', v); },
+    get markerEnd() { return this.getPropertyValue('marker-end'); },
+    set markerEnd(v) { this.setProperty('marker-end', v); },
+    get markerMid() { return this.getPropertyValue('marker-mid'); },
+    set markerMid(v) { this.setProperty('marker-mid', v); },
+    get markerOffset() { return this.getPropertyValue('marker-offset'); },
+    set markerOffset(v) { this.setProperty('marker-offset', v); },
+    get markerStart() { return this.getPropertyValue('marker-start'); },
+    set markerStart(v) { this.setProperty('marker-start', v); },
+    get marks() { return this.getPropertyValue('marks'); },
+    set marks(v) { this.setProperty('marks', v); },
+    get mask() { return this.getPropertyValue('mask'); },
+    set mask(v) { this.setProperty('mask', v); },
+    get maxHeight() { return this.getPropertyValue('max-height'); },
+    set maxHeight(v) { this.setProperty('max-height', v); },
+    get maxWidth() { return this.getPropertyValue('max-width'); },
+    set maxWidth(v) { this.setProperty('max-width', v); },
+    get minHeight() { return this.getPropertyValue('min-height'); },
+    set minHeight(v) { this.setProperty('min-height', v); },
+    get minWidth() { return this.getPropertyValue('min-width'); },
+    set minWidth(v) { this.setProperty('min-width', v); },
+    get opacity() { return this.getPropertyValue('opacity'); },
+    set opacity(v) { this.setProperty('opacity', v); },
+    get orphans() { return this.getPropertyValue('orphans'); },
+    set orphans(v) { this.setProperty('orphans', v); },
+    get outline() { return this.getPropertyValue('outline'); },
+    set outline(v) { this.setProperty('outline', v); },
+    get outlineColor() { return this.getPropertyValue('outline-color'); },
+    set outlineColor(v) { this.setProperty('outline-color', v); },
+    get outlineOffset() { return this.getPropertyValue('outline-offset'); },
+    set outlineOffset(v) { this.setProperty('outline-offset', v); },
+    get outlineStyle() { return this.getPropertyValue('outline-style'); },
+    set outlineStyle(v) { this.setProperty('outline-style', v); },
+    get outlineWidth() { return this.getPropertyValue('outline-width'); },
+    set outlineWidth(v) { this.setProperty('outline-width', v); },
+    get overflow() { return this.getPropertyValue('overflow'); },
+    set overflow(v) { this.setProperty('overflow', v); },
+    get overflowX() { return this.getPropertyValue('overflow-x'); },
+    set overflowX(v) { this.setProperty('overflow-x', v); },
+    get overflowY() { return this.getPropertyValue('overflow-y'); },
+    set overflowY(v) { this.setProperty('overflow-y', v); },
+    get padding() { return this.getPropertyValue('padding'); },
+    set padding(v) { this.setProperty('padding', v); },
+    get paddingBottom() { return this.getPropertyValue('padding-bottom'); },
+    set paddingBottom(v) { this.setProperty('padding-bottom', v); },
+    get paddingLeft() { return this.getPropertyValue('padding-left'); },
+    set paddingLeft(v) { this.setProperty('padding-left', v); },
+    get paddingRight() { return this.getPropertyValue('padding-right'); },
+    set paddingRight(v) { this.setProperty('padding-right', v); },
+    get paddingTop() { return this.getPropertyValue('padding-top'); },
+    set paddingTop(v) { this.setProperty('padding-top', v); },
+    get page() { return this.getPropertyValue('page'); },
+    set page(v) { this.setProperty('page', v); },
+    get pageBreakAfter() { return this.getPropertyValue('page-break-after'); },
+    set pageBreakAfter(v) { this.setProperty('page-break-after', v); },
+    get pageBreakBefore() { return this.getPropertyValue('page-break-before'); },
+    set pageBreakBefore(v) { this.setProperty('page-break-before', v); },
+    get pageBreakInside() { return this.getPropertyValue('page-break-inside'); },
+    set pageBreakInside(v) { this.setProperty('page-break-inside', v); },
+    get pause() { return this.getPropertyValue('pause'); },
+    set pause(v) { this.setProperty('pause', v); },
+    get pauseAfter() { return this.getPropertyValue('pause-after'); },
+    set pauseAfter(v) { this.setProperty('pause-after', v); },
+    get pauseBefore() { return this.getPropertyValue('pause-before'); },
+    set pauseBefore(v) { this.setProperty('pause-before', v); },
+    get pitch() { return this.getPropertyValue('pitch'); },
+    set pitch(v) { this.setProperty('pitch', v); },
+    get pitchRange() { return this.getPropertyValue('pitch-range'); },
+    set pitchRange(v) { this.setProperty('pitch-range', v); },
+    get playDuring() { return this.getPropertyValue('play-during'); },
+    set playDuring(v) { this.setProperty('play-during', v); },
+    get pointerEvents() { return this.getPropertyValue('pointer-events'); },
+    set pointerEvents(v) { this.setProperty('pointer-events', v); },
+    get position() { return this.getPropertyValue('position'); },
+    set position(v) { this.setProperty('position', v); },
+    get quotes() { return this.getPropertyValue('quotes'); },
+    set quotes(v) { this.setProperty('quotes', v); },
+    get resize() { return this.getPropertyValue('resize'); },
+    set resize(v) { this.setProperty('resize', v); },
+    get richness() { return this.getPropertyValue('richness'); },
+    set richness(v) { this.setProperty('richness', v); },
+    get right() { return this.getPropertyValue('right'); },
+    set right(v) { this.setProperty('right', v); },
+    get shapeRendering() { return this.getPropertyValue('shape-rendering'); },
+    set shapeRendering(v) { this.setProperty('shape-rendering', v); },
+    get size() { return this.getPropertyValue('size'); },
+    set size(v) { this.setProperty('size', v); },
+    get speak() { return this.getPropertyValue('speak'); },
+    set speak(v) { this.setProperty('speak', v); },
+    get speakHeader() { return this.getPropertyValue('speak-header'); },
+    set speakHeader(v) { this.setProperty('speak-header', v); },
+    get speakNumeral() { return this.getPropertyValue('speak-numeral'); },
+    set speakNumeral(v) { this.setProperty('speak-numeral', v); },
+    get speakPunctuation() { return this.getPropertyValue('speak-punctuation'); },
+    set speakPunctuation(v) { this.setProperty('speak-punctuation', v); },
+    get speechRate() { return this.getPropertyValue('speech-rate'); },
+    set speechRate(v) { this.setProperty('speech-rate', v); },
+    get src() { return this.getPropertyValue('src'); },
+    set src(v) { this.setProperty('src', v); },
+    get stopColor() { return this.getPropertyValue('stop-color'); },
+    set stopColor(v) { this.setProperty('stop-color', v); },
+    get stopOpacity() { return this.getPropertyValue('stop-opacity'); },
+    set stopOpacity(v) { this.setProperty('stop-opacity', v); },
+    get stress() { return this.getPropertyValue('stress'); },
+    set stress(v) { this.setProperty('stress', v); },
+    get stroke() { return this.getPropertyValue('stroke'); },
+    set stroke(v) { this.setProperty('stroke', v); },
+    get strokeDasharray() { return this.getPropertyValue('stroke-dasharray'); },
+    set strokeDasharray(v) { this.setProperty('stroke-dasharray', v); },
+    get strokeDashoffset() { return this.getPropertyValue('stroke-dashoffset'); },
+    set strokeDashoffset(v) { this.setProperty('stroke-dashoffset', v); },
+    get strokeLinecap() { return this.getPropertyValue('stroke-linecap'); },
+    set strokeLinecap(v) { this.setProperty('stroke-linecap', v); },
+    get strokeLinejoin() { return this.getPropertyValue('stroke-linejoin'); },
+    set strokeLinejoin(v) { this.setProperty('stroke-linejoin', v); },
+    get strokeMiterlimit() { return this.getPropertyValue('stroke-miterlimit'); },
+    set strokeMiterlimit(v) { this.setProperty('stroke-miterlimit', v); },
+    get strokeOpacity() { return this.getPropertyValue('stroke-opacity'); },
+    set strokeOpacity(v) { this.setProperty('stroke-opacity', v); },
+    get strokeWidth() { return this.getPropertyValue('stroke-width'); },
+    set strokeWidth(v) { this.setProperty('stroke-width', v); },
+    get tableLayout() { return this.getPropertyValue('table-layout'); },
+    set tableLayout(v) { this.setProperty('table-layout', v); },
+    get textAlign() { return this.getPropertyValue('text-align'); },
+    set textAlign(v) { this.setProperty('text-align', v); },
+    get textAnchor() { return this.getPropertyValue('text-anchor'); },
+    set textAnchor(v) { this.setProperty('text-anchor', v); },
+    get textDecoration() { return this.getPropertyValue('text-decoration'); },
+    set textDecoration(v) { this.setProperty('text-decoration', v); },
+    get textIndent() { return this.getPropertyValue('text-indent'); },
+    set textIndent(v) { this.setProperty('text-indent', v); },
+    get textLineThrough() { return this.getPropertyValue('text-line-through'); },
+    set textLineThrough(v) { this.setProperty('text-line-through', v); },
+    get textLineThroughColor() { return this.getPropertyValue('text-line-through-color'); },
+    set textLineThroughColor(v) { this.setProperty('text-line-through-color', v); },
+    get textLineThroughMode() { return this.getPropertyValue('text-line-through-mode'); },
+    set textLineThroughMode(v) { this.setProperty('text-line-through-mode', v); },
+    get textLineThroughStyle() { return this.getPropertyValue('text-line-through-style'); },
+    set textLineThroughStyle(v) { this.setProperty('text-line-through-style', v); },
+    get textLineThroughWidth() { return this.getPropertyValue('text-line-through-width'); },
+    set textLineThroughWidth(v) { this.setProperty('text-line-through-width', v); },
+    get textOverflow() { return this.getPropertyValue('text-overflow'); },
+    set textOverflow(v) { this.setProperty('text-overflow', v); },
+    get textOverline() { return this.getPropertyValue('text-overline'); },
+    set textOverline(v) { this.setProperty('text-overline', v); },
+    get textOverlineColor() { return this.getPropertyValue('text-overline-color'); },
+    set textOverlineColor(v) { this.setProperty('text-overline-color', v); },
+    get textOverlineMode() { return this.getPropertyValue('text-overline-mode'); },
+    set textOverlineMode(v) { this.setProperty('text-overline-mode', v); },
+    get textOverlineStyle() { return this.getPropertyValue('text-overline-style'); },
+    set textOverlineStyle(v) { this.setProperty('text-overline-style', v); },
+    get textOverlineWidth() { return this.getPropertyValue('text-overline-width'); },
+    set textOverlineWidth(v) { this.setProperty('text-overline-width', v); },
+    get textRendering() { return this.getPropertyValue('text-rendering'); },
+    set textRendering(v) { this.setProperty('text-rendering', v); },
+    get textShadow() { return this.getPropertyValue('text-shadow'); },
+    set textShadow(v) { this.setProperty('text-shadow', v); },
+    get textTransform() { return this.getPropertyValue('text-transform'); },
+    set textTransform(v) { this.setProperty('text-transform', v); },
+    get textUnderline() { return this.getPropertyValue('text-underline'); },
+    set textUnderline(v) { this.setProperty('text-underline', v); },
+    get textUnderlineColor() { return this.getPropertyValue('text-underline-color'); },
+    set textUnderlineColor(v) { this.setProperty('text-underline-color', v); },
+    get textUnderlineMode() { return this.getPropertyValue('text-underline-mode'); },
+    set textUnderlineMode(v) { this.setProperty('text-underline-mode', v); },
+    get textUnderlineStyle() { return this.getPropertyValue('text-underline-style'); },
+    set textUnderlineStyle(v) { this.setProperty('text-underline-style', v); },
+    get textUnderlineWidth() { return this.getPropertyValue('text-underline-width'); },
+    set textUnderlineWidth(v) { this.setProperty('text-underline-width', v); },
+    get top() { return this.getPropertyValue('top'); },
+    set top(v) { this.setProperty('top', v); },
+    get unicodeBidi() { return this.getPropertyValue('unicode-bidi'); },
+    set unicodeBidi(v) { this.setProperty('unicode-bidi', v); },
+    get unicodeRange() { return this.getPropertyValue('unicode-range'); },
+    set unicodeRange(v) { this.setProperty('unicode-range', v); },
+    get vectorEffect() { return this.getPropertyValue('vector-effect'); },
+    set vectorEffect(v) { this.setProperty('vector-effect', v); },
+    get verticalAlign() { return this.getPropertyValue('vertical-align'); },
+    set verticalAlign(v) { this.setProperty('vertical-align', v); },
+    get visibility() { return this.getPropertyValue('visibility'); },
+    set visibility(v) { this.setProperty('visibility', v); },
+    get voiceFamily() { return this.getPropertyValue('voice-family'); },
+    set voiceFamily(v) { this.setProperty('voic-family', v); },
+    get volume() { return this.getPropertyValue('volume'); },
+    set volume(v) { this.setProperty('volume', v); },
+    get webkitAnimation() { return this.getPropertyValue('-webkit-animation'); },
+    set webkitAnimation(v) { this.setProperty('-webkit-animation', v); },
+    get webkitAnimationDelay() { return this.getPropertyValue('-webkit-animation-delay'); },
+    set webkitAnimationDelay(v) { this.setProperty('-webkit-animation-delay', v); },
+    get webkitAnimationDirection() { return this.getPropertyValue('-webkit-animation-direction'); },
+    set webkitAnimationDirection(v) { this.setProperty('-webkit-animation-direction', v); },
+    get webkitAnimationDuration() { return this.getPropertyValue('-webkit-animation-duration'); },
+    set webkitAnimationDuration(v) { this.setProperty('-webkit-animation-duration', v); },
+    get webkitAnimationFillMode() { return this.getPropertyValue('-webkit-animation-fill-mode'); },
+    set webkitAnimationFillMode(v) { this.setProperty('-webkit-animation-fill-mode', v); },
+    get webkitAnimationIterationCount() { return this.getPropertyValue('-webkit-animation-iteration-count'); },
+    set webkitAnimationIterationCount(v) { this.setProperty('-webkit-animation-iteration-count', v); },
+    get webkitAnimationName() { return this.getPropertyValue('-webkit-animation-name'); },
+    set webkitAnimationName(v) { this.setProperty('-webkit-animation-name', v); },
+    get webkitAnimationPlayState() { return this.getPropertyValue('-webkit-animation-play-state'); },
+    set webkitAnimationPlayState(v) { this.setProperty('-webkit-animation-play-state', v); },
+    get webkitAnimationTimingFunction() { return this.getPropertyValue('-webkit-animation-timing-function'); },
+    set webkitAnimationTimingFunction(v) { this.setProperty('-webkit-animation-timing-function', v); },
+    get webkitAppearance() { return this.getPropertyValue('-webkit-appearance'); },
+    set webkitAppearance(v) { this.setProperty('-webkit-appearance', v); },
+    get webkitAspectRatio() { return this.getPropertyValue('-webkit-aspect-ratio'); },
+    set webkitAspectRatio(v) { this.setProperty('-webkit-aspect-ratio', v); },
+    get webkitBackfaceVisibility() { return this.getPropertyValue('-webkit-backface-visibility'); },
+    set webkitBackfaceVisibility(v) { this.setProperty('-webkit-backface-visibility', v); },
+    get webkitBackgroundClip() { return this.getPropertyValue('-webkit-background-clip'); },
+    set webkitBackgroundClip(v) { this.setProperty('-webkit-background-clip', v); },
+    get webkitBackgroundComposite() { return this.getPropertyValue('-webkit-background-composite'); },
+    set webkitBackgroundComposite(v) { this.setProperty('-webkit-background-composite', v); },
+    get webkitBackgroundOrigin() { return this.getPropertyValue('-webkit-background-origin'); },
+    set webkitBackgroundOrigin(v) { this.setProperty('-webkit-background-origin', v); },
+    get webkitBackgroundSize() { return this.getPropertyValue('-webkit-background-size'); },
+    set webkitBackgroundSize(v) { this.setProperty('-webkit-background-size', v); },
+    get webkitBorderAfter() { return this.getPropertyValue('-webkit-border-after'); },
+    set webkitBorderAfter(v) { this.setProperty('-webkit-border-after', v); },
+    get webkitBorderAfterColor() { return this.getPropertyValue('-webkit-border-after-color'); },
+    set webkitBorderAfterColor(v) { this.setProperty('-webkit-border-after-color', v); },
+    get webkitBorderAfterStyle() { return this.getPropertyValue('-webkit-border-after-style'); },
+    set webkitBorderAfterStyle(v) { this.setProperty('-webkit-border-after-style', v); },
+    get webkitBorderAfterWidth() { return this.getPropertyValue('-webkit-border-after-width'); },
+    set webkitBorderAfterWidth(v) { this.setProperty('-webkit-border-after-width', v); },
+    get webkitBorderBefore() { return this.getPropertyValue('-webkit-border-before'); },
+    set webkitBorderBefore(v) { this.setProperty('-webkit-border-before', v); },
+    get webkitBorderBeforeColor() { return this.getPropertyValue('-webkit-border-before-color'); },
+    set webkitBorderBeforeColor(v) { this.setProperty('-webkit-border-before-color', v); },
+    get webkitBorderBeforeStyle() { return this.getPropertyValue('-webkit-border-before-style'); },
+    set webkitBorderBeforeStyle(v) { this.setProperty('-webkit-border-before-style', v); },
+    get webkitBorderBeforeWidth() { return this.getPropertyValue('-webkit-border-before-width'); },
+    set webkitBorderBeforeWidth(v) { this.setProperty('-webkit-border-before-width', v); },
+    get webkitBorderEnd() { return this.getPropertyValue('-webkit-border-end'); },
+    set webkitBorderEnd(v) { this.setProperty('-webkit-border-end', v); },
+    get webkitBorderEndColor() { return this.getPropertyValue('-webkit-border-end-color'); },
+    set webkitBorderEndColor(v) { this.setProperty('-webkit-border-end-color', v); },
+    get webkitBorderEndStyle() { return this.getPropertyValue('-webkit-border-end-style'); },
+    set webkitBorderEndStyle(v) { this.setProperty('-webkit-border-end-style', v); },
+    get webkitBorderEndWidth() { return this.getPropertyValue('-webkit-border-end-width'); },
+    set webkitBorderEndWidth(v) { this.setProperty('-webkit-border-end-width', v); },
+    get webkitBorderFit() { return this.getPropertyValue('-webkit-border-fit'); },
+    set webkitBorderFit(v) { this.setProperty('-webkit-border-fit', v); },
+    get webkitBorderHorizontalSpacing() { return this.getPropertyValue('-webkit-border-horizontal-spacing'); },
+    set webkitBorderHorizontalSpacing(v) { this.setProperty('-webkit-border-horizontal-spacing', v); },
+    get webkitBorderImage() { return this.getPropertyValue('-webkit-border-image'); },
+    set webkitBorderImage(v) { this.setProperty('-webkit-border-image', v); },
+    get webkitBorderRadius() { return this.getPropertyValue('-webkit-border-radius'); },
+    set webkitBorderRadius(v) { this.setProperty('-webkit-border-radius', v); },
+    get webkitBorderStart() { return this.getPropertyValue('-webkit-border-start'); },
+    set webkitBorderStart(v) { this.setProperty('-webkit-border-start', v); },
+    get webkitBorderStartColor() { return this.getPropertyValue('-webkit-border-start-color'); },
+    set webkitBorderStartColor(v) { this.setProperty('-webkit-border-start-color', v); },
+    get webkitBorderStartStyle() { return this.getPropertyValue('-webkit-border-start-style'); },
+    set webkitBorderStartStyle(v) { this.setProperty('-webkit-border-start-style', v); },
+    get webkitBorderStartWidth() { return this.getPropertyValue('-webkit-border-start-width'); },
+    set webkitBorderStartWidth(v) { this.setProperty('-webkit-border-start-width', v); },
+    get webkitBorderVerticalSpacing() { return this.getPropertyValue('-webkit-border-vertical-spacing'); },
+    set webkitBorderVerticalSpacing(v) { this.setProperty('-webkit-border-vertical-spacing', v); },
+    get webkitBoxAlign() { return this.getPropertyValue('-webkit-box-align'); },
+    set webkitBoxAlign(v) { this.setProperty('-webkit-box-align', v); },
+    get webkitBoxDirection() { return this.getPropertyValue('-webkit-box-direction'); },
+    set webkitBoxDirection(v) { this.setProperty('-webkit-box-direction', v); },
+    get webkitBoxFlex() { return this.getPropertyValue('-webkit-box-flex'); },
+    set webkitBoxFlex(v) { this.setProperty('-webkit-box-flex', v); },
+    get webkitBoxFlexGroup() { return this.getPropertyValue('-webkit-box-flex-group'); },
+    set webkitBoxFlexGroup(v) { this.setProperty('-webkit-box-flex-group', v); },
+    get webkitBoxLines() { return this.getPropertyValue('-webkit-box-lines'); },
+    set webkitBoxLines(v) { this.setProperty('-webkit-box-lines', v); },
+    get webkitBoxOrdinalGroup() { return this.getPropertyValue('-webkit-box-ordinal-group'); },
+    set webkitBoxOrdinalGroup(v) { this.setProperty('-webkit-box-ordinal-group', v); },
+    get webkitBoxOrient() { return this.getPropertyValue('-webkit-box-orient'); },
+    set webkitBoxOrient(v) { this.setProperty('-webkit-box-orient', v); },
+    get webkitBoxPack() { return this.getPropertyValue('-webkit-box-pack'); },
+    set webkitBoxPack(v) { this.setProperty('-webkit-box-pack', v); },
+    get webkitBoxReflect() { return this.getPropertyValue('-webkit-box-reflect'); },
+    set webkitBoxReflect(v) { this.setProperty('-webkit-box-reflect', v); },
+    get webkitBoxShadow() { return this.getPropertyValue('-webkit-box-shadow'); },
+    set webkitBoxShadow(v) { this.setProperty('-webkit-box-shadow', v); },
+    get webkitColorCorrection() { return this.getPropertyValue('-webkit-color-correction'); },
+    set webkitColorCorrection(v) { this.setProperty('-webkit-color-correction', v); },
+    get webkitColumnAxis() { return this.getPropertyValue('-webkit-column-axis'); },
+    set webkitColumnAxis(v) { this.setProperty('-webkit-column-axis', v); },
+    get webkitColumnBreakAfter() { return this.getPropertyValue('-webkit-column-break-after'); },
+    set webkitColumnBreakAfter(v) { this.setProperty('-webkit-column-break-after', v); },
+    get webkitColumnBreakBefore() { return this.getPropertyValue('-webkit-column-break-before'); },
+    set webkitColumnBreakBefore(v) { this.setProperty('-webkit-column-break-before', v); },
+    get webkitColumnBreakInside() { return this.getPropertyValue('-webkit-column-break-inside'); },
+    set webkitColumnBreakInside(v) { this.setProperty('-webkit-column-break-inside', v); },
+    get webkitColumnCount() { return this.getPropertyValue('-webkit-column-count'); },
+    set webkitColumnCount(v) { this.setProperty('-webkit-column-count', v); },
+    get webkitColumnGap() { return this.getPropertyValue('-webkit-column-gap'); },
+    set webkitColumnGap(v) { this.setProperty('-webkit-column-gap', v); },
+    get webkitColumnRule() { return this.getPropertyValue('-webkit-column-rule'); },
+    set webkitColumnRule(v) { this.setProperty('-webkit-column-rule', v); },
+    get webkitColumnRuleColor() { return this.getPropertyValue('-webkit-column-rule-color'); },
+    set webkitColumnRuleColor(v) { this.setProperty('-webkit-column-rule-color', v); },
+    get webkitColumnRuleStyle() { return this.getPropertyValue('-webkit-column-rule-style'); },
+    set webkitColumnRuleStyle(v) { this.setProperty('-webkit-column-rule-style', v); },
+    get webkitColumnRuleWidth() { return this.getPropertyValue('-webkit-column-rule-width'); },
+    set webkitColumnRuleWidth(v) { this.setProperty('-webkit-column-rule-width', v); },
+    get webkitColumnSpan() { return this.getPropertyValue('-webkit-column-span'); },
+    set webkitColumnSpan(v) { this.setProperty('-webkit-column-span', v); },
+    get webkitColumnWidth() { return this.getPropertyValue('-webkit-column-width'); },
+    set webkitColumnWidth(v) { this.setProperty('-webkit-column-width', v); },
+    get webkitColumns() { return this.getPropertyValue('-webkit-columns'); },
+    set webkitColumns(v) { this.setProperty('-webkit-columns', v); },
+    get webkitFilter() { return this.getPropertyValue('-webkit-filter'); },
+    set webkitFilter(v) { this.setProperty('-webkit-filter', v); },
+    get webkitFlexAlign() { return this.getPropertyValue('-webkit-flex-align'); },
+    set webkitFlexAlign(v) { this.setProperty('-webkit-flex-align', v); },
+    get webkitFlexDirection() { return this.getPropertyValue('-webkit-flex-direction'); },
+    set webkitFlexDirection(v) { this.setProperty('-webkit-flex-direction', v); },
+    get webkitFlexFlow() { return this.getPropertyValue('-webkit-flex-flow'); },
+    set webkitFlexFlow(v) { this.setProperty('-webkit-flex-flow', v); },
+    get webkitFlexItemAlign() { return this.getPropertyValue('-webkit-flex-item-align'); },
+    set webkitFlexItemAlign(v) { this.setProperty('-webkit-flex-item-align', v); },
+    get webkitFlexLinePack() { return this.getPropertyValue('-webkit-flex-line-pack'); },
+    set webkitFlexLinePack(v) { this.setProperty('-webkit-flex-line-pack', v); },
+    get webkitFlexOrder() { return this.getPropertyValue('-webkit-flex-order'); },
+    set webkitFlexOrder(v) { this.setProperty('-webkit-flex-order', v); },
+    get webkitFlexPack() { return this.getPropertyValue('-webkit-flex-pack'); },
+    set webkitFlexPack(v) { this.setProperty('-webkit-flex-pack', v); },
+    get webkitFlexWrap() { return this.getPropertyValue('-webkit-flex-wrap'); },
+    set webkitFlexWrap(v) { this.setProperty('-webkit-flex-wrap', v); },
+    get webkitFlowFrom() { return this.getPropertyValue('-webkit-flow-from'); },
+    set webkitFlowFrom(v) { this.setProperty('-webkit-flow-from', v); },
+    get webkitFlowInto() { return this.getPropertyValue('-webkit-flow-into'); },
+    set webkitFlowInto(v) { this.setProperty('-webkit-flow-into', v); },
+    get webkitFontFeatureSettings() { return this.getPropertyValue('-webkit-font-feature-settings'); },
+    set webkitFontFeatureSettings(v) { this.setProperty('-webkit-font-feature-settings', v); },
+    get webkitFontKerning() { return this.getPropertyValue('-webkit-font-kerning'); },
+    set webkitFontKerning(v) { this.setProperty('-webkit-font-kerning', v); },
+    get webkitFontSizeDelta() { return this.getPropertyValue('-webkit-font-size-delta'); },
+    set webkitFontSizeDelta(v) { this.setProperty('-webkit-font-size-delta', v); },
+    get webkitFontSmoothing() { return this.getPropertyValue('-webkit-font-smoothing'); },
+    set webkitFontSmoothing(v) { this.setProperty('-webkit-font-smoothing', v); },
+    get webkitFontVariantLigatures() { return this.getPropertyValue('-webkit-font-variant-ligatures'); },
+    set webkitFontVariantLigatures(v) { this.setProperty('-webkit-font-variant-ligatures', v); },
+    get webkitHighlight() { return this.getPropertyValue('-webkit-highlight'); },
+    set webkitHighlight(v) { this.setProperty('-webkit-highlight', v); },
+    get webkitHyphenateCharacter() { return this.getPropertyValue('-webkit-hyphenate-character'); },
+    set webkitHyphenateCharacter(v) { this.setProperty('-webkit-hyphenate-character', v); },
+    get webkitHyphenateLimitAfter() { return this.getPropertyValue('-webkit-hyphenate-limit-after'); },
+    set webkitHyphenateLimitAfter(v) { this.setProperty('-webkit-hyphenate-limit-after', v); },
+    get webkitHyphenateLimitBefore() { return this.getPropertyValue('-webkit-hyphenate-limit-before'); },
+    set webkitHyphenateLimitBefore(v) { this.setProperty('-webkit-hyphenate-limit-before', v); },
+    get webkitHyphenateLimitLines() { return this.getPropertyValue('-webkit-hyphenate-limit-lines'); },
+    set webkitHyphenateLimitLines(v) { this.setProperty('-webkit-hyphenate-limit-lines', v); },
+    get webkitHyphens() { return this.getPropertyValue('-webkit-hyphens'); },
+    set webkitHyphens(v) { this.setProperty('-webkit-hyphens', v); },
+    get webkitLineAlign() { return this.getPropertyValue('-webkit-line-align'); },
+    set webkitLineAlign(v) { this.setProperty('-webkit-line-align', v); },
+    get webkitLineBoxContain() { return this.getPropertyValue('-webkit-line-box-contain'); },
+    set webkitLineBoxContain(v) { this.setProperty('-webkit-line-box-contain', v); },
+    get webkitLineBreak() { return this.getPropertyValue('-webkit-line-break'); },
+    set webkitLineBreak(v) { this.setProperty('-webkit-line-break', v); },
+    get webkitLineClamp() { return this.getPropertyValue('-webkit-line-clamp'); },
+    set webkitLineClamp(v) { this.setProperty('-webkit-line-clamp', v); },
+    get webkitLineGrid() { return this.getPropertyValue('-webkit-line-grid'); },
+    set webkitLineGrid(v) { this.setProperty('-webkit-line-grid', v); },
+    get webkitLineSnap() { return this.getPropertyValue('-webkit-line-snap'); },
+    set webkitLineSnap(v) { this.setProperty('-webkit-line-snap', v); },
+    get webkitLocale() { return this.getPropertyValue('-webkit-locale'); },
+    set webkitLocale(v) { this.setProperty('-webkit-locale', v); },
+    get webkitLogicalHeight() { return this.getPropertyValue('-webkit-logical-height'); },
+    set webkitLogicalHeight(v) { this.setProperty('-webkit-logical-height', v); },
+    get webkitLogicalWidth() { return this.getPropertyValue('-webkit-logical-width'); },
+    set webkitLogicalWidth(v) { this.setProperty('-webkit-logical-width', v); },
+    get webkitMarginAfter() { return this.getPropertyValue('-webkit-margin-after'); },
+    set webkitMarginAfter(v) { this.setProperty('-webkit-margin-after', v); },
+    get webkitMarginAfterCollapse() { return this.getPropertyValue('-webkit-margin-after-collapse'); },
+    set webkitMarginAfterCollapse(v) { this.setProperty('-webkit-margin-after-collapse', v); },
+    get webkitMarginBefore() { return this.getPropertyValue('-webkit-margin-before'); },
+    set webkitMarginBefore(v) { this.setProperty('-webkit-margin-before', v); },
+    get webkitMarginBeforeCollapse() { return this.getPropertyValue('-webkit-margin-before-collapse'); },
+    set webkitMarginBeforeCollapse(v) { this.setProperty('-webkit-margin-before-collapse', v); },
+    get webkitMarginBottomCollapse() { return this.getPropertyValue('-webkit-margin-bottom-collapse'); },
+    set webkitMarginBottomCollapse(v) { this.setProperty('-webkit-margin-bottom-collapse', v); },
+    get webkitMarginCollapse() { return this.getPropertyValue('-webkit-margin-collapse'); },
+    set webkitMarginCollapse(v) { this.setProperty('-webkit-margin-collapse', v); },
+    get webkitMarginEnd() { return this.getPropertyValue('-webkit-margin-end'); },
+    set webkitMarginEnd(v) { this.setProperty('-webkit-margin-end', v); },
+    get webkitMarginStart() { return this.getPropertyValue('-webkit-margin-start'); },
+    set webkitMarginStart(v) { this.setProperty('-webkit-margin-start', v); },
+    get webkitMarginTopCollapse() { return this.getPropertyValue('-webkit-margin-top-collapse'); },
+    set webkitMarginTopCollapse(v) { this.setProperty('-webkit-margin-top-collapse', v); },
+    get webkitMarquee() { return this.getPropertyValue('-webkit-marquee'); },
+    set webkitMarquee(v) { this.setProperty('-webkit-marquee', v); },
+    get webkitMarqueeDirection() { return this.getPropertyValue('-webkit-marquee-direction'); },
+    set webkitMarqueeDirection(v) { this.setProperty('-webkit-marquee-direction', v); },
+    get webkitMarqueeIncrement() { return this.getPropertyValue('-webkit-marquee-increment'); },
+    set webkitMarqueeIncrement(v) { this.setProperty('-webkit-marquee-increment', v); },
+    get webkitMarqueeRepetition() { return this.getPropertyValue('-webkit-marquee-repetition'); },
+    set webkitMarqueeRepetition(v) { this.setProperty('-webkit-marquee-repetition', v); },
+    get webkitMarqueeSpeed() { return this.getPropertyValue('-webkit-marquee-speed'); },
+    set webkitMarqueeSpeed(v) { this.setProperty('-webkit-marquee-speed', v); },
+    get webkitMarqueeStyle() { return this.getPropertyValue('-webkit-marquee-style'); },
+    set webkitMarqueeStyle(v) { this.setProperty('-webkit-marquee-style', v); },
+    get webkitMask() { return this.getPropertyValue('-webkit-mask'); },
+    set webkitMask(v) { this.setProperty('-webkit-mask', v); },
+    get webkitMaskAttachment() { return this.getPropertyValue('-webkit-mask-attachment'); },
+    set webkitMaskAttachment(v) { this.setProperty('-webkit-mask-attachment', v); },
+    get webkitMaskBoxImage() { return this.getPropertyValue('-webkit-mask-box-image'); },
+    set webkitMaskBoxImage(v) { this.setProperty('-webkit-mask-box-image', v); },
+    get webkitMaskBoxImageOutset() { return this.getPropertyValue('-webkit-mask-box-image-outset'); },
+    set webkitMaskBoxImageOutset(v) { this.setProperty('-webkit-mask-box-image-outset', v); },
+    get webkitMaskBoxImageRepeat() { return this.getPropertyValue('-webkit-mask-box-image-repeat'); },
+    set webkitMaskBoxImageRepeat(v) { this.setProperty('-webkit-mask-box-image-repeat', v); },
+    get webkitMaskBoxImageSlice() { return this.getPropertyValue('-webkit-mask-box-image-slice'); },
+    set webkitMaskBoxImageSlice(v) { this.setProperty('-webkit-mask-box-image-slice', v); },
+    get webkitMaskBoxImageSource() { return this.getPropertyValue('-webkit-mask-box-image-source'); },
+    set webkitMaskBoxImageSource(v) { this.setProperty('-webkit-mask-box-image-source', v); },
+    get webkitMaskBoxImageWidth() { return this.getPropertyValue('-webkit-mask-box-image-width'); },
+    set webkitMaskBoxImageWidth(v) { this.setProperty('-webkit-mask-box-image-width', v); },
+    get webkitMaskClip() { return this.getPropertyValue('-webkit-mask-clip'); },
+    set webkitMaskClip(v) { this.setProperty('-webkit-mask-clip', v); },
+    get webkitMaskComposite() { return this.getPropertyValue('-webkit-mask-composite'); },
+    set webkitMaskComposite(v) { this.setProperty('-webkit-mask-composite', v); },
+    get webkitMaskImage() { return this.getPropertyValue('-webkit-mask-image'); },
+    set webkitMaskImage(v) { this.setProperty('-webkit-mask-image', v); },
+    get webkitMaskOrigin() { return this.getPropertyValue('-webkit-mask-origin'); },
+    set webkitMaskOrigin(v) { this.setProperty('-webkit-mask-origin', v); },
+    get webkitMaskPosition() { return this.getPropertyValue('-webkit-mask-position'); },
+    set webkitMaskPosition(v) { this.setProperty('-webkit-mask-position', v); },
+    get webkitMaskPositionX() { return this.getPropertyValue('-webkit-mask-position-x'); },
+    set webkitMaskPositionX(v) { this.setProperty('-webkit-mask-position-x', v); },
+    get webkitMaskPositionY() { return this.getPropertyValue('-webkit-mask-position-y'); },
+    set webkitMaskPositionY(v) { this.setProperty('-webkit-mask-position-y', v); },
+    get webkitMaskRepeat() { return this.getPropertyValue('-webkit-mask-repeat'); },
+    set webkitMaskRepeat(v) { this.setProperty('-webkit-mask-repeat', v); },
+    get webkitMaskRepeatX() { return this.getPropertyValue('-webkit-mask-repeat-x'); },
+    set webkitMaskRepeatX(v) { this.setProperty('-webkit-mask-repeat-x', v); },
+    get webkitMaskRepeatY() { return this.getPropertyValue('-webkit-mask-repeat-y'); },
+    set webkitMaskRepeatY(v) { this.setProperty('-webkit-mask-repeat-y', v); },
+    get webkitMaskSize() { return this.getPropertyValue('-webkit-mask-size'); },
+    set webkitMaskSize(v) { this.setProperty('-webkit-mask-size', v); },
+    get webkitMatchNearestMailBlockquoteColor() { return this.getPropertyValue('-webkit-match-nearest-mail-blockquote-color'); },
+    set webkitMatchNearestMailBlockquoteColor(v) { this.setProperty('-webkit-match-nearest-mail-blockquote-color', v); },
+    get webkitMaxLogicalHeight() { return this.getPropertyValue('-webkit-max-logical-height'); },
+    set webkitMaxLogicalHeight(v) { this.setProperty('-webkit-max-logical-height', v); },
+    get webkitMaxLogicalWidth() { return this.getPropertyValue('-webkit-max-logical-width'); },
+    set webkitMaxLogicalWidth(v) { this.setProperty('-webkit-max-logical-width', v); },
+    get webkitMinLogicalHeight() { return this.getPropertyValue('-webkit-min-logical-height'); },
+    set webkitMinLogicalHeight(v) { this.setProperty('-webkit-min-logical-height', v); },
+    get webkitMinLogicalWidth() { return this.getPropertyValue('-webkit-min-logical-width'); },
+    set webkitMinLogicalWidth(v) { this.setProperty('-webkit-min-logical-width', v); },
+    get webkitNbspMode() { return this.getPropertyValue('-webkit-nbsp-mode'); },
+    set webkitNbspMode(v) { this.setProperty('-webkit-nbsp-mode', v); },
+    get webkitOverflowScrolling() { return this.getPropertyValue('-webkit-overflow-scrolling'); },
+    set webkitOverflowScrolling(v) { this.setProperty('-webkit-overflow-scrolling', v); },
+    get webkitPaddingAfter() { return this.getPropertyValue('-webkit-padding-after'); },
+    set webkitPaddingAfter(v) { this.setProperty('-webkit-padding-after', v); },
+    get webkitPaddingBefore() { return this.getPropertyValue('-webkit-padding-before'); },
+    set webkitPaddingBefore(v) { this.setProperty('-webkit-padding-before', v); },
+    get webkitPaddingEnd() { return this.getPropertyValue('-webkit-padding-end'); },
+    set webkitPaddingEnd(v) { this.setProperty('-webkit-padding-end', v); },
+    get webkitPaddingStart() { return this.getPropertyValue('-webkit-padding-start'); },
+    set webkitPaddingStart(v) { this.setProperty('-webkit-padding-start', v); },
+    get webkitPerspective() { return this.getPropertyValue('-webkit-perspective'); },
+    set webkitPerspective(v) { this.setProperty('-webkit-perspective', v); },
+    get webkitPerspectiveOrigin() { return this.getPropertyValue('-webkit-perspective-origin'); },
+    set webkitPerspectiveOrigin(v) { this.setProperty('-webkit-perspective-origin', v); },
+    get webkitPerspectiveOriginX() { return this.getPropertyValue('-webkit-perspective-origin-x'); },
+    set webkitPerspectiveOriginX(v) { this.setProperty('-webkit-perspective-origin-x', v); },
+    get webkitPerspectiveOriginY() { return this.getPropertyValue('-webkit-perspective-origin-y'); },
+    set webkitPerspectiveOriginY(v) { this.setProperty('-webkit-perspective-origin-y', v); },
+    get webkitPrintColorAdjust() { return this.getPropertyValue('-webkit-print-color-adjust'); },
+    set webkitPrintColorAdjust(v) { this.setProperty('-webkit-print-color-adjust', v); },
+    get webkitRegionBreakAfter() { return this.getPropertyValue('-webkit-region-break-after'); },
+    set webkitRegionBreakAfter(v) { this.setProperty('-webkit-region-break-after', v); },
+    get webkitRegionBreakBefore() { return this.getPropertyValue('-webkit-region-break-before'); },
+    set webkitRegionBreakBefore(v) { this.setProperty('-webkit-region-break-before', v); },
+    get webkitRegionBreakInside() { return this.getPropertyValue('-webkit-region-break-inside'); },
+    set webkitRegionBreakInside(v) { this.setProperty('-webkit-region-break-inside', v); },
+    get webkitRegionOverflow() { return this.getPropertyValue('-webkit-region-overflow'); },
+    set webkitRegionOverflow(v) { this.setProperty('-webkit-region-overflow', v); },
+    get webkitRtlOrdering() { return this.getPropertyValue('-webkit-rtl-ordering'); },
+    set webkitRtlOrdering(v) { this.setProperty('-webkit-rtl-ordering', v); },
+    get webkitSvgShadow() { return this.getPropertyValue('-webkit-svg-shadow'); },
+    set webkitSvgShadow(v) { this.setProperty('-webkit-svg-shadow', v); },
+    get webkitTapHighlightColor() { return this.getPropertyValue('-webkit-tap-highlight-color'); },
+    set webkitTapHighlightColor(v) { this.setProperty('-webkit-tap-highlight-color', v); },
+    get webkitTextCombine() { return this.getPropertyValue('-webkit-text-combine'); },
+    set webkitTextCombine(v) { this.setProperty('-webkit-text-combine', v); },
+    get webkitTextDecorationsInEffect() { return this.getPropertyValue('-webkit-text-decorations-in-effect'); },
+    set webkitTextDecorationsInEffect(v) { this.setProperty('-webkit-text-decorations-in-effect', v); },
+    get webkitTextEmphasis() { return this.getPropertyValue('-webkit-text-emphasis'); },
+    set webkitTextEmphasis(v) { this.setProperty('-webkit-text-emphasis', v); },
+    get webkitTextEmphasisColor() { return this.getPropertyValue('-webkit-text-emphasis-color'); },
+    set webkitTextEmphasisColor(v) { this.setProperty('-webkit-text-emphasis-color', v); },
+    get webkitTextEmphasisPosition() { return this.getPropertyValue('-webkit-text-emphasis-position'); },
+    set webkitTextEmphasisPosition(v) { this.setProperty('-webkit-text-emphasis-position', v); },
+    get webkitTextEmphasisStyle() { return this.getPropertyValue('-webkit-text-emphasis-style'); },
+    set webkitTextEmphasisStyle(v) { this.setProperty('-webkit-text-emphasis-style', v); },
+    get webkitTextFillColor() { return this.getPropertyValue('-webkit-text-fill-color'); },
+    set webkitTextFillColor(v) { this.setProperty('-webkit-text-fill-color', v); },
+    get webkitTextOrientation() { return this.getPropertyValue('-webkit-text-orientation'); },
+    set webkitTextOrientation(v) { this.setProperty('-webkit-text-orientation', v); },
+    get webkitTextSecurity() { return this.getPropertyValue('-webkit-text-security'); },
+    set webkitTextSecurity(v) { this.setProperty('-webkit-text-security', v); },
+    get webkitTextSizeAdjust() { return this.getPropertyValue('-webkit-text-size-adjust'); },
+    set webkitTextSizeAdjust(v) { this.setProperty('-webkit-text-size-adjust', v); },
+    get webkitTextStroke() { return this.getPropertyValue('-webkit-text-stroke'); },
+    set webkitTextStroke(v) { this.setProperty('-webkit-text-stroke', v); },
+    get webkitTextStrokeColor() { return this.getPropertyValue('-webkit-text-stroke-color'); },
+    set webkitTextStrokeColor(v) { this.setProperty('-webkit-text-stroke-color', v); },
+    get webkitTextStrokeWidth() { return this.getPropertyValue('-webkit-text-stroke-width'); },
+    set webkitTextStrokeWidth(v) { this.setProperty('-webkit-text-stroke-width', v); },
+    get webkitTransform() { return this.getPropertyValue('-webkit-transform'); },
+    set webkitTransform(v) { this.setProperty('-webkit-transform', v); },
+    get webkitTransformOrigin() { return this.getPropertyValue('-webkit-transform-origin'); },
+    set webkitTransformOrigin(v) { this.setProperty('-webkit-transform-origin', v); },
+    get webkitTransformOriginX() { return this.getPropertyValue('-webkit-transform-origin-x'); },
+    set webkitTransformOriginX(v) { this.setProperty('-webkit-transform-origin-x', v); },
+    get webkitTransformOriginY() { return this.getPropertyValue('-webkit-transform-origin-y'); },
+    set webkitTransformOriginY(v) { this.setProperty('-webkit-transform-origin-y', v); },
+    get webkitTransformOriginZ() { return this.getPropertyValue('-webkit-transform-origin-z'); },
+    set webkitTransformOriginZ(v) { this.setProperty('-webkit-transform-origin-z', v); },
+    get webkitTransformStyle() { return this.getPropertyValue('-webkit-transform-style'); },
+    set webkitTransformStyle(v) { this.setProperty('-webkit-transform-style', v); },
+    get webkitTransition() { return this.getPropertyValue('-webkit-transition'); },
+    set webkitTransition(v) { this.setProperty('-webkit-transition', v); },
+    get webkitTransitionDelay() { return this.getPropertyValue('-webkit-transition-delay'); },
+    set webkitTransitionDelay(v) { this.setProperty('-webkit-transition-delay', v); },
+    get webkitTransitionDuration() { return this.getPropertyValue('-webkit-transition-duration'); },
+    set webkitTransitionDuration(v) { this.setProperty('-webkit-transition-duration', v); },
+    get webkitTransitionProperty() { return this.getPropertyValue('-webkit-transition-property'); },
+    set webkitTransitionProperty(v) { this.setProperty('-webkit-transition-property', v); },
+    get webkitTransitionTimingFunction() { return this.getPropertyValue('-webkit-transition-timing-function'); },
+    set webkitTransitionTimingFunction(v) { this.setProperty('-webkit-transition-timing-function', v); },
+    get webkitUserDrag() { return this.getPropertyValue('-webkit-user-drag'); },
+    set webkitUserDrag(v) { this.setProperty('-webkit-user-drag', v); },
+    get webkitUserModify() { return this.getPropertyValue('-webkit-user-modify'); },
+    set webkitUserModify(v) { this.setProperty('-webkit-user-modify', v); },
+    get webkitUserSelect() { return this.getPropertyValue('-webkit-user-select'); },
+    set webkitUserSelect(v) { this.setProperty('-webkit-user-select', v); },
+    get webkitWrap() { return this.getPropertyValue('-webkit-wrap'); },
+    set webkitWrap(v) { this.setProperty('-webkit-wrap', v); },
+    get webkitWrapFlow() { return this.getPropertyValue('-webkit-wrap-flow'); },
+    set webkitWrapFlow(v) { this.setProperty('-webkit-wrap-flow', v); },
+    get webkitWrapMargin() { return this.getPropertyValue('-webkit-wrap-margin'); },
+    set webkitWrapMargin(v) { this.setProperty('-webkit-wrap-margin', v); },
+    get webkitWrapPadding() { return this.getPropertyValue('-webkit-wrap-padding'); },
+    set webkitWrapPadding(v) { this.setProperty('-webkit-wrap-padding', v); },
+    get webkitWrapShapeInside() { return this.getPropertyValue('-webkit-wrap-shape-inside'); },
+    set webkitWrapShapeInside(v) { this.setProperty('-webkit-wrap-shape-inside', v); },
+    get webkitWrapShapeOutside() { return this.getPropertyValue('-webkit-wrap-shape-outside'); },
+    set webkitWrapShapeOutside(v) { this.setProperty('-webkit-wrap-shape-outside', v); },
+    get webkitWrapThrough() { return this.getPropertyValue('-webkit-wrap-through'); },
+    set webkitWrapThrough(v) { this.setProperty('-webkit-wrap-through', v); },
+    get webkitWritingMode() { return this.getPropertyValue('-webkit-writing-mode'); },
+    set webkitWritingMode(v) { this.setProperty('-webkit-writing-mode', v); },
+    get whiteSpace() { return this.getPropertyValue('white-space'); },
+    set whiteSpace(v) { this.setProperty('white-space', v); },
+    get widows() { return this.getPropertyValue('widows'); },
+    set widows(v) { this.setProperty('widows', v); },
+    get width() { return this.getPropertyValue('width'); },
+    set width(v) { this.setProperty('width', v); },
+    get wordBreak() { return this.getPropertyValue('word-break'); },
+    set wordBreak(v) { this.setProperty('word-break', v); },
+    get wordSpacing() { return this.getPropertyValue('word-spacing'); },
+    set wordSpacing(v) { this.setProperty('word-spacing', v); },
+    get wordWrap() { return this.getPropertyValue('word-wrap'); },
+    set wordWrap(v) { this.setProperty('word-wrap', v); },
+    get writingMode() { return this.getPropertyValue('writing-mode'); },
+    set writingMode(v) { this.setProperty('writing-mode', v); },
+    get zIndex() { return this.getPropertyValue('z-index'); },
+    set zIndex(v) { this.setProperty('z-index', v); },
+    get zoom() { return this.getPropertyValue('zoom'); },
+    set zoom(v) { this.setProperty('zoom', v); },
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/make_properties.pl b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/make_properties.pl
new file mode 100755
index 0000000..0249276
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/make_properties.pl
@@ -0,0 +1,26 @@
+#!/usr/bin/perl -w
+
+use strict;
+
+while(<>) {
+  chomp;
+  s/^\s*//;
+  my $prop = substr($_, 0, -3);  # zoom: {
+  my $desc = <>;                 #     set: function (v) {
+  $desc .= <>;                   #         this.setProperty('zoom', v);
+  $desc .= <>;                   #     },
+  $desc .= <>;                   #     get: function () {
+  $desc .= <>;                   #         return this.getPropertyValue('zoom');
+  $desc .= <>;                   #     },
+  $desc .= <>;                   #     enumerable: true
+  $desc .= <>;                   # }
+  $desc =~ s/^        //gm;
+  $desc =~ s/},$/}/;
+  chomp $desc;
+  $desc .= ";\n";
+  print $prop, "\n";
+
+  open(my $fh, ">./lib/properties/$prop.js") || die "Couldn't open $prop.js";
+  print $fh "'use strict';\n\nmodule.exports = {\n", $desc;
+  close $fh;
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/package.json b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/package.json
new file mode 100644
index 0000000..3bcfabd
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/package.json
@@ -0,0 +1,48 @@
+{
+  "name": "cssstyle",
+  "description": "CSSStyleDeclaration Object Model implementation",
+  "keywords": [
+    "CSS",
+    "CSSStyleDeclaration",
+    "StyleSheet"
+  ],
+  "version": "0.2.3",
+  "homepage": "https://github.com/chad3814/CSSStyleDeclaration",
+  "maintainers": [
+    {
+      "name": "Chad Walker",
+      "email": "chad at chad-cat-lore-eddie.com",
+      "url": "https://github.com/chad3814"
+    }
+  ],
+  "contributors": [
+    {
+      "name": "Nikita Vasilyev",
+      "email": "me at elv1s.ru"
+    }
+  ],
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/chad3814/CSSStyleDeclaration.git"
+  },
+  "bugs": {
+    "url": "https://github.com/chad3814/CSSStyleDeclaration/issues"
+  },
+  "directories": {
+    "lib": "./lib"
+  },
+  "main": "./lib/CSSStyleDeclaration.js",
+  "dependencies": {
+    "cssom": "0.2.x"
+  },
+  "licenses": [
+    {
+      "type": "MIT",
+      "url": "http://creativecommons.org/licenses/MIT/"
+    }
+  ],
+  "readme": "CSSStyleDeclaration\n===================\n\nCSSStyleDeclaration is a work-a-like to the CSSStyleDeclaration class in Nikita Vasilyev's [CSSOM](https://github.com/NV/CSSOM). I made it so that when using [jQuery in node](https://github.com/tmtk75/node-jquery) setting css attributes via $.fn.css() would work. node-jquery uses [jsdom](https://github.com/tmpvar/jsdom) to create a DOM to use in node. jsdom uses CSSOM for styling, and CSSOM's implementation of the [CSSStyleDeclarat [...]
+  "readmeFilename": "README.md",
+  "_id": "cssstyle at 0.2.3",
+  "_from": "cssstyle@~0.2.3"
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/tests/tests.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/tests/tests.js
new file mode 100644
index 0000000..d297d8d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/cssstyle/tests/tests.js
@@ -0,0 +1,76 @@
+"use strict";
+
+var cssstyle = require('../lib/CSSStyleDeclaration');
+
+/**
+ *  These are the required properties
+ *  see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSS2Properties
+ **/
+var properties = [ 'azimuth', 'background', 'backgroundAttachment', 'backgroundColor', 'backgroundImage', 'backgroundPosition', 'backgroundRepeat', 'border', 'borderCollapse', 'borderColor', 'borderSpacing', 'borderStyle', 'borderTop', 'borderRight', 'borderBottom', 'borderLeft', 'borderTopColor', 'borderRightColor', 'borderBottomColor', 'borderLeftColor', 'borderTopStyle', 'borderRightStyle', 'borderBottomStyle', 'borderLeftStyle', 'borderTopWidth', 'borderRightWidth', 'borderBottomWidt [...]
+
+module.exports = {
+    'Verify Has Properties': function (test) {
+        var style = new cssstyle.CSSStyleDeclaration();
+        test.expect(properties.length * 2);
+        properties.forEach(function (property) {
+            test.ok(style.__lookupGetter__(property), 'missing ' + property + ' property');
+            test.ok(style.__lookupSetter__(property), 'missing ' + property + ' property');
+        });
+        test.done();
+    },
+    'Verify Has Functions': function (test) {
+        var style = new cssstyle.CSSStyleDeclaration();
+        test.expect(6);
+        test.ok(typeof style.getPropertyValue === 'function', 'missing getPropertyValue()');
+        test.ok(typeof style.getPropertyCSSValue === 'function', 'missing getPropertyCSSValue()');
+        test.ok(typeof style.removeProperty === 'function', 'missing removeProperty()');
+        test.ok(typeof style.getPropertyPriority === 'function', 'missing getPropertyPriority()');
+        test.ok(typeof style.setProperty === 'function', 'missing setProperty()');
+        test.ok(typeof style.item === 'function', 'missing item()');
+        test.done();
+    },
+    'Verify Has Special Properties': function (test) {
+        var style = new cssstyle.CSSStyleDeclaration();
+        test.expect(5);
+        test.ok(style.__lookupGetter__('cssText'), 'missing cssText getter');
+        test.ok(style.__lookupSetter__('cssText'), 'missing cssText setter');
+        test.ok(style.__lookupGetter__('length'), 'missing length getter');
+        test.ok(style.__lookupSetter__('length'), 'missing length setter');
+        test.ok(style.__lookupGetter__('parentRule'), 'missing parentRule getter');
+        test.done();
+    },
+    'Test From Style String': function (test) {
+        var style = new cssstyle.CSSStyleDeclaration();
+        test.expect(8);
+        style.cssText = 'color: blue; background-color: red; width: 78%';
+        test.ok(3 === style.length, 'length is not 3');
+        test.ok('color: blue; background-color: red; width: 78%;' === style.cssText, 'cssText is wrong');
+        test.ok('blue' === style.getPropertyValue('color'), "getPropertyValue('color') failed");
+        test.ok('color' === style.item(0), 'item(0) failed');
+        test.ok('background-color' === style[1], 'style[1] failed');
+        test.ok('red' === style.backgroundColor, 'style.backgroundColor failed with "' + style.backgroundColor + '"');
+        style.cssText = '';
+        test.ok('' === style.cssText, 'cssText is not empty');
+        test.ok(0 === style.length, 'length is not 0');
+        test.done();
+    },
+    'Test From Properties': function (test) {
+        var style = new cssstyle.CSSStyleDeclaration();
+        test.expect(11);
+        style.color = 'blue';
+        test.ok(1 === style.length, 'length is not 1');
+        test.ok('color' === style[0], 'style[0] is not color');
+        test.ok('color: blue;' === style.cssText, 'cssText is wrong');
+        test.ok('color' === style.item(0), 'item(0) is not color');
+        test.ok('blue' === style.color, 'color is not blue');
+        style.backgroundColor = 'red';
+        test.ok(2 === style.length, 'length is not 2');
+        test.ok('color' === style[0], 'style[0] is not color');
+        test.ok('background-color' === style[1], 'style[1] is not background-color');
+        test.ok('color: blue; background-color: red;' === style.cssText, 'cssText is wrong');
+        test.ok('red' === style.backgroundColor, 'backgroundColor is not red');
+        style.removeProperty('color');
+        test.ok('background-color' === style[0], 'style[0] is not background-color');
+        test.done();
+    }
+};
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/.npmignore b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/.npmignore
new file mode 100644
index 0000000..0db216b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/.npmignore
@@ -0,0 +1,2 @@
+npm-debug.log
+node_modules
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/.travis.yml b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/.travis.yml
new file mode 100644
index 0000000..d63ba09
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/.travis.yml
@@ -0,0 +1,5 @@
+language: node_js
+node_js:
+  - 0.8
+  - 0.10
+  - 0.11
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/LICENSE b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/LICENSE
new file mode 100644
index 0000000..0a35e02
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/LICENSE
@@ -0,0 +1,18 @@
+Copyright 2010, 2011, Chris Winberry <chris at winberry.net>. All rights reserved.
+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/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/README.md b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/README.md
new file mode 100644
index 0000000..9ed236d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/README.md
@@ -0,0 +1,81 @@
+#htmlparser2 [![NPM version](https://badge.fury.io/js/htmlparser2.png)](https://npmjs.org/package/htmlparser2) [![Build Status](https://secure.travis-ci.org/fb55/htmlparser2.png)](http://travis-ci.org/fb55/htmlparser2) [![Dependency Status](https://david-dm.org/fb55/htmlparser2.png)](https://david-dm.org/fb55/htmlparser2)
+
+A forgiving HTML/XML/RSS parser written in JS for NodeJS. The parser can handle streams (chunked data) and supports custom handlers for writing custom DOMs/output.
+
+##Installing
+	npm install htmlparser2
+	
+A live demo of htmlparser2 is available at http://demos.forbeslindesay.co.uk/htmlparser2/
+
+##Usage
+
+```javascript
+var htmlparser = require("htmlparser2");
+var parser = new htmlparser.Parser({
+	onopentag: function(name, attribs){
+		if(name === "script" && attribs.type === "text/javascript"){
+			console.log("JS! Hooray!");
+		}
+	},
+	ontext: function(text){
+		console.log("-->", text);
+	},
+	onclosetag: function(tagname){
+		if(tagname === "script"){
+			console.log("That's it?!");
+		}
+	}
+});
+parser.write("Xyz <script type='text/javascript'>var foo = '<<bar>>';</ script>");
+parser.end();
+```
+
+Output (simplified):
+
+```javascript
+--> Xyz 
+JS! Hooray!
+--> var foo = '<<bar>>';
+That's it?!
+```
+
+Read more about the parser in the [wiki](https://github.com/fb55/htmlparser2/wiki/Parser-options).
+
+##Get a DOM
+The `DomHandler` (known as `DefaultHandler` in the original `htmlparser` module) produces a DOM (document object model) that can be manipulated using the [`DomUtils`](https://github.com/fb55/DomUtils) helper.
+
+The `DomHandler`, while still bundled with this module, was moved to its [own module](https://github.com/fb55/domhandler). Have a look at it for further information.
+
+##Parsing RSS/RDF/Atom Feeds
+
+```javascript
+new htmlparser.FeedHandler(function(<error> error, <object> feed){
+    ...
+});
+```
+
+##Performance
+
+After having some artificial benchmarks for some time, __ at AndreasMadsen__ published his [`htmlparser-benchmark`](https://github.com/AndreasMadsen/htmlparser-benchmark), which benchmarks HTML parses based on real-world websites.
+
+At the time of writing, the latest versions of all supported parsers show the following performance characteristics on [Travis CI](https://travis-ci.org/AndreasMadsen/htmlparser-benchmark/builds/10805007) (please note that Travis doesn't guarantee equal conditions for all tests):
+
+```
+gumbo-parser   : 34.9208 ms/file ± 21.4238
+html-parser    : 24.8224 ms/file ± 15.8703
+html5          : 419.597 ms/file ± 264.265
+htmlparser     : 60.0722 ms/file ± 384.844
+htmlparser2-dom: 12.0749 ms/file ± 6.49474
+htmlparser2    : 7.49130 ms/file ± 5.74368
+hubbub         : 30.4980 ms/file ± 16.4682
+libxmljs       : 14.1338 ms/file ± 18.6541
+parse5         : 22.0439 ms/file ± 15.3743
+sax            : 49.6513 ms/file ± 26.6032
+```
+
+##How is this different from [node-htmlparser](https://github.com/tautologistics/node-htmlparser)?
+This is a fork of the `htmlparser` module. The main difference is that this is intended to be used only with node (it runs on other platforms using [browserify](https://github.com/substack/node-browserify)). `htmlparser2` was rewritten multiple times and, while it maintains an API that's compatible with `htmlparser` in most cases, the projects don't share any code anymore.
+
+The parser now provides a callback interface close to [sax.js](https://github.com/isaacs/sax-js) (originally targeted at [readabilitySAX](https://github.com/fb55/readabilitysax)). As a result, old handlers won't work anymore.
+
+The `DefaultHandler` and the `RssHandler` were renamed to clarify their purpose (to `DomHandler` and `FeedHandler`). The old names are still available when requiring `htmlparser2`, so your code should work as expected.
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/CollectingHandler.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/CollectingHandler.js
new file mode 100644
index 0000000..8d63305
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/CollectingHandler.js
@@ -0,0 +1,55 @@
+module.exports = CollectingHandler;
+
+function CollectingHandler(cbs){
+	this._cbs = cbs || {};
+	this.events = [];
+}
+
+var EVENTS = require("./").EVENTS;
+Object.keys(EVENTS).forEach(function(name){
+	if(EVENTS[name] === 0){
+		name = "on" + name;
+		CollectingHandler.prototype[name] = function(){
+			this.events.push([name]);
+			if(this._cbs[name]) this._cbs[name]();
+		};
+	} else if(EVENTS[name] === 1){
+		name = "on" + name;
+		CollectingHandler.prototype[name] = function(a){
+			this.events.push([name, a]);
+			if(this._cbs[name]) this._cbs[name](a);
+		};
+	} else if(EVENTS[name] === 2){
+		name = "on" + name;
+		CollectingHandler.prototype[name] = function(a, b){
+			this.events.push([name, a, b]);
+			if(this._cbs[name]) this._cbs[name](a, b);
+		};
+	} else {
+		throw Error("wrong number of arguments");
+	}
+});
+
+CollectingHandler.prototype.onreset = function(){
+	this.events = [];
+	if(this._cbs.onreset) this._cbs.onreset();
+};
+
+CollectingHandler.prototype.restart = function(){
+	if(this._cbs.onreset) this._cbs.onreset();
+
+	for(var i = 0, len = this.events.length; i < len; i++){
+		if(this._cbs[this.events[i][0]]){
+
+			var num = this.events[i].length;
+
+			if(num === 1){
+				this._cbs[this.events[i][0]]();
+			} else if(num === 2){
+				this._cbs[this.events[i][0]](this.events[i][1]);
+			} else {
+				this._cbs[this.events[i][0]](this.events[i][1], this.events[i][2]);
+			}
+		}
+	}
+};
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/FeedHandler.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/FeedHandler.js
new file mode 100644
index 0000000..8b7d32c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/FeedHandler.js
@@ -0,0 +1,95 @@
+var index = require("./index.js"),
+    DomHandler = index.DomHandler,
+	DomUtils = index.DomUtils;
+
+//TODO: make this a streamable handler
+function FeedHandler(callback, options){
+	this.init(callback, options);
+}
+
+require("util").inherits(FeedHandler, DomHandler);
+
+FeedHandler.prototype.init = DomHandler;
+
+function getElements(what, where){
+	return DomUtils.getElementsByTagName(what, where, true);
+}
+function getOneElement(what, where){
+	return DomUtils.getElementsByTagName(what, where, true, 1)[0];
+}
+function fetch(what, where, recurse){
+	return DomUtils.getText(
+		DomUtils.getElementsByTagName(what, where, recurse, 1)
+	).trim();
+}
+
+function addConditionally(obj, prop, what, where, recurse){
+	var tmp = fetch(what, where, recurse);
+	if(tmp) obj[prop] = tmp;
+}
+
+var isValidFeed = function(value) {
+	return value === "rss" || value === "feed" || value === "rdf:RDF";
+};
+
+FeedHandler.prototype.onend = function() {
+	var feed = {},
+		feedRoot = getOneElement(isValidFeed, this.dom),
+		tmp, childs;
+
+	if (feedRoot) {
+		if(feedRoot.name === "feed"){
+			childs = feedRoot.children;
+
+			feed.type = "atom";
+			addConditionally(feed, "id", "id", childs);
+			addConditionally(feed, "title", "title", childs);
+			if((tmp = getOneElement("link", childs)) && (tmp = tmp.attribs) && (tmp = tmp.href)) feed.link = tmp;
+			addConditionally(feed, "description", "subtitle", childs);
+			if(tmp = fetch("updated", childs)) feed.updated = new Date(tmp);
+			addConditionally(feed, "author", "email", childs, true);
+
+			feed.items = getElements("entry", childs).map(function(item){
+				var entry = {}, tmp;
+
+				item = item.children;
+
+				addConditionally(entry, "id", "id", item);
+				addConditionally(entry, "title", "title", item);
+				if((tmp = getOneElement("link", item)) && (tmp = tmp.attribs) && (tmp = tmp.href)) entry.link = tmp;
+				addConditionally(entry, "description", "summary", item);
+				if(tmp = fetch("updated", item)) entry.pubDate = new Date(tmp);
+				return entry;
+			});
+		} else{
+			childs = getOneElement("channel", feedRoot.children).children;
+
+			feed.type = feedRoot.name.substr(0, 3);
+			feed.id = "";
+			addConditionally(feed, "title", "title", childs);
+			addConditionally(feed, "link", "link", childs);
+			addConditionally(feed, "description", "description", childs);
+			if(tmp = fetch("lastBuildDate", childs)) feed.updated = new Date(tmp);
+			addConditionally(feed, "author", "managingEditor", childs, true);
+
+			feed.items = getElements("item", feedRoot.children).map(function(item){
+				var entry = {}, tmp;
+
+				item = item.children;
+
+				addConditionally(entry, "id", "guid", item);
+				addConditionally(entry, "title", "title", item);
+				addConditionally(entry, "link", "link", item);
+				addConditionally(entry, "description", "description", item);
+				if(tmp = fetch("pubDate", item)) entry.pubDate = new Date(tmp);
+				return entry;
+			});
+		}
+	}
+	this.dom = feed;
+	DomHandler.prototype._handleCallback.call(
+		this, feedRoot ? null : Error("couldn't find root of feed")
+	);
+};
+
+module.exports = FeedHandler;
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/Parser.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/Parser.js
new file mode 100644
index 0000000..e94e346
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/Parser.js
@@ -0,0 +1,314 @@
+var Tokenizer = require("./Tokenizer.js");
+
+/*
+	Options:
+
+	xmlMode: Special behavior for script/style tags (true by default)
+	lowerCaseAttributeNames: call .toLowerCase for each attribute name (true if xmlMode is `false`)
+	lowerCaseTags: call .toLowerCase for each tag name (true if xmlMode is `false`)
+*/
+
+/*
+	Callbacks:
+
+	oncdataend,
+	oncdatastart,
+	onclosetag,
+	oncomment,
+	oncommentend,
+	onerror,
+	onopentag,
+	onprocessinginstruction,
+	onreset,
+	ontext
+*/
+
+var formTags = {
+	input: true,
+	option: true,
+	optgroup: true,
+	select: true,
+	button: true,
+	datalist: true,
+	textarea: true
+};
+
+var openImpliesClose = {
+	tr      : { tr:true, th:true, td:true },
+	th      : { th:true },
+	td      : { thead:true, td:true },
+	body    : { head:true, link:true, script:true },
+	li      : { li:true },
+	p       : { p:true },
+	select  : formTags,
+	input   : formTags,
+	output  : formTags,
+	button  : formTags,
+	datalist: formTags,
+	textarea: formTags,
+	option  : { option:true },
+	optgroup: { optgroup:true }
+};
+
+var voidElements = {
+	__proto__: null,
+	area: true,
+	base: true,
+	basefont: true,
+	br: true,
+	col: true,
+	command: true,
+	embed: true,
+	frame: true,
+	hr: true,
+	img: true,
+	input: true,
+	isindex: true,
+	keygen: true,
+	link: true,
+	meta: true,
+	param: true,
+	source: true,
+	track: true,
+	wbr: true
+};
+
+var re_nameEnd = /\s|\//;
+
+function Parser(cbs, options){
+	this._options = options || {};
+	this._cbs = cbs || {};
+
+	this._tagname = "";
+	this._attribname = "";
+	this._attribvalue = "";
+	this._attribs = null;
+	this._stack = [];
+	this._done = false;
+
+	this.startIndex = 0;
+	this.endIndex = null;
+
+	this._tokenizer = new Tokenizer(options, this);
+}
+
+require("util").inherits(Parser, require("events").EventEmitter);
+
+Parser.prototype._updatePosition = function(initialOffset){
+	if(this.endIndex === null){
+		this.startIndex = this._tokenizer._sectionStart <= initialOffset ? 0 : this._tokenizer._sectionStart - initialOffset;
+	}
+	this.startIndex = this.endIndex + 1;
+	this.endIndex = this._tokenizer._index;
+};
+
+//Tokenizer event handlers
+Parser.prototype.ontext = function(data){
+	this._updatePosition(1);
+	this.endIndex--;
+
+	if(this._cbs.ontext) this._cbs.ontext(data);
+};
+
+Parser.prototype.onopentagname = function(name){
+	if(!(this._options.xmlMode || "lowerCaseTags" in this._options) || this._options.lowerCaseTags){
+		name = name.toLowerCase();
+	}
+
+	this._tagname = name;
+
+	if (!this._options.xmlMode && name in openImpliesClose) {
+		for(
+			var el;
+			(el = this._stack[this._stack.length-1]) in openImpliesClose[name];
+			this.onclosetag(el)
+		);
+	}
+
+	if(this._options.xmlMode || !(name in voidElements)){
+		this._stack.push(name);
+	}
+
+	if(this._cbs.onopentagname) this._cbs.onopentagname(name);
+	if(this._cbs.onopentag) this._attribs = {};
+};
+
+Parser.prototype.onopentagend = function(){
+	this._updatePosition(1);
+    
+	if(this._attribs){
+		if(this._cbs.onopentag) this._cbs.onopentag(this._tagname, this._attribs);
+		this._attribs = null;
+	}
+    
+	if(!this._options.xmlMode && this._cbs.onclosetag && this._tagname in voidElements){
+		this._cbs.onclosetag(this._tagname);
+	}
+    
+	this._tagname = "";
+};
+
+Parser.prototype.onclosetag = function(name){
+	this._updatePosition(1);
+
+	if(!(this._options.xmlMode || "lowerCaseTags" in this._options) || this._options.lowerCaseTags){
+		name = name.toLowerCase();
+	}
+
+	if(this._stack.length && (!(name in voidElements) || this._options.xmlMode)){
+		var pos = this._stack.lastIndexOf(name);
+		if(pos !== -1){
+			if(this._cbs.onclosetag){
+				pos = this._stack.length - pos;
+				while(pos--) this._cbs.onclosetag(this._stack.pop());
+			}
+			else this._stack.length = pos;
+		} else if(name === "p" && !this._options.xmlMode){
+			this.onopentagname(name);
+			this._closeCurrentTag();
+		}
+	} else if(!this._options.xmlMode && (name === "br" || name === "p")){
+		this.onopentagname(name);
+		this._closeCurrentTag();
+	}
+};
+
+Parser.prototype.onselfclosingtag = function(){
+	if(this._options.xmlMode){
+		this._closeCurrentTag();
+	} else {
+		this.onopentagend();
+	}
+};
+
+Parser.prototype._closeCurrentTag = function(){
+	var name = this._tagname;
+
+	this.onopentagend();
+
+	//self-closing tags will be on the top of the stack
+	//(cheaper check than in onclosetag)
+	if(this._stack[this._stack.length-1] === name){
+		if(this._cbs.onclosetag){
+			this._cbs.onclosetag(name);
+		}
+		this._stack.pop();
+	}
+};
+
+Parser.prototype.onattribname = function(name){
+	if(!(this._options.xmlMode || "lowerCaseAttributeNames" in this._options) || this._options.lowerCaseAttributeNames){
+		name = name.toLowerCase();
+	}
+	this._attribname = name;
+};
+
+Parser.prototype.onattribdata = function(value){
+	this._attribvalue += value;
+};
+
+Parser.prototype.onattribend = function(){
+	if(this._cbs.onattribute) this._cbs.onattribute(this._attribname, this._attribvalue);
+	if(
+		this._attribs &&
+		!Object.prototype.hasOwnProperty.call(this._attribs, this._attribname)
+	){
+		this._attribs[this._attribname] = this._attribvalue;
+	}
+	this._attribname = "";
+	this._attribvalue = "";
+};
+
+Parser.prototype.ondeclaration = function(value){
+	if(this._cbs.onprocessinginstruction){
+		var idx = value.search(re_nameEnd),
+		    name = idx < 0 ? value : value.substr(0, idx);
+
+		if(!(this._options.xmlMode || "lowerCaseTags" in this._options) || this._options.lowerCaseTags){
+			name = name.toLowerCase();
+		}
+		this._cbs.onprocessinginstruction("!" + name, "!" + value);
+	}
+};
+
+Parser.prototype.onprocessinginstruction = function(value){
+	if(this._cbs.onprocessinginstruction){
+		var idx = value.search(re_nameEnd),
+		    name = idx < 0 ? value : value.substr(0, idx);
+
+		if(!(this._options.xmlMode || "lowerCaseTags" in this._options) || this._options.lowerCaseTags){
+			name = name.toLowerCase();
+		}
+		this._cbs.onprocessinginstruction("?" + name, "?" + value);
+	}
+};
+
+Parser.prototype.oncomment = function(value){
+	this._updatePosition(4);
+
+	if(this._cbs.oncomment) this._cbs.oncomment(value);
+	if(this._cbs.oncommentend) this._cbs.oncommentend();
+};
+
+Parser.prototype.oncdata = function(value){
+	this._updatePosition(1);
+
+	if(this._options.xmlMode){
+		if(this._cbs.oncdatastart) this._cbs.oncdatastart();
+		if(this._cbs.ontext) this._cbs.ontext(value);
+		if(this._cbs.oncdataend) this._cbs.oncdataend();
+	} else {
+		this.oncomment("[CDATA[" + value + "]]");
+	}
+};
+
+Parser.prototype.onerror = function(err){
+	if(this._cbs.onerror) this._cbs.onerror(err);
+};
+
+Parser.prototype.onend = function(){
+	if(this._cbs.onclosetag){
+		for(
+			var i = this._stack.length;
+			i > 0;
+			this._cbs.onclosetag(this._stack[--i])
+		);
+	}
+	if(this._cbs.onend) this._cbs.onend();
+};
+
+
+//Resets the parser to a blank state, ready to parse a new HTML document
+Parser.prototype.reset = function(){
+	if(this._cbs.onreset) this._cbs.onreset();
+	this._tokenizer.reset();
+
+	this._tagname = "";
+	this._attribname = "";
+	this._attribs = null;
+	this._stack = [];
+	this._done = false;
+};
+
+//Parses a complete HTML document and pushes it to the handler
+Parser.prototype.parseComplete = function(data){
+	this.reset();
+	this.end(data);
+};
+
+Parser.prototype.write = function(chunk){
+	if(this._done) this.onerror(Error(".write() after done!"));
+	this._tokenizer.write(chunk);
+};
+
+Parser.prototype.end = function(chunk){
+	if(this._done) this.onerror(Error(".end() after done!"));
+	this._tokenizer.end(chunk);
+	this._done = true;
+};
+
+//alias for backwards compat
+Parser.prototype.parseChunk = Parser.prototype.write;
+Parser.prototype.done = Parser.prototype.end;
+
+module.exports = Parser;
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/ProxyHandler.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/ProxyHandler.js
new file mode 100644
index 0000000..1f9f38a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/ProxyHandler.js
@@ -0,0 +1,27 @@
+module.exports = ProxyHandler;
+
+var ProxyHandler = function(cbs){
+	this._cbs = cbs || {};
+};
+
+var EVENTS = require("./").EVENTS;
+Object.keys(EVENTS).forEach(function(name){
+	if(EVENTS[name] === 0){
+		name = "on" + name;
+		ProxyHandler.prototype[name] = function(){
+			if(this._cbs[name]) this._cbs[name]();
+		};
+	} else if(EVENTS[name] === 1){
+		name = "on" + name;
+		ProxyHandler.prototype[name] = function(a){
+			if(this._cbs[name]) this._cbs[name](a);
+		};
+	} else if(EVENTS[name] === 2){
+		name = "on" + name;
+		ProxyHandler.prototype[name] = function(a, b){
+			if(this._cbs[name]) this._cbs[name](a, b);
+		};
+	} else {
+		throw Error("wrong number of arguments");
+	}
+});
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/Stream.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/Stream.js
new file mode 100644
index 0000000..29a819b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/Stream.js
@@ -0,0 +1,35 @@
+module.exports = Stream;
+
+var Parser = require("./WritableStream.js");
+
+function Stream(options){
+	Parser.call(this, new Cbs(this), options);
+}
+
+require("util").inherits(Stream, Parser);
+
+Stream.prototype.readable = true;
+
+function Cbs(scope){
+	this.scope = scope;
+}
+
+var EVENTS = require("../").EVENTS;
+
+Object.keys(EVENTS).forEach(function(name){
+	if(EVENTS[name] === 0){
+		Cbs.prototype["on" + name] = function(){
+			this.scope.emit(name);
+		};
+	} else if(EVENTS[name] === 1){
+		Cbs.prototype["on" + name] = function(a){
+			this.scope.emit(name, a);
+		};
+	} else if(EVENTS[name] === 2){
+		Cbs.prototype["on" + name] = function(a, b){
+			this.scope.emit(name, a, b);
+		};
+	} else {
+		throw Error("wrong number of arguments!");
+	}
+});
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/Tokenizer.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/Tokenizer.js
new file mode 100644
index 0000000..ef98766
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/Tokenizer.js
@@ -0,0 +1,876 @@
+module.exports = Tokenizer;
+
+var entityMap = require("./entities/entities.json"),
+    legacyMap = require("./entities/legacy.json"),
+    xmlMap    = require("./entities/xml.json"),
+    decodeMap = require("./entities/decode.json"),
+
+    i = 0,
+
+    TEXT                      = i++,
+    BEFORE_TAG_NAME           = i++, //after <
+    IN_TAG_NAME               = i++,
+    IN_SELF_CLOSING_TAG       = i++,
+    BEFORE_CLOSING_TAG_NAME   = i++,
+    IN_CLOSING_TAG_NAME       = i++,
+    AFTER_CLOSING_TAG_NAME    = i++,
+
+    //attributes
+    BEFORE_ATTRIBUTE_NAME     = i++,
+    IN_ATTRIBUTE_NAME         = i++,
+    AFTER_ATTRIBUTE_NAME      = i++,
+    BEFORE_ATTRIBUTE_VALUE    = i++,
+    IN_ATTRIBUTE_VALUE_DQ     = i++, // "
+    IN_ATTRIBUTE_VALUE_SQ     = i++, // '
+    IN_ATTRIBUTE_VALUE_NQ     = i++,
+
+    //declarations
+    BEFORE_DECLARATION        = i++, // !
+    IN_DECLARATION            = i++,
+
+    //processing instructions
+    IN_PROCESSING_INSTRUCTION = i++, // ?
+
+    //comments
+    BEFORE_COMMENT            = i++,
+    IN_COMMENT                = i++,
+    AFTER_COMMENT_1           = i++,
+    AFTER_COMMENT_2           = i++,
+
+    //cdata
+    BEFORE_CDATA_1            = i++, // [
+    BEFORE_CDATA_2            = i++, // C
+    BEFORE_CDATA_3            = i++, // D
+    BEFORE_CDATA_4            = i++, // A
+    BEFORE_CDATA_5            = i++, // T
+    BEFORE_CDATA_6            = i++, // A
+    IN_CDATA                  = i++,// [
+    AFTER_CDATA_1             = i++, // ]
+    AFTER_CDATA_2             = i++, // ]
+
+    //special tags
+    BEFORE_SPECIAL            = i++, //S
+    BEFORE_SPECIAL_END        = i++,   //S
+
+    BEFORE_SCRIPT_1           = i++, //C
+    BEFORE_SCRIPT_2           = i++, //R
+    BEFORE_SCRIPT_3           = i++, //I
+    BEFORE_SCRIPT_4           = i++, //P
+    BEFORE_SCRIPT_5           = i++, //T
+    AFTER_SCRIPT_1            = i++, //C
+    AFTER_SCRIPT_2            = i++, //R
+    AFTER_SCRIPT_3            = i++, //I
+    AFTER_SCRIPT_4            = i++, //P
+    AFTER_SCRIPT_5            = i++, //T
+
+    BEFORE_STYLE_1            = i++, //T
+    BEFORE_STYLE_2            = i++, //Y
+    BEFORE_STYLE_3            = i++, //L
+    BEFORE_STYLE_4            = i++, //E
+    AFTER_STYLE_1             = i++, //T
+    AFTER_STYLE_2             = i++, //Y
+    AFTER_STYLE_3             = i++, //L
+    AFTER_STYLE_4             = i++, //E
+
+    BEFORE_ENTITY             = i++, //&
+    BEFORE_NUMERIC_ENTITY     = i++, //#
+    IN_NAMED_ENTITY           = i++,
+    IN_NUMERIC_ENTITY         = i++,
+    IN_HEX_ENTITY             = i++, //X
+
+    j = 0,
+
+    SPECIAL_NONE              = j++,
+    SPECIAL_SCRIPT            = j++,
+    SPECIAL_STYLE             = j++;
+
+function whitespace(c){
+	return c === " " || c === "\n" || c === "\t" || c === "\f" || c === "\r";
+}
+
+function ifElseState(upper, SUCCESS, FAILURE){
+	var lower = upper.toLowerCase();
+
+	if(upper === lower){
+		return function(c){
+			this._state = c === lower ? SUCCESS : FAILURE;
+		};
+	} else {
+		return function(c){
+			this._state = (c === lower || c === upper) ? SUCCESS : FAILURE;
+		};
+	}
+}
+
+function consumeSpecialNameChar(upper, NEXT_STATE){
+	var lower = upper.toLowerCase();
+
+	return function(c){
+		if(c === lower || c === upper){
+			this._state = NEXT_STATE;
+		} else {
+			this._state = IN_TAG_NAME;
+			this._index--; //consume the token again
+		}
+	};
+}
+
+function Tokenizer(options, cbs){
+	this._state = TEXT;
+	this._buffer = "";
+	this._sectionStart = 0;
+	this._index = 0;
+	this._baseState = TEXT;
+	this._special = SPECIAL_NONE;
+	this._cbs = cbs;
+	this._running = true;
+	this._xmlMode = !!(options && options.xmlMode);
+	this._decodeEntities = !!(options && options.decodeEntities);
+}
+
+Tokenizer.prototype._stateText = function(c){
+	if(c === "<"){
+		if(this._index > this._sectionStart){
+			this._cbs.ontext(this._getSection());
+		}
+		this._state = BEFORE_TAG_NAME;
+		this._sectionStart = this._index;
+	} else if(this._decodeEntities && this._special === SPECIAL_NONE && c === "&"){
+		if(this._index > this._sectionStart){
+			this._cbs.ontext(this._getSection());
+		}
+		this._baseState = TEXT;
+		this._state = BEFORE_ENTITY;
+		this._sectionStart = this._index;
+	}
+};
+
+Tokenizer.prototype._stateBeforeTagName = function(c){
+	if(c === "/"){
+		this._state = BEFORE_CLOSING_TAG_NAME;
+	} else if(c === ">" || this._special !== SPECIAL_NONE || whitespace(c)) {
+		this._state = TEXT;
+	} else if(c === "!"){
+		this._state = BEFORE_DECLARATION;
+		this._sectionStart = this._index + 1;
+	} else if(c === "?"){
+		this._state = IN_PROCESSING_INSTRUCTION;
+		this._sectionStart = this._index + 1;
+	} else if(c === "<"){
+		this._cbs.ontext(this._getSection());
+		this._sectionStart = this._index;
+	} else {
+		this._state = (!this._xmlMode && (c === "s" || c === "S")) ?
+						BEFORE_SPECIAL : IN_TAG_NAME;
+		this._sectionStart = this._index;
+	}
+};
+
+Tokenizer.prototype._stateInTagName = function(c){
+	if(c === "/" || c === ">" || whitespace(c)){
+		this._emitToken("onopentagname");
+		this._state = BEFORE_ATTRIBUTE_NAME;
+		this._index--;
+	}
+};
+
+Tokenizer.prototype._stateBeforeCloseingTagName = function(c){
+	if(whitespace(c));
+	else if(c === ">"){
+		this._state = TEXT;
+	} else if(this._special !== SPECIAL_NONE){
+		if(c === "s" || c === "S"){
+			this._state = BEFORE_SPECIAL_END;
+		} else {
+			this._state = TEXT;
+			this._index--;
+		}
+	} else {
+		this._state = IN_CLOSING_TAG_NAME;
+		this._sectionStart = this._index;
+	}
+};
+
+Tokenizer.prototype._stateInCloseingTagName = function(c){
+	if(c === ">" || whitespace(c)){
+		this._emitToken("onclosetag");
+		this._state = AFTER_CLOSING_TAG_NAME;
+		this._index--;
+	}
+};
+
+Tokenizer.prototype._stateAfterCloseingTagName = function(c){
+	//skip everything until ">"
+	if(c === ">"){
+		this._state = TEXT;
+		this._sectionStart = this._index + 1;
+	}
+};
+
+Tokenizer.prototype._stateBeforeAttributeName = function(c){
+	if(c === ">"){
+		this._cbs.onopentagend();
+		this._state = TEXT;
+		this._sectionStart = this._index + 1;
+	} else if(c === "/"){
+		this._state = IN_SELF_CLOSING_TAG;
+	} else if(!whitespace(c)){
+		this._state = IN_ATTRIBUTE_NAME;
+		this._sectionStart = this._index;
+	}
+};
+
+Tokenizer.prototype._stateInSelfClosingTag = function(c){
+	if(c === ">"){
+		this._cbs.onselfclosingtag();
+		this._state = TEXT;
+		this._sectionStart = this._index + 1;
+	} else if(!whitespace(c)){
+		this._state = BEFORE_ATTRIBUTE_NAME;
+		this._index--;
+	}
+};
+
+Tokenizer.prototype._stateInAttributeName = function(c){
+	if(c === "=" || c === "/" || c === ">" || whitespace(c)){
+		if(this._index > this._sectionStart){
+			this._cbs.onattribname(this._getSection());
+		}
+		this._sectionStart = -1;
+		this._state = AFTER_ATTRIBUTE_NAME;
+		this._index--;
+	}
+};
+
+Tokenizer.prototype._stateAfterAttributeName = function(c){
+	if(c === "="){
+		this._state = BEFORE_ATTRIBUTE_VALUE;
+	} else if(c === "/" || c === ">"){
+		this._cbs.onattribend();
+		this._state = BEFORE_ATTRIBUTE_NAME;
+		this._index--;
+	} else if(!whitespace(c)){
+		this._cbs.onattribend();
+		this._state = IN_ATTRIBUTE_NAME;
+		this._sectionStart = this._index;
+	}
+};
+
+Tokenizer.prototype._stateBeforeAttributeValue = function(c){
+	if(c === "\""){
+		this._state = IN_ATTRIBUTE_VALUE_DQ;
+		this._sectionStart = this._index + 1;
+	} else if(c === "'"){
+		this._state = IN_ATTRIBUTE_VALUE_SQ;
+		this._sectionStart = this._index + 1;
+	} else if(!whitespace(c)){
+		this._state = IN_ATTRIBUTE_VALUE_NQ;
+		this._sectionStart = this._index;
+	}
+};
+
+Tokenizer.prototype._stateInAttributeValueDoubleQuotes = function(c){
+	if(c === "\""){
+		this._emitToken("onattribdata");
+		this._cbs.onattribend();
+		this._state = BEFORE_ATTRIBUTE_NAME;
+	} else if(this._decodeEntities && c === "&"){
+		this._emitToken("onattribdata");
+		this._baseState = this._state;
+		this._state = BEFORE_ENTITY;
+		this._sectionStart = this._index;
+	}
+};
+
+Tokenizer.prototype._stateInAttributeValueSingleQuotes = function(c){
+	if(c === "'"){
+		this._emitToken("onattribdata");
+		this._cbs.onattribend();
+		this._state = BEFORE_ATTRIBUTE_NAME;
+	} else if(this._decodeEntities && c === "&"){
+		this._emitToken("onattribdata");
+		this._baseState = this._state;
+		this._state = BEFORE_ENTITY;
+		this._sectionStart = this._index;
+	}
+};
+
+Tokenizer.prototype._stateInAttributeValueNoQuotes = function(c){
+	if(whitespace(c) || c === ">"){
+		this._emitToken("onattribdata");
+		this._cbs.onattribend();
+		this._state = BEFORE_ATTRIBUTE_NAME;
+		this._index--;
+	} else if(this._decodeEntities && c === "&"){
+		this._emitToken("onattribdata");
+		this._baseState = this._state;
+		this._state = BEFORE_ENTITY;
+		this._sectionStart = this._index;
+	}
+};
+
+Tokenizer.prototype._stateBeforeDeclaration = function(c){
+	this._state = c === "[" ? BEFORE_CDATA_1 :
+					c === "-" ? BEFORE_COMMENT :
+						IN_DECLARATION;
+};
+
+Tokenizer.prototype._stateInDeclaration = function(c){
+	if(c === ">"){
+		this._cbs.ondeclaration(this._getSection());
+		this._state = TEXT;
+		this._sectionStart = this._index + 1;
+	}
+};
+
+Tokenizer.prototype._stateInProcessingInstruction = function(c){
+	if(c === ">"){
+		this._cbs.onprocessinginstruction(this._getSection());
+		this._state = TEXT;
+		this._sectionStart = this._index + 1;
+	}
+};
+
+Tokenizer.prototype._stateBeforeComment = function(c){
+	if(c === "-"){
+		this._state = IN_COMMENT;
+		this._sectionStart = this._index + 1;
+	} else {
+		this._state = IN_DECLARATION;
+	}
+};
+
+Tokenizer.prototype._stateInComment = function(c){
+	if(c === "-") this._state = AFTER_COMMENT_1;
+};
+
+Tokenizer.prototype._stateAfterComment1 = ifElseState("-", AFTER_COMMENT_2, IN_COMMENT);
+
+Tokenizer.prototype._stateAfterComment2 = function(c){
+	if(c === ">"){
+		//remove 2 trailing chars
+		this._cbs.oncomment(this._buffer.substring(this._sectionStart, this._index - 2));
+		this._state = TEXT;
+		this._sectionStart = this._index + 1;
+	} else if(c !== "-"){
+		this._state = IN_COMMENT;
+	}
+	// else: stay in AFTER_COMMENT_2 (`--->`)
+};
+
+Tokenizer.prototype._stateBeforeCdata1 = ifElseState("C", BEFORE_CDATA_2, IN_DECLARATION);
+Tokenizer.prototype._stateBeforeCdata2 = ifElseState("D", BEFORE_CDATA_3, IN_DECLARATION);
+Tokenizer.prototype._stateBeforeCdata3 = ifElseState("A", BEFORE_CDATA_4, IN_DECLARATION);
+Tokenizer.prototype._stateBeforeCdata4 = ifElseState("T", BEFORE_CDATA_5, IN_DECLARATION);
+Tokenizer.prototype._stateBeforeCdata5 = ifElseState("A", BEFORE_CDATA_6, IN_DECLARATION);
+
+Tokenizer.prototype._stateBeforeCdata6 = function(c){
+	if(c === "["){
+		this._state = IN_CDATA;
+		this._sectionStart = this._index + 1;
+	} else {
+		this._state = IN_DECLARATION;
+	}
+};
+
+Tokenizer.prototype._stateInCdata = function(c){
+	if(c === "]") this._state = AFTER_CDATA_1;
+};
+
+Tokenizer.prototype._stateAfterCdata1 = ifElseState("]", AFTER_CDATA_2, IN_CDATA);
+
+Tokenizer.prototype._stateAfterCdata2 = function(c){
+	if(c === ">"){
+		//remove 2 trailing chars
+		this._cbs.oncdata(this._buffer.substring(this._sectionStart, this._index - 2));
+		this._state = TEXT;
+		this._sectionStart = this._index + 1;
+	} else if (c !== "]") {
+		this._state = IN_CDATA;
+	}
+	//else: stay in AFTER_CDATA_2 (`]]]>`)
+};
+
+Tokenizer.prototype._stateBeforeSpecial = function(c){
+	if(c === "c" || c === "C"){
+		this._state = BEFORE_SCRIPT_1;
+	} else if(c === "t" || c === "T"){
+		this._state = BEFORE_STYLE_1;
+	} else {
+		this._state = IN_TAG_NAME;
+		this._index--; //consume the token again
+	}
+};
+
+Tokenizer.prototype._stateBeforeSpecialEnd = function(c){
+	if(this._special === SPECIAL_SCRIPT && (c === "c" || c === "C")){
+		this._state = AFTER_SCRIPT_1;
+	} else if(this._special === SPECIAL_STYLE && (c === "t" || c === "T")){
+		this._state = AFTER_STYLE_1;
+	}
+	else this._state = TEXT;
+};
+
+Tokenizer.prototype._stateBeforeScript1 = consumeSpecialNameChar("R", BEFORE_SCRIPT_2);
+Tokenizer.prototype._stateBeforeScript2 = consumeSpecialNameChar("I", BEFORE_SCRIPT_3);
+Tokenizer.prototype._stateBeforeScript3 = consumeSpecialNameChar("P", BEFORE_SCRIPT_4);
+Tokenizer.prototype._stateBeforeScript4 = consumeSpecialNameChar("T", BEFORE_SCRIPT_5);
+
+Tokenizer.prototype._stateBeforeScript5 = function(c){
+	if(c === "/" || c === ">" || whitespace(c)){
+		this._special = SPECIAL_SCRIPT;
+	}
+	this._state = IN_TAG_NAME;
+	this._index--; //consume the token again
+};
+
+Tokenizer.prototype._stateAfterScript1 = ifElseState("R", AFTER_SCRIPT_2, TEXT);
+Tokenizer.prototype._stateAfterScript2 = ifElseState("I", AFTER_SCRIPT_3, TEXT);
+Tokenizer.prototype._stateAfterScript3 = ifElseState("P", AFTER_SCRIPT_4, TEXT);
+Tokenizer.prototype._stateAfterScript4 = ifElseState("T", AFTER_SCRIPT_5, TEXT);
+
+Tokenizer.prototype._stateAfterScript5 = function(c){
+	if(c === ">" || whitespace(c)){
+		this._special = SPECIAL_NONE;
+		this._state = IN_CLOSING_TAG_NAME;
+		this._sectionStart = this._index - 6;
+		this._index--; //reconsume the token
+	}
+	else this._state = TEXT;
+};
+
+Tokenizer.prototype._stateBeforeStyle1 = consumeSpecialNameChar("Y", BEFORE_STYLE_2);
+Tokenizer.prototype._stateBeforeStyle2 = consumeSpecialNameChar("L", BEFORE_STYLE_3);
+Tokenizer.prototype._stateBeforeStyle3 = consumeSpecialNameChar("E", BEFORE_STYLE_4);
+
+Tokenizer.prototype._stateBeforeStyle4 = function(c){
+	if(c === "/" || c === ">" || whitespace(c)){
+		this._special = SPECIAL_STYLE;
+	}
+	this._state = IN_TAG_NAME;
+	this._index--; //consume the token again
+};
+
+Tokenizer.prototype._stateAfterStyle1 = ifElseState("Y", AFTER_STYLE_2, TEXT);
+Tokenizer.prototype._stateAfterStyle2 = ifElseState("L", AFTER_STYLE_3, TEXT);
+Tokenizer.prototype._stateAfterStyle3 = ifElseState("E", AFTER_STYLE_4, TEXT);
+
+Tokenizer.prototype._stateAfterStyle4 = function(c){
+	if(c === ">" || whitespace(c)){
+		this._special = SPECIAL_NONE;
+		this._state = IN_CLOSING_TAG_NAME;
+		this._sectionStart = this._index - 5;
+		this._index--; //reconsume the token
+	}
+	else this._state = TEXT;
+};
+
+Tokenizer.prototype._stateBeforeEntity = ifElseState("#", BEFORE_NUMERIC_ENTITY, IN_NAMED_ENTITY);
+Tokenizer.prototype._stateBeforeNumericEntity = ifElseState("X", IN_HEX_ENTITY, IN_NUMERIC_ENTITY);
+
+//for entities within attributes
+Tokenizer.prototype._parseNamedEntityStrict = function(){
+	//offset = 1
+	if(this._sectionStart + 1 < this._index){
+		var entity = this._buffer.substring(this._sectionStart + 1, this._index),
+		    map = this._xmlMode ? xmlMap : entityMap;
+
+		if(map.hasOwnProperty(entity)){
+			this._emitPartial(map[entity]);
+			this._sectionStart = this._index + 1;
+		}
+	}
+};
+
+
+//parses legacy entities (without trailing semicolon)
+Tokenizer.prototype._parseLegacyEntity = function(){
+	var start = this._sectionStart + 1,
+	    limit = this._index - start;
+
+	if(limit > 6) limit = 6; //the max length of legacy entities is 6
+
+	while(limit >= 2){ //the min length of legacy entities is 2
+		var entity = this._buffer.substr(start, limit);
+
+		if(legacyMap.hasOwnProperty(entity)){
+			this._emitPartial(legacyMap[entity]);
+			this._sectionStart += limit + 2;
+			break;
+		} else {
+			limit--;
+		}
+	}
+};
+
+Tokenizer.prototype._stateInNamedEntity = function(c){
+	if(c === ";"){
+		this._parseNamedEntityStrict();
+		if(this._sectionStart + 1 < this._index && !this._xmlMode){
+			this._parseLegacyEntity();
+		}
+		this._state = this._baseState;
+	} else if((c < "a" || c > "z") && (c < "A" || c > "Z") && (c < "0" || c > "9")){
+		if(this._xmlMode);
+		else if(this._baseState !== TEXT){
+			if(c !== "="){
+				this._parseNamedEntityStrict();
+				this._sectionStart--; //include the current character in the section
+			}
+		} else {
+			this._parseLegacyEntity();
+			this._sectionStart--;
+		}
+		this._state = this._baseState;
+		this._index--;
+	}
+};
+
+// modified version of https://github.com/mathiasbynens/he/blob/master/src/he.js#L94-L119
+function decodeCodePoint(codePoint){
+	var output = "";
+
+	if((codePoint >= 0xD800 && codePoint <= 0xDFFF) || codePoint > 0x10FFFF){
+		return "\uFFFD";
+	}
+
+	if(codePoint in decodeMap){
+		codePoint = decodeMap[codePoint];
+	}
+
+	if(codePoint > 0xFFFF){
+		codePoint -= 0x10000;
+		output += String.fromCharCode(codePoint >>> 10 & 0x3FF | 0xD800);
+		codePoint = 0xDC00 | codePoint & 0x3FF;
+	}
+
+	output += String.fromCharCode(codePoint);
+	return output;
+}
+
+Tokenizer.prototype._decodeNumericEntity = function(offset, base){
+	var sectionStart = this._sectionStart + offset;
+
+	if(sectionStart !== this._index){
+		//parse entity
+		var entity = this._buffer.substring(sectionStart, this._index);
+		var parsed = parseInt(entity, base);
+
+		if(parsed === parsed){ //not NaN (TODO: when can this happen?)
+			this._emitPartial(decodeCodePoint(parsed));
+			this._sectionStart = this._index;
+		}
+	}
+
+	this._state = this._baseState;
+};
+
+Tokenizer.prototype._stateInNumericEntity = function(c){
+	if(c === ";"){
+		this._decodeNumericEntity(2, 10);
+		this._sectionStart++;
+	} else if(c < "0" || c > "9"){
+		if(!this._xmlMode){
+			this._decodeNumericEntity(2, 10);
+		} else {
+			this._state = this._baseState;
+		}
+		this._index--;
+	}
+};
+
+Tokenizer.prototype._stateInHexEntity = function(c){
+	if(c === ";"){
+		this._decodeNumericEntity(3, 16);
+		this._sectionStart++;
+	} else if((c < "a" || c > "f") && (c < "A" || c > "F") && (c < "0" || c > "9")){
+		if(!this._xmlMode){
+			this._decodeNumericEntity(3, 16);
+		} else {
+			this._state = this._baseState;
+		}
+		this._index--;
+	}
+};
+
+Tokenizer.prototype._cleanup = function () {
+	if(this._sectionStart < 0){
+		this._buffer = "";
+		this._index = 0;
+	} else {
+		if(this._state === TEXT){
+			if(this._sectionStart !== this._index){
+				this._cbs.ontext(this._buffer.substr(this._sectionStart));
+			}
+			this._buffer = "";
+			this._index = 0;
+		} else if(this._sectionStart === this._index){
+			//the section just started
+			this._buffer = "";
+			this._index = 0;
+		} else {
+			//remove everything unnecessary
+			this._buffer = this._buffer.substr(this._sectionStart);
+			this._index -= this._sectionStart;
+		}
+
+		this._sectionStart = 0;
+	}
+};
+
+//TODO make events conditional
+Tokenizer.prototype.write = function(chunk){
+	this._buffer += chunk;
+
+	while(this._index < this._buffer.length && this._running){
+		var c = this._buffer.charAt(this._index);
+		if(this._state === TEXT) {
+			this._stateText(c);
+		} else if(this._state === BEFORE_TAG_NAME){
+			this._stateBeforeTagName(c);
+		} else if(this._state === IN_TAG_NAME) {
+			this._stateInTagName(c);
+		} else if(this._state === BEFORE_CLOSING_TAG_NAME){
+			this._stateBeforeCloseingTagName(c);
+		} else if(this._state === IN_CLOSING_TAG_NAME){
+			this._stateInCloseingTagName(c);
+		} else if(this._state === AFTER_CLOSING_TAG_NAME){
+			this._stateAfterCloseingTagName(c);
+		} else if(this._state === IN_SELF_CLOSING_TAG){
+			this._stateInSelfClosingTag(c);
+		}
+
+		/*
+		*	attributes
+		*/
+		else if(this._state === BEFORE_ATTRIBUTE_NAME){
+			this._stateBeforeAttributeName(c);
+		} else if(this._state === IN_ATTRIBUTE_NAME){
+			this._stateInAttributeName(c);
+		} else if(this._state === AFTER_ATTRIBUTE_NAME){
+			this._stateAfterAttributeName(c);
+		} else if(this._state === BEFORE_ATTRIBUTE_VALUE){
+			this._stateBeforeAttributeValue(c);
+		} else if(this._state === IN_ATTRIBUTE_VALUE_DQ){
+			this._stateInAttributeValueDoubleQuotes(c);
+		} else if(this._state === IN_ATTRIBUTE_VALUE_SQ){
+			this._stateInAttributeValueSingleQuotes(c);
+		} else if(this._state === IN_ATTRIBUTE_VALUE_NQ){
+			this._stateInAttributeValueNoQuotes(c);
+		}
+
+		/*
+		*	declarations
+		*/
+		else if(this._state === BEFORE_DECLARATION){
+			this._stateBeforeDeclaration(c);
+		} else if(this._state === IN_DECLARATION){
+			this._stateInDeclaration(c);
+		}
+
+		/*
+		*	processing instructions
+		*/
+		else if(this._state === IN_PROCESSING_INSTRUCTION){
+			this._stateInProcessingInstruction(c);
+		}
+
+		/*
+		*	comments
+		*/
+		else if(this._state === BEFORE_COMMENT){
+			this._stateBeforeComment(c);
+		} else if(this._state === IN_COMMENT){
+			this._stateInComment(c);
+		} else if(this._state === AFTER_COMMENT_1){
+			this._stateAfterComment1(c);
+		} else if(this._state === AFTER_COMMENT_2){
+			this._stateAfterComment2(c);
+		}
+
+		/*
+		*	cdata
+		*/
+		else if(this._state === BEFORE_CDATA_1){
+			this._stateBeforeCdata1(c);
+		} else if(this._state === BEFORE_CDATA_2){
+			this._stateBeforeCdata2(c);
+		} else if(this._state === BEFORE_CDATA_3){
+			this._stateBeforeCdata3(c);
+		} else if(this._state === BEFORE_CDATA_4){
+			this._stateBeforeCdata4(c);
+		} else if(this._state === BEFORE_CDATA_5){
+			this._stateBeforeCdata5(c);
+		} else if(this._state === BEFORE_CDATA_6){
+			this._stateBeforeCdata6(c);
+		} else if(this._state === IN_CDATA){
+			this._stateInCdata(c);
+		} else if(this._state === AFTER_CDATA_1){
+			this._stateAfterCdata1(c);
+		} else if(this._state === AFTER_CDATA_2){
+			this._stateAfterCdata2(c);
+		}
+
+		/*
+		* special tags
+		*/
+		else if(this._state === BEFORE_SPECIAL){
+			this._stateBeforeSpecial(c);
+		} else if(this._state === BEFORE_SPECIAL_END){
+			this._stateBeforeSpecialEnd(c);
+		}
+
+		/*
+		* script
+		*/
+		else if(this._state === BEFORE_SCRIPT_1){
+			this._stateBeforeScript1(c);
+		} else if(this._state === BEFORE_SCRIPT_2){
+			this._stateBeforeScript2(c);
+		} else if(this._state === BEFORE_SCRIPT_3){
+			this._stateBeforeScript3(c);
+		} else if(this._state === BEFORE_SCRIPT_4){
+			this._stateBeforeScript4(c);
+		} else if(this._state === BEFORE_SCRIPT_5){
+			this._stateBeforeScript5(c);
+		}
+
+		else if(this._state === AFTER_SCRIPT_1){
+			this._stateAfterScript1(c);
+		} else if(this._state === AFTER_SCRIPT_2){
+			this._stateAfterScript2(c);
+		} else if(this._state === AFTER_SCRIPT_3){
+			this._stateAfterScript3(c);
+		} else if(this._state === AFTER_SCRIPT_4){
+			this._stateAfterScript4(c);
+		} else if(this._state === AFTER_SCRIPT_5){
+			this._stateAfterScript5(c);
+		}
+
+		/*
+		* style
+		*/
+		else if(this._state === BEFORE_STYLE_1){
+			this._stateBeforeStyle1(c);
+		} else if(this._state === BEFORE_STYLE_2){
+			this._stateBeforeStyle2(c);
+		} else if(this._state === BEFORE_STYLE_3){
+			this._stateBeforeStyle3(c);
+		} else if(this._state === BEFORE_STYLE_4){
+			this._stateBeforeStyle4(c);
+		}
+
+		else if(this._state === AFTER_STYLE_1){
+			this._stateAfterStyle1(c);
+		} else if(this._state === AFTER_STYLE_2){
+			this._stateAfterStyle2(c);
+		} else if(this._state === AFTER_STYLE_3){
+			this._stateAfterStyle3(c);
+		} else if(this._state === AFTER_STYLE_4){
+			this._stateAfterStyle4(c);
+		}
+
+		/*
+		* entities
+		*/
+		else if(this._state === BEFORE_ENTITY){
+			this._stateBeforeEntity(c);
+		} else if(this._state === BEFORE_NUMERIC_ENTITY){
+			this._stateBeforeNumericEntity(c);
+		} else if(this._state === IN_NAMED_ENTITY){
+			this._stateInNamedEntity(c);
+		} else if(this._state === IN_NUMERIC_ENTITY){
+			this._stateInNumericEntity(c);
+		} else if(this._state === IN_HEX_ENTITY){
+			this._stateInHexEntity(c);
+		}
+
+		else {
+			this._cbs.onerror(Error("unknown _state"), this._state);
+		}
+
+		this._index++;
+	}
+
+	this._cleanup();
+};
+
+Tokenizer.prototype.pause = function(){
+	this._running = false;
+};
+Tokenizer.prototype.resume = function(){
+	this._running = true;
+};
+
+Tokenizer.prototype.end = function(chunk){
+	if(chunk) this.write(chunk);
+
+	//if there is remaining data, emit it in a reasonable way
+	if(this._sectionStart < this._index){
+		this._handleTrailingData();
+	}
+
+	this._cbs.onend();
+};
+
+Tokenizer.prototype._handleTrailingData = function(){
+	var data = this._buffer.substr(this._sectionStart);
+
+	if(this._state === IN_CDATA || this._state === AFTER_CDATA_1 || this._state === AFTER_CDATA_2){
+		this._cbs.oncdata(data);
+	} else if(this._state === IN_COMMENT || this._state === AFTER_COMMENT_1 || this._state === AFTER_COMMENT_2){
+		this._cbs.oncomment(data);
+	} else if(this._state === IN_TAG_NAME){
+		this._cbs.onopentagname(data);
+	} else if(this._state === BEFORE_ATTRIBUTE_NAME || this._state === BEFORE_ATTRIBUTE_VALUE || this._state === AFTER_ATTRIBUTE_NAME){
+		this._cbs.onopentagend();
+	} else if(this._state === IN_ATTRIBUTE_NAME){
+		this._cbs.onattribname(data);
+	} else if(this._state === IN_ATTRIBUTE_VALUE_SQ || this._state === IN_ATTRIBUTE_VALUE_DQ || this._state === IN_ATTRIBUTE_VALUE_NQ){
+		this._cbs.onattribdata(data);
+		this._cbs.onattribend();
+	} else if(this._state === IN_CLOSING_TAG_NAME){
+		this._cbs.onclosetag(data);
+	} else if(this._state === IN_NAMED_ENTITY && !this._xmlMode){
+		this._parseLegacyEntity();
+		if(--this._sectionStart < this._index){
+			this._state = this._baseState;
+			this._handleTrailingData();
+		}
+	} else if(this._state === IN_NUMERIC_ENTITY && !this._xmlMode){
+		this._decodeNumericEntity(2, 10);
+		if(this._sectionStart < this._index){
+			this._state = this._baseState;
+			this._handleTrailingData();
+		}
+	} else if(this._state === IN_HEX_ENTITY && !this._xmlMode){
+		this._decodeNumericEntity(3, 16);
+		if(this._sectionStart < this._index){
+			this._state = this._baseState;
+			this._handleTrailingData();
+		}
+	} else {
+		this._cbs.ontext(data);
+	}
+};
+
+Tokenizer.prototype.reset = function(){
+	Tokenizer.call(this, {xmlMode: this._xmlMode, decodeEntities: this._decodeEntities}, this._cbs);
+};
+
+Tokenizer.prototype._getSection = function(){
+	return this._buffer.substring(this._sectionStart, this._index);
+};
+
+Tokenizer.prototype._emitToken = function(name){
+	this._cbs[name](this._getSection());
+	this._sectionStart = -1;
+};
+
+Tokenizer.prototype._emitPartial = function(value){
+	if(this._baseState !== TEXT){
+		this._cbs.onattribdata(value); //TODO implement the new event
+	} else {
+		this._cbs.ontext(value);
+	}
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/WritableStream.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/WritableStream.js
new file mode 100644
index 0000000..e65b073
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/WritableStream.js
@@ -0,0 +1,21 @@
+module.exports = Stream;
+
+var Parser = require("./Parser.js"),
+    WritableStream = require("stream").Writable || require("readable-stream").Writable;
+
+function Stream(cbs, options){
+	var parser = this._parser = new Parser(cbs, options);
+
+	WritableStream.call(this, {decodeStrings: false});
+
+	this.once("finish", function(){
+		parser.end();
+	});
+}
+
+require("util").inherits(Stream, WritableStream);
+
+WritableStream.prototype._write = function(chunk, encoding, cb){
+	this._parser.write(chunk);
+	cb();
+};
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/entities/decode.json b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/entities/decode.json
new file mode 100644
index 0000000..4ed2e8b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/entities/decode.json
@@ -0,0 +1 @@
+{"0":"\uFFFD","128":"\u20AC","130":"\u201A","131":"\u0192","132":"\u201E","133":"\u2026","134":"\u2020","135":"\u2021","136":"\u02C6","137":"\u2030","138":"\u0160","139":"\u2039","140":"\u0152","142":"\u017D","145":"\u2018","146":"\u2019","147":"\u201C","148":"\u201D","149":"\u2022","150":"\u2013","151":"\u2014","152":"\u02DC","153":"\u2122","154":"\u0161","155":"\u203A","156":"\u0153","158":"\u017E","159":"\u0178"}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/entities/entities.json b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/entities/entities.json
new file mode 100644
index 0000000..7ccfcd8
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/entities/entities.json
@@ -0,0 +1 @@
+{"Aacute":"\u00C1","aacute":"\u00E1","Abreve":"\u0102","abreve":"\u0103","ac":"\u223E","acd":"\u223F","acE":"\u223E\u0333","Acirc":"\u00C2","acirc":"\u00E2","acute":"\u00B4","Acy":"\u0410","acy":"\u0430","AElig":"\u00C6","aelig":"\u00E6","af":"\u2061","Afr":"\uD835\uDD04","afr":"\uD835\uDD1E","Agrave":"\u00C0","agrave":"\u00E0","alefsym":"\u2135","aleph":"\u2135","Alpha":"\u0391","alpha":"\u03B1","Amacr":"\u0100","amacr":"\u0101","amalg":"\u2A3F","amp":"&","AMP":"&","andand":"\u2A55","An [...]
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/entities/legacy.json b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/entities/legacy.json
new file mode 100644
index 0000000..f0e82a4
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/entities/legacy.json
@@ -0,0 +1 @@
+{"Aacute":"\u00C1","aacute":"\u00E1","Acirc":"\u00C2","acirc":"\u00E2","acute":"\u00B4","AElig":"\u00C6","aelig":"\u00E6","Agrave":"\u00C0","agrave":"\u00E0","amp":"&","AMP":"&","Aring":"\u00C5","aring":"\u00E5","Atilde":"\u00C3","atilde":"\u00E3","Auml":"\u00C4","auml":"\u00E4","brvbar":"\u00A6","Ccedil":"\u00C7","ccedil":"\u00E7","cedil":"\u00B8","cent":"\u00A2","copy":"\u00A9","COPY":"\u00A9","curren":"\u00A4","deg":"\u00B0","divide":"\u00F7","Eacute":"\u00C9","eacute":"\u00E9","Ecirc [...]
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/entities/xml.json b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/entities/xml.json
new file mode 100644
index 0000000..de8db10
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/entities/xml.json
@@ -0,0 +1 @@
+{"amp":"&","apos":"'","gt":">","lt":"<","quot":"\""}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/index.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/index.js
new file mode 100644
index 0000000..7f6f649
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/lib/index.js
@@ -0,0 +1,70 @@
+var Parser = require("./Parser.js"),
+    DomHandler = require("domhandler");
+
+function defineProp(name, value){
+	delete module.exports[name];
+	module.exports[name] = value;
+	return value;
+}
+
+module.exports = {
+	Parser: Parser,
+	Tokenizer: require("./Tokenizer.js"),
+	ElementType: require("domelementtype"),
+	DomHandler: DomHandler,
+	get FeedHandler(){
+		return defineProp("FeedHandler", require("./FeedHandler.js"));
+	},
+	get Stream(){
+		return defineProp("Stream", require("./Stream.js"));
+	},
+	get WritableStream(){
+		return defineProp("WritableStream", require("./WritableStream.js"));
+	},
+	get ProxyHandler(){
+		return defineProp("ProxyHandler", require("./ProxyHandler.js"));
+	},
+	get DomUtils(){
+		return defineProp("DomUtils", require("domutils"));
+	},
+	get CollectingHandler(){
+		return defineProp("CollectingHandler", require("./CollectingHandler.js"));
+	},
+	// For legacy support
+	DefaultHandler: DomHandler,
+	get RssHandler(){
+		return defineProp("RssHandler", this.FeedHandler);
+	},
+	//helper methods
+	parseDOM: function(data, options) {
+		var handler = new DomHandler(options);
+		var parser = new Parser(handler, options);
+		parser.end(data);
+		return handler.dom;
+	},
+	parseFeed: function(feed, options){
+		var handler = new module.exports.FeedHandler();
+		var parser = new Parser(handler);
+		parser.end(feed);
+		return handler.dom;
+	},
+	createDomStream: function(cb, options, elementCb){
+		var handler = new DomHandler(cb, options, elementCb);
+		return new Parser(handler, options);
+	},
+	// List of all events that the parser emits
+	EVENTS: { /* Format: eventname: number of arguments */
+		attribute: 2,
+		cdatastart: 0,
+		cdataend: 0,
+		text: 1,
+		processinginstruction: 2,
+		comment: 1,
+		commentend: 0,
+		closetag: 1,
+		opentag: 2,
+		opentagname: 1,
+		error: 1,
+		end: 0
+	}
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domelementtype/LICENSE b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domelementtype/LICENSE
new file mode 100644
index 0000000..c464f86
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domelementtype/LICENSE
@@ -0,0 +1,11 @@
+Copyright (c) Felix Böhm
+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.
+
+THIS 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 HOLDER 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 B [...]
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domelementtype/index.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domelementtype/index.js
new file mode 100644
index 0000000..8f62474
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domelementtype/index.js
@@ -0,0 +1,14 @@
+//Types of elements found in the DOM
+module.exports = {
+	Text: "text", //Text
+	Directive: "directive", //<? ... ?>
+	Comment: "comment", //<!-- ... -->
+	Script: "script", //<script> tags
+	Style: "style", //<style> tags
+	Tag: "tag", //Any tag
+	CDATA: "cdata", //<![CDATA[ ... ]]>
+
+	isTag: function(elem){
+		return elem.type === "tag" || elem.type === "script" || elem.type === "style";
+	}
+};
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domelementtype/package.json b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domelementtype/package.json
new file mode 100644
index 0000000..0d33fdd
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domelementtype/package.json
@@ -0,0 +1,25 @@
+{
+  "name": "domelementtype",
+  "version": "1.1.1",
+  "description": "all the types of nodes in htmlparser2's dom",
+  "main": "index.js",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/FB55/domelementtype.git"
+  },
+  "keywords": [
+    "dom",
+    "htmlparser2"
+  ],
+  "author": {
+    "name": "Felix Boehm",
+    "email": "me at feedic.com"
+  },
+  "readme": "all the types of nodes in htmlparser2's dom\n",
+  "readmeFilename": "readme.md",
+  "bugs": {
+    "url": "https://github.com/FB55/domelementtype/issues"
+  },
+  "_id": "domelementtype at 1.1.1",
+  "_from": "domelementtype at 1"
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domelementtype/readme.md b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domelementtype/readme.md
new file mode 100644
index 0000000..cbb43db
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domelementtype/readme.md
@@ -0,0 +1 @@
+all the types of nodes in htmlparser2's dom
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/.travis.yml b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/.travis.yml
new file mode 100644
index 0000000..8d7f0cd
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/.travis.yml
@@ -0,0 +1,6 @@
+language: node_js
+node_js:
+  - 0.4
+  - 0.6
+  - 0.8
+  - 0.9
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/LICENSE b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/LICENSE
new file mode 100644
index 0000000..c464f86
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/LICENSE
@@ -0,0 +1,11 @@
+Copyright (c) Felix Böhm
+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.
+
+THIS 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 HOLDER 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 B [...]
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/index.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/index.js
new file mode 100644
index 0000000..68816a0
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/index.js
@@ -0,0 +1,174 @@
+var ElementType = require("domelementtype");
+
+var re_whitespace = /\s+/g;
+
+function DomHandler(callback, options, elementCB){
+	if(typeof callback === "object"){
+		elementCB = options;
+		options = callback;
+		callback = null;
+	} else if(typeof options === "function"){
+		elementCB = options;
+		options = defaultOpts;
+	}
+	this._callback = callback;
+	this._options = options || defaultOpts;
+	this._elementCB = elementCB;
+	this.dom = [];
+	this._done = false;
+	this._tagStack = [];
+}
+
+//default options
+var defaultOpts = {
+	normalizeWhitespace: false //Replace all whitespace with single spaces
+};
+
+//Resets the handler back to starting state
+DomHandler.prototype.onreset = function(){
+	DomHandler.call(this, this._callback, this._options, this._elementCB);
+};
+
+//Signals the handler that parsing is done
+DomHandler.prototype.onend = function(){
+	if(this._done) return;
+	this._done = true;
+	this._handleCallback(null);
+};
+
+DomHandler.prototype._handleCallback =
+DomHandler.prototype.onerror = function(error){
+	if(typeof this._callback === "function"){
+		this._callback(error, this.dom);
+	} else {
+		if(error) throw error;
+	}
+};
+
+DomHandler.prototype.onclosetag = function(name){
+	//if(this._tagStack.pop().name !== name) this._handleCallback(Error("Tagname didn't match!"));
+	var elem = this._tagStack.pop();
+	if(this._elementCB) this._elementCB(elem);
+};
+
+DomHandler.prototype._addDomElement = function(element){
+	var lastTag = this._tagStack[this._tagStack.length - 1];
+
+	if(lastTag){
+		lastTag.children.push(element);
+	} else { //There aren't parent elements
+		this.dom.push(element);
+	}
+};
+
+DomHandler.prototype.onopentag = function(name, attribs){
+	var lastTag = this._tagStack[this._tagStack.length - 1];
+
+	var element = {
+		type: name === "script" ? ElementType.Script : name === "style" ? ElementType.Style : ElementType.Tag,
+		name: name,
+		attribs: attribs,
+		children: [],
+		prev: null,
+		next: null,
+		parent: lastTag || null
+	};
+
+	if(lastTag){
+		var idx = lastTag.children.length;
+		while(idx > 0){
+			if(ElementType.isTag(lastTag.children[--idx])){
+				element.prev = lastTag.children[idx];
+				lastTag.children[idx].next = element;
+				break;
+			}
+		}
+		lastTag.children.push(element);
+	} else {
+		this.dom.push(element);
+	}
+
+	this._tagStack.push(element);
+};
+
+DomHandler.prototype.ontext = function(data){
+	//the ignoreWhitespace is officially dropped, but for now,
+	//it's an alias for normalizeWhitespace
+	var normalize = this._options.normalizeWhitespace || this._options.ignoreWhitespace;
+
+	var lastTag;
+
+	if(!this._tagStack.length && this.dom.length && (lastTag = this.dom[this.dom.length-1]).type === ElementType.Text){
+		if(normalize){
+			lastTag.data = (lastTag.data + data).replace(re_whitespace, " ");
+		} else {
+			lastTag.data += data;
+		}
+	} else {
+		if(
+			this._tagStack.length &&
+			(lastTag = this._tagStack[this._tagStack.length - 1]) &&
+			(lastTag = lastTag.children[lastTag.children.length - 1]) &&
+			lastTag.type === ElementType.Text
+		){
+			if(normalize){
+				lastTag.data = (lastTag.data + data).replace(re_whitespace, " ");
+			} else {
+				lastTag.data += data;
+			}
+		} else {
+			if(normalize){
+				data = data.replace(re_whitespace, " ");
+			}
+
+			this._addDomElement({
+				data: data,
+				type: ElementType.Text
+			});
+		}
+	}
+};
+
+DomHandler.prototype.oncomment = function(data){
+	var lastTag = this._tagStack[this._tagStack.length - 1];
+
+	if(lastTag && lastTag.type === ElementType.Comment){
+		lastTag.data += data;
+		return;
+	}
+
+	var element = {
+		data: data,
+		type: ElementType.Comment
+	};
+
+	this._addDomElement(element);
+	this._tagStack.push(element);
+};
+
+DomHandler.prototype.oncdatastart = function(){
+	var element = {
+		children: [{
+			data: "",
+			type: ElementType.Text
+		}],
+		type: ElementType.CDATA
+	};
+
+	this._addDomElement(element);
+	this._tagStack.push(element);
+};
+
+DomHandler.prototype.oncommentend = DomHandler.prototype.oncdataend = function(){
+	this._tagStack.pop();
+};
+
+DomHandler.prototype.onprocessinginstruction = function(name, data){
+	this._addDomElement({
+		name: name,
+		data: data,
+		type: ElementType.Directive
+	});
+};
+
+module.exports = DomHandler;
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/package.json b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/package.json
new file mode 100644
index 0000000..f6f9448
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/package.json
@@ -0,0 +1,38 @@
+{
+  "name": "domhandler",
+  "version": "2.1.0",
+  "description": "handler for htmlparser2 that turns pages into a dom",
+  "main": "index.js",
+  "directories": {
+    "test": "tests"
+  },
+  "scripts": {
+    "test": "mocha -R list"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/fb55/domhandler.git"
+  },
+  "keywords": [
+    "dom",
+    "htmlparser2"
+  ],
+  "dependencies": {
+    "domelementtype": "1"
+  },
+  "devDependencies": {
+    "htmlparser2": "2.3",
+    "mocha": "1"
+  },
+  "author": {
+    "name": "Felix Boehm",
+    "email": "me at feedic.com"
+  },
+  "readme": "#DOMHandler [![Build Status](https://secure.travis-ci.org/fb55/DomHandler.png)](http://travis-ci.org/fb55/DomHandler)\n\nThe DOM handler (formally known as DefaultHandler) creates a tree containing all nodes of a page. The tree may be manipulated using the DOMUtils library.\n\n##Usage\n```javascript\nvar handler = new DomHandler([ <func> callback(err, dom), ] [ <obj> options ]);\n// var parser = new Parser(handler[, options]);\n```\n\n##Example\n```javascript\nvar htmlparser [...]
+  "readmeFilename": "readme.md",
+  "bugs": {
+    "url": "https://github.com/fb55/domhandler/issues"
+  },
+  "_id": "domhandler at 2.1.0",
+  "_from": "domhandler at 2.1"
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/readme.md b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/readme.md
new file mode 100644
index 0000000..a9214a3
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/readme.md
@@ -0,0 +1,99 @@
+#DOMHandler [![Build Status](https://secure.travis-ci.org/fb55/DomHandler.png)](http://travis-ci.org/fb55/DomHandler)
+
+The DOM handler (formally known as DefaultHandler) creates a tree containing all nodes of a page. The tree may be manipulated using the DOMUtils library.
+
+##Usage
+```javascript
+var handler = new DomHandler([ <func> callback(err, dom), ] [ <obj> options ]);
+// var parser = new Parser(handler[, options]);
+```
+
+##Example
+```javascript
+var htmlparser = require("htmlparser2");
+var rawHtml = "Xyz <script language= javascript>var foo = '<<bar>>';< /  script><!--<!-- Waah! -- -->";
+var handler = new htmlparser.DomHandler(function (error, dom) {
+    if (error)
+    	[...do something for errors...]
+    else
+    	[...parsing done, do something...]
+        console.log(dom);
+});
+var parser = new htmlparser.Parser(handler);
+parser.write(rawHtml);
+parser.done();
+```
+
+Output:
+
+```javascript
+[{
+    data: 'Xyz ',
+    type: 'text'
+}, {
+    type: 'script',
+    name: 'script',
+    attribs: {
+    	language: 'javascript'
+    },
+    children: [{
+    	data: 'var foo = \'<bar>\';<',
+    	type: 'text'
+    }]
+}, {
+    data: '<!-- Waah! -- ',
+    type: 'comment'
+}]
+```
+
+##Option: ignoreWhitespace
+Indicates whether the DOM should exclude text nodes that consists solely of whitespace. The default value is "false". 
+
+The following HTML will be used:
+
+```html
+<font>
+	<br>this is the text
+<font>
+```
+
+###Example: true
+
+```javascript
+[{
+    type: 'tag',
+    name: 'font',
+    children: [{
+    	type: 'tag',
+    	name: 'br'
+    }, {
+    	data: 'this is the text\n',
+    	type: 'text'
+    }, {
+    	type: 'tag',
+    	name: 'font'
+    }]
+}]
+```
+
+###Example: false
+
+```javascript
+[{
+	type: 'tag',
+    name: 'font',
+    children: [{
+    	data: '\n\t',
+    	type: 'text'
+    }, {
+    	type: 'tag',
+    	name: 'br'
+    }, {
+    	data: 'this is the text\n',
+    	type: 'text'
+    }, {
+    	type: 'tag',
+    	name: 'font'
+    }]
+}]
+```
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/LICENSE b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/LICENSE
new file mode 100644
index 0000000..c464f86
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/LICENSE
@@ -0,0 +1,11 @@
+Copyright (c) Felix Böhm
+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.
+
+THIS 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 HOLDER 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 B [...]
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/index.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/index.js
new file mode 100644
index 0000000..d8b2d2b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/index.js
@@ -0,0 +1,318 @@
+var ElementType = require("domelementtype"),
+    DomUtils = module.exports;
+
+var isTag = DomUtils.isTag = ElementType.isTag;
+
+function getChildren(elem){
+	return elem.children;
+}
+function getParent(elem){
+	return elem.parent;
+}
+function getSiblings(elem){
+	var parent = getParent(elem);
+	return parent ? getChildren(parent) : [elem];
+}
+function getAttributeValue(elem, name){
+	return elem.attribs && elem.attribs[name];
+}
+function hasAttrib(elem, name){
+	return hasOwnProperty.call(elem.attribs, name);
+}
+function getName(elem){
+	return elem.name;
+}
+
+DomUtils.getChildren = getChildren;
+DomUtils.getParent = getParent;
+DomUtils.getAttributeValue = getAttributeValue;
+DomUtils.hasAttrib = hasAttrib;
+DomUtils.getName = getName;
+DomUtils.getSiblings = getSiblings;
+
+function find(test, arr, recurse, limit){
+	var result = [], childs;
+
+	for(var i = 0, j = arr.length; i < j; i++){
+		if(test(arr[i])){
+			result.push(arr[i]);
+			if(--limit <= 0) break;
+		}
+
+		childs = getChildren(arr[i]);
+		if(recurse && childs && childs.length > 0){
+			childs = find(test, childs, recurse, limit);
+			result = result.concat(childs);
+			limit -= childs.length;
+			if(limit <= 0) break;
+		}
+	}
+
+	return result;
+}
+
+function findOneChild(test, arr){
+	for(var i = 0, l = arr.length; i < l; i++){
+		if(test(arr[i])) return arr[i];
+	}
+
+	return null;
+}
+
+function findOne(test, arr){
+	var elem = null;
+
+	for(var i = 0, l = arr.length; i < l && !elem; i++){
+		if(test(arr[i])){
+			elem = arr[i];
+		} else if(arr[i].children && arr[i].children.length > 0){
+			elem = findOne(test, arr[i].children);
+		}
+	}
+
+	return elem;
+}
+
+DomUtils.findOne = findOne;
+
+function findAll(test, elems){
+	var result = [];
+	for(var i = 0, j = elems.length; i < j; i++){
+		if(test(elems[i])) result.push(elems[i]);
+
+		var childs = getChildren(elems[i]);
+		if(childs && childs.length){
+			result = result.concat(findAll(test, childs));
+		}
+	}
+	return result;
+}
+
+DomUtils.findAll = findAll;
+
+function filter(test, element, recurse, limit){
+	if(!Array.isArray(element)) element = [element];
+
+	if(typeof limit !== "number" || !isFinite(limit)){
+		if(recurse === false){
+			return element.filter(test);
+		} else {
+			return findAll(test, element);
+		}
+	} else if(limit === 1){
+		if(recurse === false){
+			element = findOneChild(test, element);
+		} else {
+			element = findOne(test, element);
+		}
+		return element ? [element] : [];
+	} else {
+		return find(test, element, recurse !== false, limit);
+	}
+}
+
+DomUtils.filter = filter;
+
+DomUtils.testElement = function(options, element){
+	for(var key in options){
+		if(!options.hasOwnProperty(key));
+		else if(key === "tag_name"){
+			if(!isTag(element) || !options.tag_name(element.name)){
+				return false;
+			}
+		} else if(key === "tag_type"){
+			if(!options.tag_type(element.type)) return false;
+		} else if(key === "tag_contains"){
+			if(isTag(element) || !options.tag_contains(element.data)){
+				return false;
+			}
+		} else if(!element.attribs || !options[key](element.attribs[key])){
+			return false;
+		}
+	}
+	return true;
+};
+
+var Checks = {
+	tag_name: function(name){
+		if(typeof name === "function"){ 
+			return function(elem){ return isTag(elem) && name(elem.name); };
+		} else if(name === "*"){
+			return isTag;
+		} else {
+			return function(elem){ return isTag(elem) && elem.name === name; };
+		}
+	},
+	tag_type: function(type){
+		if(typeof type === "function"){
+			return function(elem){ return type(elem.type); };
+		} else {
+			return function(elem){ return elem.type === type; };
+		}
+	},
+	tag_contains: function(data){
+		if(typeof type === "function"){
+			return function(elem){ return !isTag(elem) && data(elem.data); };
+		} else {
+			return function(elem){ return !isTag(elem) && elem.data === data; };
+		}
+	}
+};
+
+function getAttribCheck(attrib, value){
+	if(typeof value === "function"){
+		return function(elem){ return elem.attribs && value(elem.attribs[attrib]); };
+	} else {
+		return function(elem){ return elem.attribs && elem.attribs[attrib] === value; };
+	}
+}
+
+DomUtils.getElements = function(options, element, recurse, limit){
+	var funcs = [];
+	for(var key in options){
+		if(options.hasOwnProperty(key)){
+			if(key in Checks) funcs.push(Checks[key](options[key]));
+			else funcs.push(getAttribCheck(key, options[key]));
+		}
+	}
+
+	if(funcs.length === 0) return [];
+	if(funcs.length === 1) return filter(funcs[0], element, recurse, limit);
+	return filter(
+		function(elem){
+			return funcs.some(function(func){ return func(elem); });
+		},
+		element, recurse, limit
+	);
+};
+
+DomUtils.getElementById = function(id, element, recurse){
+	if(!Array.isArray(element)) element = [element];
+	return findOne(getAttribCheck("id", id), element, recurse !== false);
+};
+
+DomUtils.getElementsByTagName = function(name, element, recurse, limit){
+	return filter(Checks.tag_name(name), element, recurse, limit);
+};
+
+DomUtils.getElementsByTagType = function(type, element, recurse, limit){
+	return filter(Checks.tag_type(type), element, recurse, limit);
+};
+
+DomUtils.removeElement = function(elem){
+	if(elem.prev) elem.prev.next = elem.next;
+	if(elem.next) elem.next.prev = elem.prev;
+
+	if(elem.parent){
+		var childs = elem.parent.children;
+		childs.splice(childs.lastIndexOf(elem), 1);
+	}
+};
+
+DomUtils.replaceElement = function(elem, replacement){
+	if(elem.prev){
+		elem.prev.next = replacement;
+		replacement.prev = elem.prev;
+	}
+	if(elem.next){
+		elem.next.prev = replacement;
+		replacement.next = elem.next;
+	}
+	if(elem.parent){
+		var childs = elem.parent.children;
+		childs.splice(childs.lastIndexOf(elem), 1, replacement);
+		replacement.parent = elem.parent;
+	}
+};
+
+DomUtils.getInnerHTML = function(elem){
+	if(!elem.children) return "";
+
+	var childs = elem.children,
+		childNum = childs.length,
+		ret = "";
+
+	for(var i = 0; i < childNum; i++){
+		ret += DomUtils.getOuterHTML(childs[i]);
+	}
+
+	return ret;
+};
+
+//boolean attributes without a value (taken from MatthewMueller/cheerio)
+var booleanAttribs = {
+	__proto__: null,
+	async: true,
+	autofocus: true,
+	autoplay: true,
+	checked: true,
+	controls: true,
+	defer: true,
+	disabled: true,
+	hidden: true,
+	loop: true,
+	multiple: true,
+	open: true,
+	readonly: true,
+	required: true,
+	scoped: true,
+	selected: true,
+	"/": true //TODO when is this required?
+};
+
+var emptyTags = {
+	__proto__: null,
+	area: true,
+	base: true,
+	basefont: true,
+	br: true,
+	col: true,
+	frame: true,
+	hr: true,
+	img: true,
+	input: true,
+	isindex: true,
+	link: true,
+	meta: true,
+	param: true,
+	embed: true
+};
+
+DomUtils.getOuterHTML = function(elem){
+	var type = elem.type;
+
+	if(type === ElementType.Text) return elem.data;
+	if(type === ElementType.Comment) return "<!--" + elem.data + "-->";
+	if(type === ElementType.Directive) return "<" + elem.data + ">";
+	if(type === ElementType.CDATA) return "<!CDATA " + DomUtils.getInnerHTML(elem) + "]]>";
+
+	var ret = "<" + elem.name;
+	if("attribs" in elem){
+		for(var attr in elem.attribs){
+			if(elem.attribs.hasOwnProperty(attr)){
+				ret += " " + attr;
+				var value = elem.attribs[attr];
+				if(!value){
+					if( !(attr in booleanAttribs) ){
+						ret += '=""';
+					}
+				} else {
+					ret += '="' + value + '"';
+				}
+			}
+		}
+	}
+
+	if (elem.name in emptyTags && elem.children.length === 0) {
+		return ret + " />";
+	} else {
+		return ret + ">" + DomUtils.getInnerHTML(elem) + "</" + elem.name + ">";
+	}
+};
+
+DomUtils.getText = function getText(elem){
+	if(Array.isArray(elem)) return elem.map(getText).join("");
+	if(isTag(elem) || elem.type === ElementType.CDATA) return getText(elem.children);
+	if(elem.type === ElementType.Text) return elem.data;
+	return "";
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/package.json b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/package.json
new file mode 100644
index 0000000..fcd2c4b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/package.json
@@ -0,0 +1,38 @@
+{
+  "name": "domutils",
+  "version": "1.1.6",
+  "description": "utilities for working with htmlparser2's dom",
+  "main": "index.js",
+  "directories": {
+    "test": "tests"
+  },
+  "scripts": {
+    "test": "node tests/00-runtests.js"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/FB55/domutils.git"
+  },
+  "keywords": [
+    "dom",
+    "htmlparser2"
+  ],
+  "dependencies": {
+    "domelementtype": "1"
+  },
+  "devDependencies": {
+    "htmlparser2": "2.3",
+    "domhandler": "2"
+  },
+  "author": {
+    "name": "Felix Boehm",
+    "email": "me at feedic.com"
+  },
+  "readme": "utilities for working with htmlparser2's dom\n",
+  "readmeFilename": "readme.md",
+  "bugs": {
+    "url": "https://github.com/FB55/domutils/issues"
+  },
+  "_id": "domutils at 1.1.6",
+  "_from": "domutils at 1.1"
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/readme.md b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/readme.md
new file mode 100644
index 0000000..9ccdda6
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/readme.md
@@ -0,0 +1 @@
+utilities for working with htmlparser2's dom
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/tests/00-runtests.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/tests/00-runtests.js
new file mode 100644
index 0000000..cf7a3b7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/tests/00-runtests.js
@@ -0,0 +1,64 @@
+var fs = require("fs"),
+	assert = require("assert");
+
+var runCount = 0,
+	testCount = 0;
+
+function compare(expected, result){
+	if(typeof expected !== typeof result){
+		throw Error("types didn't match");
+	}
+	if(typeof expected !== "object" || expected === null){
+		if(expected !== result){
+			throw Error("result doesn't equal expected");
+		}
+		return;
+	}
+
+	for(var prop in expected){
+		if(!(prop in result)) throw Error("result didn't contain property " + prop);
+		compare(expected[prop], result[prop]);
+	}
+}
+
+function runTests(test){
+	//read files, load them, run them
+	fs.readdirSync(__dirname + test.dir
+	).map(function(file){
+		if(file[0] === ".") return false;
+		if(file.substr(-5) === ".json") return JSON.parse(
+			fs.readFileSync(__dirname + test.dir + file)
+		);
+		return require(__dirname + test.dir + file);
+	}).forEach(function(file){
+		if(!file) return;
+		var second = false;
+		
+		runCount++;
+		
+		console.log("Testing:", file.name);
+		
+		test.test(file, function(err, dom){
+			assert.ifError(err);
+			compare(file.expected, dom);
+						
+			if(second){
+				runCount--;
+				testCount++;
+			}
+			else second = true;
+		});
+	});
+	console.log("->", test.dir.slice(1, -1), "started");
+}
+
+//run all tests
+[
+ "./02-dom_utils.js"
+].map(require).forEach(runTests);
+
+//log the results
+(function check(){
+	if(runCount !== 0) return process.nextTick(check);
+	console.log("Total tests:", testCount);
+}());
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/tests/02-dom_utils.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/tests/02-dom_utils.js
new file mode 100644
index 0000000..9a28b89
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/tests/02-dom_utils.js
@@ -0,0 +1,15 @@
+//generate a dom
+var handler = new (require("domhandler"))();
+
+(new (require("htmlparser2").Parser)(handler)).parseComplete(
+	Array(21).join("<?xml><tag1 id='asdf'> <script>text</script> <!-- comment --> <tag2> text </tag1>")
+);
+
+var dom = handler.dom;
+
+exports.dir = "/DomUtils/";
+
+exports.test = function(test, cb){
+	cb(null, test.getElements(dom));
+	cb(null, test.getByFunction(dom));
+};
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/tests/DomUtils/01-by_id.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/tests/DomUtils/01-by_id.js
new file mode 100644
index 0000000..a5f02df
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/tests/DomUtils/01-by_id.js
@@ -0,0 +1,56 @@
+var DomUtils = require("../..");
+
+exports.name = "Get element by id";
+exports.getElements = function(dom){
+	return DomUtils.getElements({id:"asdf"}, dom, true, 1)[0];
+};
+exports.getByFunction = function(dom){
+	return DomUtils.getElementById("asdf", dom, true);
+};
+exports.expected = {
+  "type": "tag",
+  "name": "tag1",
+  "attribs": {
+    "id": "asdf"
+  },
+  "children": [
+    {
+      "data": " ",
+      "type": "text"
+    },
+    {
+      "type": "script",
+      "name": "script",
+      "attribs": {},
+      "children": [
+        {
+          "data": "text",
+          "type": "text"
+        }
+      ]
+    },
+    {
+      "data": " ",
+      "type": "text"
+    },
+    {
+      "data": " comment ",
+      "type": "comment"
+    },
+    {
+      "data": " ",
+      "type": "text"
+    },
+    {
+      "type": "tag",
+      "name": "tag2",
+      "attribs": {},
+      "children": [
+        {
+          "data": " text ",
+          "type": "text"
+        }
+      ]
+    }
+  ]
+};
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/tests/DomUtils/02-by_tagname.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/tests/DomUtils/02-by_tagname.js
new file mode 100644
index 0000000..125357c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/tests/DomUtils/02-by_tagname.js
@@ -0,0 +1,23 @@
+var DomUtils = require("../..");
+
+exports.name = "Get elements by tagName";
+exports.getElements = function(dom){
+	return DomUtils.getElements({tag_name:"tag2"}, dom, true);
+};
+exports.getByFunction = function(dom){
+	return DomUtils.getElementsByTagName("tag2", dom, true);
+};
+exports.expected = [];
+for(var i = 0; i < 20; i++) exports.expected.push(
+  {
+    "type": "tag",
+    "name": "tag2",
+    "attribs": {},
+    "children": [
+      {
+        "data": " text ",
+        "type": "text"
+      }
+    ]
+  }
+);
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/tests/DomUtils/03-by_type.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/tests/DomUtils/03-by_type.js
new file mode 100644
index 0000000..43bd667
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/tests/DomUtils/03-by_type.js
@@ -0,0 +1,23 @@
+var DomUtils = require("../..");
+
+exports.name = "Get elements by type";
+exports.getElements = function(dom){
+	return DomUtils.getElements({tag_type:"script"}, dom, true);
+};
+exports.getByFunction = function(dom){
+	return DomUtils.getElementsByTagType("script", dom, true);
+};
+exports.expected = [];
+for(var i = 0; i < 20; i++) exports.expected.push(
+  {
+    "type": "script",
+    "name": "script",
+    "attribs": {},
+    "children": [
+      {
+        "data": "text",
+        "type": "text"
+      }
+    ]
+  }
+);
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/tests/DomUtils/04-outer_html.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/tests/DomUtils/04-outer_html.js
new file mode 100644
index 0000000..57aae97
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/tests/DomUtils/04-outer_html.js
@@ -0,0 +1,10 @@
+var DomUtils = require("../..");
+
+exports.name = "Get outer HTML";
+exports.getElements = function(dom){
+    return '<tag1 id="asdf"> <script>text</script> <!-- comment --> <tag2> text </tag2></tag1>';
+};
+exports.getByFunction = function(dom){
+    return DomUtils.getOuterHTML(DomUtils.getElementById("asdf", dom, true));
+};
+exports.expected = '<tag1 id="asdf"> <script>text</script> <!-- comment --> <tag2> text </tag2></tag1>';
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/tests/DomUtils/05-inner_html.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/tests/DomUtils/05-inner_html.js
new file mode 100644
index 0000000..36a2661
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/tests/DomUtils/05-inner_html.js
@@ -0,0 +1,10 @@
+var DomUtils = require("../..");
+
+exports.name = "Get inner HTML";
+exports.getElements = function(dom){
+    return ' <script>text</script> <!-- comment --> <tag2> text </tag2>';
+};
+exports.getByFunction = function(dom){
+    return DomUtils.getInnerHTML(DomUtils.getElementById("asdf", dom, true));
+};
+exports.expected = ' <script>text</script> <!-- comment --> <tag2> text </tag2>';
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/LICENSE b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/LICENSE
new file mode 100644
index 0000000..0c44ae7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) Isaac Z. Schlueter ("Author")
+All rights reserved.
+
+The BSD License
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+2. 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.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/README.md b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/README.md
new file mode 100644
index 0000000..be97668
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/README.md
@@ -0,0 +1,768 @@
+# readable-stream
+
+A new class of streams for Node.js
+
+This module provides the new Stream base classes introduced in Node
+v0.10, for use in Node v0.8.  You can use it to have programs that
+have to work with node v0.8, while being forward-compatible for v0.10
+and beyond.  When you drop support for v0.8, you can remove this
+module, and only use the native streams.
+
+This is almost exactly the same codebase as appears in Node v0.10.
+However:
+
+1. The exported object is actually the Readable class.  Decorating the
+   native `stream` module would be global pollution.
+2. In v0.10, you can safely use `base64` as an argument to
+   `setEncoding` in Readable streams.  However, in v0.8, the
+   StringDecoder class has no `end()` method, which is problematic for
+   Base64.  So, don't use that, because it'll break and be weird.
+
+Other than that, the API is the same as `require('stream')` in v0.10,
+so the API docs are reproduced below.
+
+----------
+
+    Stability: 2 - Unstable
+
+A stream is an abstract interface implemented by various objects in
+Node.  For example a request to an HTTP server is a stream, as is
+stdout. Streams are readable, writable, or both. All streams are
+instances of [EventEmitter][]
+
+You can load the Stream base classes by doing `require('stream')`.
+There are base classes provided for Readable streams, Writable
+streams, Duplex streams, and Transform streams.
+
+## Compatibility
+
+In earlier versions of Node, the Readable stream interface was
+simpler, but also less powerful and less useful.
+
+* Rather than waiting for you to call the `read()` method, `'data'`
+  events would start emitting immediately.  If you needed to do some
+  I/O to decide how to handle data, then you had to store the chunks
+  in some kind of buffer so that they would not be lost.
+* The `pause()` method was advisory, rather than guaranteed.  This
+  meant that you still had to be prepared to receive `'data'` events
+  even when the stream was in a paused state.
+
+In Node v0.10, the Readable class described below was added.  For
+backwards compatibility with older Node programs, Readable streams
+switch into "old mode" when a `'data'` event handler is added, or when
+the `pause()` or `resume()` methods are called.  The effect is that,
+even if you are not using the new `read()` method and `'readable'`
+event, you no longer have to worry about losing `'data'` chunks.
+
+Most programs will continue to function normally.  However, this
+introduces an edge case in the following conditions:
+
+* No `'data'` event handler is added.
+* The `pause()` and `resume()` methods are never called.
+
+For example, consider the following code:
+
+```javascript
+// WARNING!  BROKEN!
+net.createServer(function(socket) {
+
+  // we add an 'end' method, but never consume the data
+  socket.on('end', function() {
+    // It will never get here.
+    socket.end('I got your message (but didnt read it)\n');
+  });
+
+}).listen(1337);
+```
+
+In versions of node prior to v0.10, the incoming message data would be
+simply discarded.  However, in Node v0.10 and beyond, the socket will
+remain paused forever.
+
+The workaround in this situation is to call the `resume()` method to
+trigger "old mode" behavior:
+
+```javascript
+// Workaround
+net.createServer(function(socket) {
+
+  socket.on('end', function() {
+    socket.end('I got your message (but didnt read it)\n');
+  });
+
+  // start the flow of data, discarding it.
+  socket.resume();
+
+}).listen(1337);
+```
+
+In addition to new Readable streams switching into old-mode, pre-v0.10
+style streams can be wrapped in a Readable class using the `wrap()`
+method.
+
+## Class: stream.Readable
+
+<!--type=class-->
+
+A `Readable Stream` has the following methods, members, and events.
+
+Note that `stream.Readable` is an abstract class designed to be
+extended with an underlying implementation of the `_read(size)`
+method. (See below.)
+
+### new stream.Readable([options])
+
+* `options` {Object}
+  * `highWaterMark` {Number} The maximum number of bytes to store in
+    the internal buffer before ceasing to read from the underlying
+    resource.  Default=16kb
+  * `encoding` {String} If specified, then buffers will be decoded to
+    strings using the specified encoding.  Default=null
+  * `objectMode` {Boolean} Whether this stream should behave
+    as a stream of objects. Meaning that stream.read(n) returns
+    a single value instead of a Buffer of size n
+
+In classes that extend the Readable class, make sure to call the
+constructor so that the buffering settings can be properly
+initialized.
+
+### readable.\_read(size)
+
+* `size` {Number} Number of bytes to read asynchronously
+
+Note: **This function should NOT be called directly.**  It should be
+implemented by child classes, and called by the internal Readable
+class methods only.
+
+All Readable stream implementations must provide a `_read` method
+to fetch data from the underlying resource.
+
+This method is prefixed with an underscore because it is internal to
+the class that defines it, and should not be called directly by user
+programs.  However, you **are** expected to override this method in
+your own extension classes.
+
+When data is available, put it into the read queue by calling
+`readable.push(chunk)`.  If `push` returns false, then you should stop
+reading.  When `_read` is called again, you should start pushing more
+data.
+
+The `size` argument is advisory.  Implementations where a "read" is a
+single call that returns data can use this to know how much data to
+fetch.  Implementations where that is not relevant, such as TCP or
+TLS, may ignore this argument, and simply provide data whenever it
+becomes available.  There is no need, for example to "wait" until
+`size` bytes are available before calling `stream.push(chunk)`.
+
+### readable.push(chunk)
+
+* `chunk` {Buffer | null | String} Chunk of data to push into the read queue
+* return {Boolean} Whether or not more pushes should be performed
+
+Note: **This function should be called by Readable implementors, NOT
+by consumers of Readable subclasses.**  The `_read()` function will not
+be called again until at least one `push(chunk)` call is made.  If no
+data is available, then you MAY call `push('')` (an empty string) to
+allow a future `_read` call, without adding any data to the queue.
+
+The `Readable` class works by putting data into a read queue to be
+pulled out later by calling the `read()` method when the `'readable'`
+event fires.
+
+The `push()` method will explicitly insert some data into the read
+queue.  If it is called with `null` then it will signal the end of the
+data.
+
+In some cases, you may be wrapping a lower-level source which has some
+sort of pause/resume mechanism, and a data callback.  In those cases,
+you could wrap the low-level source object by doing something like
+this:
+
+```javascript
+// source is an object with readStop() and readStart() methods,
+// and an `ondata` member that gets called when it has data, and
+// an `onend` member that gets called when the data is over.
+
+var stream = new Readable();
+
+source.ondata = function(chunk) {
+  // if push() returns false, then we need to stop reading from source
+  if (!stream.push(chunk))
+    source.readStop();
+};
+
+source.onend = function() {
+  stream.push(null);
+};
+
+// _read will be called when the stream wants to pull more data in
+// the advisory size argument is ignored in this case.
+stream._read = function(n) {
+  source.readStart();
+};
+```
+
+### readable.unshift(chunk)
+
+* `chunk` {Buffer | null | String} Chunk of data to unshift onto the read queue
+* return {Boolean} Whether or not more pushes should be performed
+
+This is the corollary of `readable.push(chunk)`.  Rather than putting
+the data at the *end* of the read queue, it puts it at the *front* of
+the read queue.
+
+This is useful in certain use-cases where a stream is being consumed
+by a parser, which needs to "un-consume" some data that it has
+optimistically pulled out of the source.
+
+```javascript
+// A parser for a simple data protocol.
+// The "header" is a JSON object, followed by 2 \n characters, and
+// then a message body.
+//
+// Note: This can be done more simply as a Transform stream.  See below.
+
+function SimpleProtocol(source, options) {
+  if (!(this instanceof SimpleProtocol))
+    return new SimpleProtocol(options);
+
+  Readable.call(this, options);
+  this._inBody = false;
+  this._sawFirstCr = false;
+
+  // source is a readable stream, such as a socket or file
+  this._source = source;
+
+  var self = this;
+  source.on('end', function() {
+    self.push(null);
+  });
+
+  // give it a kick whenever the source is readable
+  // read(0) will not consume any bytes
+  source.on('readable', function() {
+    self.read(0);
+  });
+
+  this._rawHeader = [];
+  this.header = null;
+}
+
+SimpleProtocol.prototype = Object.create(
+  Readable.prototype, { constructor: { value: SimpleProtocol }});
+
+SimpleProtocol.prototype._read = function(n) {
+  if (!this._inBody) {
+    var chunk = this._source.read();
+
+    // if the source doesn't have data, we don't have data yet.
+    if (chunk === null)
+      return this.push('');
+
+    // check if the chunk has a \n\n
+    var split = -1;
+    for (var i = 0; i < chunk.length; i++) {
+      if (chunk[i] === 10) { // '\n'
+        if (this._sawFirstCr) {
+          split = i;
+          break;
+        } else {
+          this._sawFirstCr = true;
+        }
+      } else {
+        this._sawFirstCr = false;
+      }
+    }
+
+    if (split === -1) {
+      // still waiting for the \n\n
+      // stash the chunk, and try again.
+      this._rawHeader.push(chunk);
+      this.push('');
+    } else {
+      this._inBody = true;
+      var h = chunk.slice(0, split);
+      this._rawHeader.push(h);
+      var header = Buffer.concat(this._rawHeader).toString();
+      try {
+        this.header = JSON.parse(header);
+      } catch (er) {
+        this.emit('error', new Error('invalid simple protocol data'));
+        return;
+      }
+      // now, because we got some extra data, unshift the rest
+      // back into the read queue so that our consumer will see it.
+      var b = chunk.slice(split);
+      this.unshift(b);
+
+      // and let them know that we are done parsing the header.
+      this.emit('header', this.header);
+    }
+  } else {
+    // from there on, just provide the data to our consumer.
+    // careful not to push(null), since that would indicate EOF.
+    var chunk = this._source.read();
+    if (chunk) this.push(chunk);
+  }
+};
+
+// Usage:
+var parser = new SimpleProtocol(source);
+// Now parser is a readable stream that will emit 'header'
+// with the parsed header data.
+```
+
+### readable.wrap(stream)
+
+* `stream` {Stream} An "old style" readable stream
+
+If you are using an older Node library that emits `'data'` events and
+has a `pause()` method that is advisory only, then you can use the
+`wrap()` method to create a Readable stream that uses the old stream
+as its data source.
+
+For example:
+
+```javascript
+var OldReader = require('./old-api-module.js').OldReader;
+var oreader = new OldReader;
+var Readable = require('stream').Readable;
+var myReader = new Readable().wrap(oreader);
+
+myReader.on('readable', function() {
+  myReader.read(); // etc.
+});
+```
+
+### Event: 'readable'
+
+When there is data ready to be consumed, this event will fire.
+
+When this event emits, call the `read()` method to consume the data.
+
+### Event: 'end'
+
+Emitted when the stream has received an EOF (FIN in TCP terminology).
+Indicates that no more `'data'` events will happen. If the stream is
+also writable, it may be possible to continue writing.
+
+### Event: 'data'
+
+The `'data'` event emits either a `Buffer` (by default) or a string if
+`setEncoding()` was used.
+
+Note that adding a `'data'` event listener will switch the Readable
+stream into "old mode", where data is emitted as soon as it is
+available, rather than waiting for you to call `read()` to consume it.
+
+### Event: 'error'
+
+Emitted if there was an error receiving data.
+
+### Event: 'close'
+
+Emitted when the underlying resource (for example, the backing file
+descriptor) has been closed. Not all streams will emit this.
+
+### readable.setEncoding(encoding)
+
+Makes the `'data'` event emit a string instead of a `Buffer`. `encoding`
+can be `'utf8'`, `'utf16le'` (`'ucs2'`), `'ascii'`, or `'hex'`.
+
+The encoding can also be set by specifying an `encoding` field to the
+constructor.
+
+### readable.read([size])
+
+* `size` {Number | null} Optional number of bytes to read.
+* Return: {Buffer | String | null}
+
+Note: **This function SHOULD be called by Readable stream users.**
+
+Call this method to consume data once the `'readable'` event is
+emitted.
+
+The `size` argument will set a minimum number of bytes that you are
+interested in.  If not set, then the entire content of the internal
+buffer is returned.
+
+If there is no data to consume, or if there are fewer bytes in the
+internal buffer than the `size` argument, then `null` is returned, and
+a future `'readable'` event will be emitted when more is available.
+
+Calling `stream.read(0)` will always return `null`, and will trigger a
+refresh of the internal buffer, but otherwise be a no-op.
+
+### readable.pipe(destination, [options])
+
+* `destination` {Writable Stream}
+* `options` {Object} Optional
+  * `end` {Boolean} Default=true
+
+Connects this readable stream to `destination` WriteStream. Incoming
+data on this stream gets written to `destination`.  Properly manages
+back-pressure so that a slow destination will not be overwhelmed by a
+fast readable stream.
+
+This function returns the `destination` stream.
+
+For example, emulating the Unix `cat` command:
+
+    process.stdin.pipe(process.stdout);
+
+By default `end()` is called on the destination when the source stream
+emits `end`, so that `destination` is no longer writable. Pass `{ end:
+false }` as `options` to keep the destination stream open.
+
+This keeps `writer` open so that "Goodbye" can be written at the
+end.
+
+    reader.pipe(writer, { end: false });
+    reader.on("end", function() {
+      writer.end("Goodbye\n");
+    });
+
+Note that `process.stderr` and `process.stdout` are never closed until
+the process exits, regardless of the specified options.
+
+### readable.unpipe([destination])
+
+* `destination` {Writable Stream} Optional
+
+Undo a previously established `pipe()`.  If no destination is
+provided, then all previously established pipes are removed.
+
+### readable.pause()
+
+Switches the readable stream into "old mode", where data is emitted
+using a `'data'` event rather than being buffered for consumption via
+the `read()` method.
+
+Ceases the flow of data.  No `'data'` events are emitted while the
+stream is in a paused state.
+
+### readable.resume()
+
+Switches the readable stream into "old mode", where data is emitted
+using a `'data'` event rather than being buffered for consumption via
+the `read()` method.
+
+Resumes the incoming `'data'` events after a `pause()`.
+
+
+## Class: stream.Writable
+
+<!--type=class-->
+
+A `Writable` Stream has the following methods, members, and events.
+
+Note that `stream.Writable` is an abstract class designed to be
+extended with an underlying implementation of the
+`_write(chunk, encoding, cb)` method. (See below.)
+
+### new stream.Writable([options])
+
+* `options` {Object}
+  * `highWaterMark` {Number} Buffer level when `write()` starts
+    returning false. Default=16kb
+  * `decodeStrings` {Boolean} Whether or not to decode strings into
+    Buffers before passing them to `_write()`.  Default=true
+
+In classes that extend the Writable class, make sure to call the
+constructor so that the buffering settings can be properly
+initialized.
+
+### writable.\_write(chunk, encoding, callback)
+
+* `chunk` {Buffer | String} The chunk to be written.  Will always
+  be a buffer unless the `decodeStrings` option was set to `false`.
+* `encoding` {String} If the chunk is a string, then this is the
+  encoding type.  Ignore chunk is a buffer.  Note that chunk will
+  **always** be a buffer unless the `decodeStrings` option is
+  explicitly set to `false`.
+* `callback` {Function} Call this function (optionally with an error
+  argument) when you are done processing the supplied chunk.
+
+All Writable stream implementations must provide a `_write` method to
+send data to the underlying resource.
+
+Note: **This function MUST NOT be called directly.**  It should be
+implemented by child classes, and called by the internal Writable
+class methods only.
+
+Call the callback using the standard `callback(error)` pattern to
+signal that the write completed successfully or with an error.
+
+If the `decodeStrings` flag is set in the constructor options, then
+`chunk` may be a string rather than a Buffer, and `encoding` will
+indicate the sort of string that it is.  This is to support
+implementations that have an optimized handling for certain string
+data encodings.  If you do not explicitly set the `decodeStrings`
+option to `false`, then you can safely ignore the `encoding` argument,
+and assume that `chunk` will always be a Buffer.
+
+This method is prefixed with an underscore because it is internal to
+the class that defines it, and should not be called directly by user
+programs.  However, you **are** expected to override this method in
+your own extension classes.
+
+
+### writable.write(chunk, [encoding], [callback])
+
+* `chunk` {Buffer | String} Data to be written
+* `encoding` {String} Optional.  If `chunk` is a string, then encoding
+  defaults to `'utf8'`
+* `callback` {Function} Optional.  Called when this chunk is
+  successfully written.
+* Returns {Boolean}
+
+Writes `chunk` to the stream.  Returns `true` if the data has been
+flushed to the underlying resource.  Returns `false` to indicate that
+the buffer is full, and the data will be sent out in the future. The
+`'drain'` event will indicate when the buffer is empty again.
+
+The specifics of when `write()` will return false, is determined by
+the `highWaterMark` option provided to the constructor.
+
+### writable.end([chunk], [encoding], [callback])
+
+* `chunk` {Buffer | String} Optional final data to be written
+* `encoding` {String} Optional.  If `chunk` is a string, then encoding
+  defaults to `'utf8'`
+* `callback` {Function} Optional.  Called when the final chunk is
+  successfully written.
+
+Call this method to signal the end of the data being written to the
+stream.
+
+### Event: 'drain'
+
+Emitted when the stream's write queue empties and it's safe to write
+without buffering again. Listen for it when `stream.write()` returns
+`false`.
+
+### Event: 'close'
+
+Emitted when the underlying resource (for example, the backing file
+descriptor) has been closed. Not all streams will emit this.
+
+### Event: 'finish'
+
+When `end()` is called and there are no more chunks to write, this
+event is emitted.
+
+### Event: 'pipe'
+
+* `source` {Readable Stream}
+
+Emitted when the stream is passed to a readable stream's pipe method.
+
+### Event 'unpipe'
+
+* `source` {Readable Stream}
+
+Emitted when a previously established `pipe()` is removed using the
+source Readable stream's `unpipe()` method.
+
+## Class: stream.Duplex
+
+<!--type=class-->
+
+A "duplex" stream is one that is both Readable and Writable, such as a
+TCP socket connection.
+
+Note that `stream.Duplex` is an abstract class designed to be
+extended with an underlying implementation of the `_read(size)`
+and `_write(chunk, encoding, callback)` methods as you would with a Readable or
+Writable stream class.
+
+Since JavaScript doesn't have multiple prototypal inheritance, this
+class prototypally inherits from Readable, and then parasitically from
+Writable.  It is thus up to the user to implement both the lowlevel
+`_read(n)` method as well as the lowlevel `_write(chunk, encoding, cb)` method
+on extension duplex classes.
+
+### new stream.Duplex(options)
+
+* `options` {Object} Passed to both Writable and Readable
+  constructors. Also has the following fields:
+  * `allowHalfOpen` {Boolean} Default=true.  If set to `false`, then
+    the stream will automatically end the readable side when the
+    writable side ends and vice versa.
+
+In classes that extend the Duplex class, make sure to call the
+constructor so that the buffering settings can be properly
+initialized.
+
+## Class: stream.Transform
+
+A "transform" stream is a duplex stream where the output is causally
+connected in some way to the input, such as a zlib stream or a crypto
+stream.
+
+There is no requirement that the output be the same size as the input,
+the same number of chunks, or arrive at the same time.  For example, a
+Hash stream will only ever have a single chunk of output which is
+provided when the input is ended.  A zlib stream will either produce
+much smaller or much larger than its input.
+
+Rather than implement the `_read()` and `_write()` methods, Transform
+classes must implement the `_transform()` method, and may optionally
+also implement the `_flush()` method.  (See below.)
+
+### new stream.Transform([options])
+
+* `options` {Object} Passed to both Writable and Readable
+  constructors.
+
+In classes that extend the Transform class, make sure to call the
+constructor so that the buffering settings can be properly
+initialized.
+
+### transform.\_transform(chunk, encoding, callback)
+
+* `chunk` {Buffer | String} The chunk to be transformed.  Will always
+  be a buffer unless the `decodeStrings` option was set to `false`.
+* `encoding` {String} If the chunk is a string, then this is the
+  encoding type.  (Ignore if `decodeStrings` chunk is a buffer.)
+* `callback` {Function} Call this function (optionally with an error
+  argument) when you are done processing the supplied chunk.
+
+Note: **This function MUST NOT be called directly.**  It should be
+implemented by child classes, and called by the internal Transform
+class methods only.
+
+All Transform stream implementations must provide a `_transform`
+method to accept input and produce output.
+
+`_transform` should do whatever has to be done in this specific
+Transform class, to handle the bytes being written, and pass them off
+to the readable portion of the interface.  Do asynchronous I/O,
+process things, and so on.
+
+Call `transform.push(outputChunk)` 0 or more times to generate output
+from this input chunk, depending on how much data you want to output
+as a result of this chunk.
+
+Call the callback function only when the current chunk is completely
+consumed.  Note that there may or may not be output as a result of any
+particular input chunk.
+
+This method is prefixed with an underscore because it is internal to
+the class that defines it, and should not be called directly by user
+programs.  However, you **are** expected to override this method in
+your own extension classes.
+
+### transform.\_flush(callback)
+
+* `callback` {Function} Call this function (optionally with an error
+  argument) when you are done flushing any remaining data.
+
+Note: **This function MUST NOT be called directly.**  It MAY be implemented
+by child classes, and if so, will be called by the internal Transform
+class methods only.
+
+In some cases, your transform operation may need to emit a bit more
+data at the end of the stream.  For example, a `Zlib` compression
+stream will store up some internal state so that it can optimally
+compress the output.  At the end, however, it needs to do the best it
+can with what is left, so that the data will be complete.
+
+In those cases, you can implement a `_flush` method, which will be
+called at the very end, after all the written data is consumed, but
+before emitting `end` to signal the end of the readable side.  Just
+like with `_transform`, call `transform.push(chunk)` zero or more
+times, as appropriate, and call `callback` when the flush operation is
+complete.
+
+This method is prefixed with an underscore because it is internal to
+the class that defines it, and should not be called directly by user
+programs.  However, you **are** expected to override this method in
+your own extension classes.
+
+### Example: `SimpleProtocol` parser
+
+The example above of a simple protocol parser can be implemented much
+more simply by using the higher level `Transform` stream class.
+
+In this example, rather than providing the input as an argument, it
+would be piped into the parser, which is a more idiomatic Node stream
+approach.
+
+```javascript
+function SimpleProtocol(options) {
+  if (!(this instanceof SimpleProtocol))
+    return new SimpleProtocol(options);
+
+  Transform.call(this, options);
+  this._inBody = false;
+  this._sawFirstCr = false;
+  this._rawHeader = [];
+  this.header = null;
+}
+
+SimpleProtocol.prototype = Object.create(
+  Transform.prototype, { constructor: { value: SimpleProtocol }});
+
+SimpleProtocol.prototype._transform = function(chunk, encoding, done) {
+  if (!this._inBody) {
+    // check if the chunk has a \n\n
+    var split = -1;
+    for (var i = 0; i < chunk.length; i++) {
+      if (chunk[i] === 10) { // '\n'
+        if (this._sawFirstCr) {
+          split = i;
+          break;
+        } else {
+          this._sawFirstCr = true;
+        }
+      } else {
+        this._sawFirstCr = false;
+      }
+    }
+
+    if (split === -1) {
+      // still waiting for the \n\n
+      // stash the chunk, and try again.
+      this._rawHeader.push(chunk);
+    } else {
+      this._inBody = true;
+      var h = chunk.slice(0, split);
+      this._rawHeader.push(h);
+      var header = Buffer.concat(this._rawHeader).toString();
+      try {
+        this.header = JSON.parse(header);
+      } catch (er) {
+        this.emit('error', new Error('invalid simple protocol data'));
+        return;
+      }
+      // and let them know that we are done parsing the header.
+      this.emit('header', this.header);
+
+      // now, because we got some extra data, emit this first.
+      this.push(b);
+    }
+  } else {
+    // from there on, just provide the data to our consumer as-is.
+    this.push(b);
+  }
+  done();
+};
+
+var parser = new SimpleProtocol();
+source.pipe(parser)
+
+// Now parser is a readable stream that will emit 'header'
+// with the parsed header data.
+```
+
+
+## Class: stream.PassThrough
+
+This is a trivial implementation of a `Transform` stream that simply
+passes the input bytes across to the output.  Its purpose is mainly
+for examples and testing, but there are occasionally use cases where
+it can come in handy.
+
+
+[EventEmitter]: events.html#events_class_events_eventemitter
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/duplex.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/duplex.js
new file mode 100644
index 0000000..ca807af
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/duplex.js
@@ -0,0 +1 @@
+module.exports = require("./lib/_stream_duplex.js")
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/examples/CAPSLOCKTYPER.JS b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/examples/CAPSLOCKTYPER.JS
new file mode 100644
index 0000000..205a425
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/examples/CAPSLOCKTYPER.JS
@@ -0,0 +1,32 @@
+var Transform = require('../transform');
+var inherits = require('util').inherits;
+
+// subclass
+function MyStream () {
+  Transform.call(this, {
+    lowWaterMark: 0,
+    encoding: 'utf8'
+  });
+}
+inherits(MyStream, Transform);
+
+MyStream.prototype._transform = function (chunk, outputFn, callback) {
+  outputFn(new Buffer(String(chunk).toUpperCase()));
+  callback();
+};
+
+// use it!
+var s = new MyStream();
+process.stdin.resume();
+process.stdin.pipe(s).pipe(process.stdout);
+if (process.stdin.setRawMode)
+  process.stdin.setRawMode(true);
+process.stdin.on('data', function (c) {
+  c = c.toString();
+  if (c === '\u0003' || c === '\u0004') {
+    process.stdin.pause();
+    s.end();
+  }
+  if (c === '\r')
+    process.stdout.write('\n');
+});
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/examples/typer-fsr.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/examples/typer-fsr.js
new file mode 100644
index 0000000..7e71584
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/examples/typer-fsr.js
@@ -0,0 +1,15 @@
+var fs = require('fs');
+var FSReadable = require('../fs.js');
+var rst = new FSReadable(__filename);
+
+rst.on('end', function() {
+  process.stdin.pause();
+});
+
+process.stdin.setRawMode(true);
+process.stdin.on('data', function() {
+  var c = rst.read(3);
+  if (!c) return;
+  process.stdout.write(c);
+});
+process.stdin.resume();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/examples/typer.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/examples/typer.js
new file mode 100644
index 0000000..c16eb6f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/examples/typer.js
@@ -0,0 +1,17 @@
+var fs = require('fs');
+var fst = fs.createReadStream(__filename);
+var Readable = require('../readable.js');
+var rst = new Readable();
+rst.wrap(fst);
+
+rst.on('end', function() {
+  process.stdin.pause();
+});
+
+process.stdin.setRawMode(true);
+process.stdin.on('data', function() {
+  var c = rst.read(3);
+  if (!c) return setTimeout(process.exit, 500)
+  process.stdout.write(c);
+});
+process.stdin.resume();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/float.patch b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/float.patch
new file mode 100644
index 0000000..0ad71a1
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/float.patch
@@ -0,0 +1,68 @@
+diff --git a/lib/_stream_duplex.js b/lib/_stream_duplex.js
+index c5a741c..a2e0d8e 100644
+--- a/lib/_stream_duplex.js
++++ b/lib/_stream_duplex.js
+@@ -26,8 +26,8 @@
+ 
+ module.exports = Duplex;
+ var util = require('util');
+-var Readable = require('_stream_readable');
+-var Writable = require('_stream_writable');
++var Readable = require('./_stream_readable');
++var Writable = require('./_stream_writable');
+ 
+ util.inherits(Duplex, Readable);
+ 
+diff --git a/lib/_stream_passthrough.js b/lib/_stream_passthrough.js
+index a5e9864..330c247 100644
+--- a/lib/_stream_passthrough.js
++++ b/lib/_stream_passthrough.js
+@@ -25,7 +25,7 @@
+ 
+ module.exports = PassThrough;
+ 
+-var Transform = require('_stream_transform');
++var Transform = require('./_stream_transform');
+ var util = require('util');
+ util.inherits(PassThrough, Transform);
+ 
+diff --git a/lib/_stream_readable.js b/lib/_stream_readable.js
+index 2259d2e..e6681ee 100644
+--- a/lib/_stream_readable.js
++++ b/lib/_stream_readable.js
+@@ -23,6 +23,9 @@ module.exports = Readable;
+ Readable.ReadableState = ReadableState;
+ 
+ var EE = require('events').EventEmitter;
++if (!EE.listenerCount) EE.listenerCount = function(emitter, type) {
++  return emitter.listeners(type).length;
++};
+ var Stream = require('stream');
+ var util = require('util');
+ var StringDecoder;
+diff --git a/lib/_stream_transform.js b/lib/_stream_transform.js
+index e925b4b..f08b05e 100644
+--- a/lib/_stream_transform.js
++++ b/lib/_stream_transform.js
+@@ -64,7 +64,7 @@
+ 
+ module.exports = Transform;
+ 
+-var Duplex = require('_stream_duplex');
++var Duplex = require('./_stream_duplex');
+ var util = require('util');
+ util.inherits(Transform, Duplex);
+ 
+diff --git a/lib/_stream_writable.js b/lib/_stream_writable.js
+index a26f711..56ca47d 100644
+--- a/lib/_stream_writable.js
++++ b/lib/_stream_writable.js
+@@ -109,7 +109,7 @@ function WritableState(options, stream) {
+ function Writable(options) {
+   // Writable ctor is applied to Duplexes, though they're not
+   // instanceof Writable, they're instanceof Readable.
+-  if (!(this instanceof Writable) && !(this instanceof Stream.Duplex))
++  if (!(this instanceof Writable) && !(this instanceof require('./_stream_duplex')))
+     return new Writable(options);
+ 
+   this._writableState = new WritableState(options, this);
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/fs.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/fs.js
new file mode 100644
index 0000000..a663af8
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/fs.js
@@ -0,0 +1,1705 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+// Maintainers, keep in mind that octal literals are not allowed
+// in strict mode. Use the decimal value and add a comment with
+// the octal value. Example:
+//
+//   var mode = 438; /* mode=0666 */
+
+var util = require('util');
+var pathModule = require('path');
+
+var binding = process.binding('fs');
+var constants = process.binding('constants');
+var fs = exports;
+var Stream = require('stream').Stream;
+var EventEmitter = require('events').EventEmitter;
+
+var Readable = require('./lib/_stream_readable.js');
+var Writable = require('./lib/_stream_writable.js');
+
+var kMinPoolSpace = 128;
+var kPoolSize = 40 * 1024;
+
+var O_APPEND = constants.O_APPEND || 0;
+var O_CREAT = constants.O_CREAT || 0;
+var O_DIRECTORY = constants.O_DIRECTORY || 0;
+var O_EXCL = constants.O_EXCL || 0;
+var O_NOCTTY = constants.O_NOCTTY || 0;
+var O_NOFOLLOW = constants.O_NOFOLLOW || 0;
+var O_RDONLY = constants.O_RDONLY || 0;
+var O_RDWR = constants.O_RDWR || 0;
+var O_SYMLINK = constants.O_SYMLINK || 0;
+var O_SYNC = constants.O_SYNC || 0;
+var O_TRUNC = constants.O_TRUNC || 0;
+var O_WRONLY = constants.O_WRONLY || 0;
+
+var isWindows = process.platform === 'win32';
+
+var DEBUG = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG);
+
+function rethrow() {
+  // Only enable in debug mode. A backtrace uses ~1000 bytes of heap space and
+  // is fairly slow to generate.
+  if (DEBUG) {
+    var backtrace = new Error;
+    return function(err) {
+      if (err) {
+        backtrace.message = err.message;
+        err = backtrace;
+        throw err;
+      }
+    };
+  }
+
+  return function(err) {
+    if (err) {
+      throw err;  // Forgot a callback but don't know where? Use NODE_DEBUG=fs
+    }
+  };
+}
+
+function maybeCallback(cb) {
+  return typeof cb === 'function' ? cb : rethrow();
+}
+
+// Ensure that callbacks run in the global context. Only use this function
+// for callbacks that are passed to the binding layer, callbacks that are
+// invoked from JS already run in the proper scope.
+function makeCallback(cb) {
+  if (typeof cb !== 'function') {
+    return rethrow();
+  }
+
+  return function() {
+    return cb.apply(null, arguments);
+  };
+}
+
+function assertEncoding(encoding) {
+  if (encoding && !Buffer.isEncoding(encoding)) {
+    throw new Error('Unknown encoding: ' + encoding);
+  }
+}
+
+function nullCheck(path, callback) {
+  if (('' + path).indexOf('\u0000') !== -1) {
+    var er = new Error('Path must be a string without null bytes.');
+    if (!callback)
+      throw er;
+    process.nextTick(function() {
+      callback(er);
+    });
+    return false;
+  }
+  return true;
+}
+
+fs.Stats = binding.Stats;
+
+fs.Stats.prototype._checkModeProperty = function(property) {
+  return ((this.mode & constants.S_IFMT) === property);
+};
+
+fs.Stats.prototype.isDirectory = function() {
+  return this._checkModeProperty(constants.S_IFDIR);
+};
+
+fs.Stats.prototype.isFile = function() {
+  return this._checkModeProperty(constants.S_IFREG);
+};
+
+fs.Stats.prototype.isBlockDevice = function() {
+  return this._checkModeProperty(constants.S_IFBLK);
+};
+
+fs.Stats.prototype.isCharacterDevice = function() {
+  return this._checkModeProperty(constants.S_IFCHR);
+};
+
+fs.Stats.prototype.isSymbolicLink = function() {
+  return this._checkModeProperty(constants.S_IFLNK);
+};
+
+fs.Stats.prototype.isFIFO = function() {
+  return this._checkModeProperty(constants.S_IFIFO);
+};
+
+fs.Stats.prototype.isSocket = function() {
+  return this._checkModeProperty(constants.S_IFSOCK);
+};
+
+fs.exists = function(path, callback) {
+  if (!nullCheck(path, cb)) return;
+  binding.stat(pathModule._makeLong(path), cb);
+  function cb(err, stats) {
+    if (callback) callback(err ? false : true);
+  }
+};
+
+fs.existsSync = function(path) {
+  try {
+    nullCheck(path);
+    binding.stat(pathModule._makeLong(path));
+    return true;
+  } catch (e) {
+    return false;
+  }
+};
+
+fs.readFile = function(path, encoding_) {
+  var encoding = typeof(encoding_) === 'string' ? encoding_ : null;
+  var callback = maybeCallback(arguments[arguments.length - 1]);
+
+  assertEncoding(encoding);
+
+  // first, stat the file, so we know the size.
+  var size;
+  var buffer; // single buffer with file data
+  var buffers; // list for when size is unknown
+  var pos = 0;
+  var fd;
+
+  fs.open(path, constants.O_RDONLY, 438 /*=0666*/, function(er, fd_) {
+    if (er) return callback(er);
+    fd = fd_;
+
+    fs.fstat(fd, function(er, st) {
+      if (er) return callback(er);
+      size = st.size;
+      if (size === 0) {
+        // the kernel lies about many files.
+        // Go ahead and try to read some bytes.
+        buffers = [];
+        return read();
+      }
+
+      buffer = new Buffer(size);
+      read();
+    });
+  });
+
+  function read() {
+    if (size === 0) {
+      buffer = new Buffer(8192);
+      fs.read(fd, buffer, 0, 8192, -1, afterRead);
+    } else {
+      fs.read(fd, buffer, pos, size - pos, -1, afterRead);
+    }
+  }
+
+  function afterRead(er, bytesRead) {
+    if (er) {
+      return fs.close(fd, function(er2) {
+        return callback(er);
+      });
+    }
+
+    if (bytesRead === 0) {
+      return close();
+    }
+
+    pos += bytesRead;
+    if (size !== 0) {
+      if (pos === size) close();
+      else read();
+    } else {
+      // unknown size, just read until we don't get bytes.
+      buffers.push(buffer.slice(0, bytesRead));
+      read();
+    }
+  }
+
+  function close() {
+    fs.close(fd, function(er) {
+      if (size === 0) {
+        // collected the data into the buffers list.
+        buffer = Buffer.concat(buffers, pos);
+      } else if (pos < size) {
+        buffer = buffer.slice(0, pos);
+      }
+
+      if (encoding) buffer = buffer.toString(encoding);
+      return callback(er, buffer);
+    });
+  }
+};
+
+fs.readFileSync = function(path, encoding) {
+  assertEncoding(encoding);
+
+  var fd = fs.openSync(path, constants.O_RDONLY, 438 /*=0666*/);
+
+  var size;
+  var threw = true;
+  try {
+    size = fs.fstatSync(fd).size;
+    threw = false;
+  } finally {
+    if (threw) fs.closeSync(fd);
+  }
+
+  var pos = 0;
+  var buffer; // single buffer with file data
+  var buffers; // list for when size is unknown
+
+  if (size === 0) {
+    buffers = [];
+  } else {
+    buffer = new Buffer(size);
+  }
+
+  var done = false;
+  while (!done) {
+    var threw = true;
+    try {
+      if (size !== 0) {
+        var bytesRead = fs.readSync(fd, buffer, pos, size - pos);
+      } else {
+        // the kernel lies about many files.
+        // Go ahead and try to read some bytes.
+        buffer = new Buffer(8192);
+        var bytesRead = fs.readSync(fd, buffer, 0, 8192);
+        if (bytesRead) {
+          buffers.push(buffer.slice(0, bytesRead));
+        }
+      }
+      threw = false;
+    } finally {
+      if (threw) fs.closeSync(fd);
+    }
+
+    pos += bytesRead;
+    done = (bytesRead === 0) || (size !== 0 && pos >= size);
+  }
+
+  fs.closeSync(fd);
+
+  if (size === 0) {
+    // data was collected into the buffers list.
+    buffer = Buffer.concat(buffers, pos);
+  } else if (pos < size) {
+    buffer = buffer.slice(0, pos);
+  }
+
+  if (encoding) buffer = buffer.toString(encoding);
+  return buffer;
+};
+
+
+// Used by binding.open and friends
+function stringToFlags(flag) {
+  // Only mess with strings
+  if (typeof flag !== 'string') {
+    return flag;
+  }
+
+  // O_EXCL is mandated by POSIX, Windows supports it too.
+  // Let's add a check anyway, just in case.
+  if (!O_EXCL && ~flag.indexOf('x')) {
+    throw errnoException('ENOSYS', 'fs.open(O_EXCL)');
+  }
+
+  switch (flag) {
+    case 'r' : return O_RDONLY;
+    case 'rs' : return O_RDONLY | O_SYNC;
+    case 'r+' : return O_RDWR;
+    case 'rs+' : return O_RDWR | O_SYNC;
+
+    case 'w' : return O_TRUNC | O_CREAT | O_WRONLY;
+    case 'wx' : // fall through
+    case 'xw' : return O_TRUNC | O_CREAT | O_WRONLY | O_EXCL;
+
+    case 'w+' : return O_TRUNC | O_CREAT | O_RDWR;
+    case 'wx+': // fall through
+    case 'xw+': return O_TRUNC | O_CREAT | O_RDWR | O_EXCL;
+
+    case 'a' : return O_APPEND | O_CREAT | O_WRONLY;
+    case 'ax' : // fall through
+    case 'xa' : return O_APPEND | O_CREAT | O_WRONLY | O_EXCL;
+
+    case 'a+' : return O_APPEND | O_CREAT | O_RDWR;
+    case 'ax+': // fall through
+    case 'xa+': return O_APPEND | O_CREAT | O_RDWR | O_EXCL;
+  }
+
+  throw new Error('Unknown file open flag: ' + flag);
+}
+
+// exported but hidden, only used by test/simple/test-fs-open-flags.js
+Object.defineProperty(exports, '_stringToFlags', {
+  enumerable: false,
+  value: stringToFlags
+});
+
+
+// Yes, the follow could be easily DRYed up but I provide the explicit
+// list to make the arguments clear.
+
+fs.close = function(fd, callback) {
+  binding.close(fd, makeCallback(callback));
+};
+
+fs.closeSync = function(fd) {
+  return binding.close(fd);
+};
+
+function modeNum(m, def) {
+  switch (typeof m) {
+    case 'number': return m;
+    case 'string': return parseInt(m, 8);
+    default:
+      if (def) {
+        return modeNum(def);
+      } else {
+        return undefined;
+      }
+  }
+}
+
+fs.open = function(path, flags, mode, callback) {
+  callback = makeCallback(arguments[arguments.length - 1]);
+  mode = modeNum(mode, 438 /*=0666*/);
+
+  if (!nullCheck(path, callback)) return;
+  binding.open(pathModule._makeLong(path),
+               stringToFlags(flags),
+               mode,
+               callback);
+};
+
+fs.openSync = function(path, flags, mode) {
+  mode = modeNum(mode, 438 /*=0666*/);
+  nullCheck(path);
+  return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode);
+};
+
+fs.read = function(fd, buffer, offset, length, position, callback) {
+  if (!Buffer.isBuffer(buffer)) {
+    // legacy string interface (fd, length, position, encoding, callback)
+    var cb = arguments[4],
+        encoding = arguments[3];
+
+    assertEncoding(encoding);
+
+    position = arguments[2];
+    length = arguments[1];
+    buffer = new Buffer(length);
+    offset = 0;
+
+    callback = function(err, bytesRead) {
+      if (!cb) return;
+
+      var str = (bytesRead > 0) ? buffer.toString(encoding, 0, bytesRead) : '';
+
+      (cb)(err, str, bytesRead);
+    };
+  }
+
+  function wrapper(err, bytesRead) {
+    // Retain a reference to buffer so that it can't be GC'ed too soon.
+    callback && callback(err, bytesRead || 0, buffer);
+  }
+
+  binding.read(fd, buffer, offset, length, position, wrapper);
+};
+
+fs.readSync = function(fd, buffer, offset, length, position) {
+  var legacy = false;
+  if (!Buffer.isBuffer(buffer)) {
+    // legacy string interface (fd, length, position, encoding, callback)
+    legacy = true;
+    var encoding = arguments[3];
+
+    assertEncoding(encoding);
+
+    position = arguments[2];
+    length = arguments[1];
+    buffer = new Buffer(length);
+
+    offset = 0;
+  }
+
+  var r = binding.read(fd, buffer, offset, length, position);
+  if (!legacy) {
+    return r;
+  }
+
+  var str = (r > 0) ? buffer.toString(encoding, 0, r) : '';
+  return [str, r];
+};
+
+fs.write = function(fd, buffer, offset, length, position, callback) {
+  if (!Buffer.isBuffer(buffer)) {
+    // legacy string interface (fd, data, position, encoding, callback)
+    callback = arguments[4];
+    position = arguments[2];
+    assertEncoding(arguments[3]);
+
+    buffer = new Buffer('' + arguments[1], arguments[3]);
+    offset = 0;
+    length = buffer.length;
+  }
+
+  if (!length) {
+    if (typeof callback == 'function') {
+      process.nextTick(function() {
+        callback(undefined, 0);
+      });
+    }
+    return;
+  }
+
+  callback = maybeCallback(callback);
+
+  function wrapper(err, written) {
+    // Retain a reference to buffer so that it can't be GC'ed too soon.
+    callback(err, written || 0, buffer);
+  }
+
+  binding.write(fd, buffer, offset, length, position, wrapper);
+};
+
+fs.writeSync = function(fd, buffer, offset, length, position) {
+  if (!Buffer.isBuffer(buffer)) {
+    // legacy string interface (fd, data, position, encoding)
+    position = arguments[2];
+    assertEncoding(arguments[3]);
+
+    buffer = new Buffer('' + arguments[1], arguments[3]);
+    offset = 0;
+    length = buffer.length;
+  }
+  if (!length) return 0;
+
+  return binding.write(fd, buffer, offset, length, position);
+};
+
+fs.rename = function(oldPath, newPath, callback) {
+  callback = makeCallback(callback);
+  if (!nullCheck(oldPath, callback)) return;
+  if (!nullCheck(newPath, callback)) return;
+  binding.rename(pathModule._makeLong(oldPath),
+                 pathModule._makeLong(newPath),
+                 callback);
+};
+
+fs.renameSync = function(oldPath, newPath) {
+  nullCheck(oldPath);
+  nullCheck(newPath);
+  return binding.rename(pathModule._makeLong(oldPath),
+                        pathModule._makeLong(newPath));
+};
+
+fs.truncate = function(path, len, callback) {
+  if (typeof path === 'number') {
+    // legacy
+    return fs.ftruncate(path, len, callback);
+  }
+  if (typeof len === 'function') {
+    callback = len;
+    len = 0;
+  } else if (typeof len === 'undefined') {
+    len = 0;
+  }
+  callback = maybeCallback(callback);
+  fs.open(path, 'w', function(er, fd) {
+    if (er) return callback(er);
+    binding.ftruncate(fd, len, function(er) {
+      fs.close(fd, function(er2) {
+        callback(er || er2);
+      });
+    });
+  });
+};
+
+fs.truncateSync = function(path, len) {
+  if (typeof path === 'number') {
+    // legacy
+    return fs.ftruncateSync(path, len);
+  }
+  if (typeof len === 'undefined') {
+    len = 0;
+  }
+  // allow error to be thrown, but still close fd.
+  var fd = fs.openSync(path, 'w');
+  try {
+    var ret = fs.ftruncateSync(fd, len);
+  } finally {
+    fs.closeSync(fd);
+  }
+  return ret;
+};
+
+fs.ftruncate = function(fd, len, callback) {
+  if (typeof len === 'function') {
+    callback = len;
+    len = 0;
+  } else if (typeof len === 'undefined') {
+    len = 0;
+  }
+  binding.ftruncate(fd, len, makeCallback(callback));
+};
+
+fs.ftruncateSync = function(fd, len) {
+  if (typeof len === 'undefined') {
+    len = 0;
+  }
+  return binding.ftruncate(fd, len);
+};
+
+fs.rmdir = function(path, callback) {
+  callback = makeCallback(callback);
+  if (!nullCheck(path, callback)) return;
+  binding.rmdir(pathModule._makeLong(path), callback);
+};
+
+fs.rmdirSync = function(path) {
+  nullCheck(path);
+  return binding.rmdir(pathModule._makeLong(path));
+};
+
+fs.fdatasync = function(fd, callback) {
+  binding.fdatasync(fd, makeCallback(callback));
+};
+
+fs.fdatasyncSync = function(fd) {
+  return binding.fdatasync(fd);
+};
+
+fs.fsync = function(fd, callback) {
+  binding.fsync(fd, makeCallback(callback));
+};
+
+fs.fsyncSync = function(fd) {
+  return binding.fsync(fd);
+};
+
+fs.mkdir = function(path, mode, callback) {
+  if (typeof mode === 'function') callback = mode;
+  callback = makeCallback(callback);
+  if (!nullCheck(path, callback)) return;
+  binding.mkdir(pathModule._makeLong(path),
+                modeNum(mode, 511 /*=0777*/),
+                callback);
+};
+
+fs.mkdirSync = function(path, mode) {
+  nullCheck(path);
+  return binding.mkdir(pathModule._makeLong(path),
+                       modeNum(mode, 511 /*=0777*/));
+};
+
+fs.sendfile = function(outFd, inFd, inOffset, length, callback) {
+  binding.sendfile(outFd, inFd, inOffset, length, makeCallback(callback));
+};
+
+fs.sendfileSync = function(outFd, inFd, inOffset, length) {
+  return binding.sendfile(outFd, inFd, inOffset, length);
+};
+
+fs.readdir = function(path, callback) {
+  callback = makeCallback(callback);
+  if (!nullCheck(path, callback)) return;
+  binding.readdir(pathModule._makeLong(path), callback);
+};
+
+fs.readdirSync = function(path) {
+  nullCheck(path);
+  return binding.readdir(pathModule._makeLong(path));
+};
+
+fs.fstat = function(fd, callback) {
+  binding.fstat(fd, makeCallback(callback));
+};
+
+fs.lstat = function(path, callback) {
+  callback = makeCallback(callback);
+  if (!nullCheck(path, callback)) return;
+  binding.lstat(pathModule._makeLong(path), callback);
+};
+
+fs.stat = function(path, callback) {
+  callback = makeCallback(callback);
+  if (!nullCheck(path, callback)) return;
+  binding.stat(pathModule._makeLong(path), callback);
+};
+
+fs.fstatSync = function(fd) {
+  return binding.fstat(fd);
+};
+
+fs.lstatSync = function(path) {
+  nullCheck(path);
+  return binding.lstat(pathModule._makeLong(path));
+};
+
+fs.statSync = function(path) {
+  nullCheck(path);
+  return binding.stat(pathModule._makeLong(path));
+};
+
+fs.readlink = function(path, callback) {
+  callback = makeCallback(callback);
+  if (!nullCheck(path, callback)) return;
+  binding.readlink(pathModule._makeLong(path), callback);
+};
+
+fs.readlinkSync = function(path) {
+  nullCheck(path);
+  return binding.readlink(pathModule._makeLong(path));
+};
+
+function preprocessSymlinkDestination(path, type) {
+  if (!isWindows) {
+    // No preprocessing is needed on Unix.
+    return path;
+  } else if (type === 'junction') {
+    // Junctions paths need to be absolute and \\?\-prefixed.
+    return pathModule._makeLong(path);
+  } else {
+    // Windows symlinks don't tolerate forward slashes.
+    return ('' + path).replace(/\//g, '\\');
+  }
+}
+
+fs.symlink = function(destination, path, type_, callback) {
+  var type = (typeof type_ === 'string' ? type_ : null);
+  var callback = makeCallback(arguments[arguments.length - 1]);
+
+  if (!nullCheck(destination, callback)) return;
+  if (!nullCheck(path, callback)) return;
+
+  binding.symlink(preprocessSymlinkDestination(destination, type),
+                  pathModule._makeLong(path),
+                  type,
+                  callback);
+};
+
+fs.symlinkSync = function(destination, path, type) {
+  type = (typeof type === 'string' ? type : null);
+
+  nullCheck(destination);
+  nullCheck(path);
+
+  return binding.symlink(preprocessSymlinkDestination(destination, type),
+                         pathModule._makeLong(path),
+                         type);
+};
+
+fs.link = function(srcpath, dstpath, callback) {
+  callback = makeCallback(callback);
+  if (!nullCheck(srcpath, callback)) return;
+  if (!nullCheck(dstpath, callback)) return;
+
+  binding.link(pathModule._makeLong(srcpath),
+               pathModule._makeLong(dstpath),
+               callback);
+};
+
+fs.linkSync = function(srcpath, dstpath) {
+  nullCheck(srcpath);
+  nullCheck(dstpath);
+  return binding.link(pathModule._makeLong(srcpath),
+                      pathModule._makeLong(dstpath));
+};
+
+fs.unlink = function(path, callback) {
+  callback = makeCallback(callback);
+  if (!nullCheck(path, callback)) return;
+  binding.unlink(pathModule._makeLong(path), callback);
+};
+
+fs.unlinkSync = function(path) {
+  nullCheck(path);
+  return binding.unlink(pathModule._makeLong(path));
+};
+
+fs.fchmod = function(fd, mode, callback) {
+  binding.fchmod(fd, modeNum(mode), makeCallback(callback));
+};
+
+fs.fchmodSync = function(fd, mode) {
+  return binding.fchmod(fd, modeNum(mode));
+};
+
+if (constants.hasOwnProperty('O_SYMLINK')) {
+  fs.lchmod = function(path, mode, callback) {
+    callback = maybeCallback(callback);
+    fs.open(path, constants.O_WRONLY | constants.O_SYMLINK, function(err, fd) {
+      if (err) {
+        callback(err);
+        return;
+      }
+      // prefer to return the chmod error, if one occurs,
+      // but still try to close, and report closing errors if they occur.
+      fs.fchmod(fd, mode, function(err) {
+        fs.close(fd, function(err2) {
+          callback(err || err2);
+        });
+      });
+    });
+  };
+
+  fs.lchmodSync = function(path, mode) {
+    var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK);
+
+    // prefer to return the chmod error, if one occurs,
+    // but still try to close, and report closing errors if they occur.
+    var err, err2;
+    try {
+      var ret = fs.fchmodSync(fd, mode);
+    } catch (er) {
+      err = er;
+    }
+    try {
+      fs.closeSync(fd);
+    } catch (er) {
+      err2 = er;
+    }
+    if (err || err2) throw (err || err2);
+    return ret;
+  };
+}
+
+
+fs.chmod = function(path, mode, callback) {
+  callback = makeCallback(callback);
+  if (!nullCheck(path, callback)) return;
+  binding.chmod(pathModule._makeLong(path),
+                modeNum(mode),
+                callback);
+};
+
+fs.chmodSync = function(path, mode) {
+  nullCheck(path);
+  return binding.chmod(pathModule._makeLong(path), modeNum(mode));
+};
+
+if (constants.hasOwnProperty('O_SYMLINK')) {
+  fs.lchown = function(path, uid, gid, callback) {
+    callback = maybeCallback(callback);
+    fs.open(path, constants.O_WRONLY | constants.O_SYMLINK, function(err, fd) {
+      if (err) {
+        callback(err);
+        return;
+      }
+      fs.fchown(fd, uid, gid, callback);
+    });
+  };
+
+  fs.lchownSync = function(path, uid, gid) {
+    var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK);
+    return fs.fchownSync(fd, uid, gid);
+  };
+}
+
+fs.fchown = function(fd, uid, gid, callback) {
+  binding.fchown(fd, uid, gid, makeCallback(callback));
+};
+
+fs.fchownSync = function(fd, uid, gid) {
+  return binding.fchown(fd, uid, gid);
+};
+
+fs.chown = function(path, uid, gid, callback) {
+  callback = makeCallback(callback);
+  if (!nullCheck(path, callback)) return;
+  binding.chown(pathModule._makeLong(path), uid, gid, callback);
+};
+
+fs.chownSync = function(path, uid, gid) {
+  nullCheck(path);
+  return binding.chown(pathModule._makeLong(path), uid, gid);
+};
+
+// converts Date or number to a fractional UNIX timestamp
+function toUnixTimestamp(time) {
+  if (typeof time == 'number') {
+    return time;
+  }
+  if (time instanceof Date) {
+    // convert to 123.456 UNIX timestamp
+    return time.getTime() / 1000;
+  }
+  throw new Error('Cannot parse time: ' + time);
+}
+
+// exported for unit tests, not for public consumption
+fs._toUnixTimestamp = toUnixTimestamp;
+
+fs.utimes = function(path, atime, mtime, callback) {
+  callback = makeCallback(callback);
+  if (!nullCheck(path, callback)) return;
+  binding.utimes(pathModule._makeLong(path),
+                 toUnixTimestamp(atime),
+                 toUnixTimestamp(mtime),
+                 callback);
+};
+
+fs.utimesSync = function(path, atime, mtime) {
+  nullCheck(path);
+  atime = toUnixTimestamp(atime);
+  mtime = toUnixTimestamp(mtime);
+  binding.utimes(pathModule._makeLong(path), atime, mtime);
+};
+
+fs.futimes = function(fd, atime, mtime, callback) {
+  atime = toUnixTimestamp(atime);
+  mtime = toUnixTimestamp(mtime);
+  binding.futimes(fd, atime, mtime, makeCallback(callback));
+};
+
+fs.futimesSync = function(fd, atime, mtime) {
+  atime = toUnixTimestamp(atime);
+  mtime = toUnixTimestamp(mtime);
+  binding.futimes(fd, atime, mtime);
+};
+
+function writeAll(fd, buffer, offset, length, position, callback) {
+  callback = maybeCallback(arguments[arguments.length - 1]);
+
+  // write(fd, buffer, offset, length, position, callback)
+  fs.write(fd, buffer, offset, length, position, function(writeErr, written) {
+    if (writeErr) {
+      fs.close(fd, function() {
+        if (callback) callback(writeErr);
+      });
+    } else {
+      if (written === length) {
+        fs.close(fd, callback);
+      } else {
+        offset += written;
+        length -= written;
+        position += written;
+        writeAll(fd, buffer, offset, length, position, callback);
+      }
+    }
+  });
+}
+
+fs.writeFile = function(path, data, encoding_, callback) {
+  var encoding = (typeof(encoding_) == 'string' ? encoding_ : 'utf8');
+  assertEncoding(encoding);
+
+  callback = maybeCallback(arguments[arguments.length - 1]);
+  fs.open(path, 'w', 438 /*=0666*/, function(openErr, fd) {
+    if (openErr) {
+      if (callback) callback(openErr);
+    } else {
+      var buffer = Buffer.isBuffer(data) ? data : new Buffer('' + data,
+          encoding);
+      writeAll(fd, buffer, 0, buffer.length, 0, callback);
+    }
+  });
+};
+
+fs.writeFileSync = function(path, data, encoding) {
+  assertEncoding(encoding);
+
+  var fd = fs.openSync(path, 'w');
+  if (!Buffer.isBuffer(data)) {
+    data = new Buffer('' + data, encoding || 'utf8');
+  }
+  var written = 0;
+  var length = data.length;
+  try {
+    while (written < length) {
+      written += fs.writeSync(fd, data, written, length - written, written);
+    }
+  } finally {
+    fs.closeSync(fd);
+  }
+};
+
+fs.appendFile = function(path, data, encoding_, callback) {
+  var encoding = (typeof(encoding_) == 'string' ? encoding_ : 'utf8');
+  assertEncoding(encoding);
+
+  callback = maybeCallback(arguments[arguments.length - 1]);
+
+  fs.open(path, 'a', 438 /*=0666*/, function(err, fd) {
+    if (err) return callback(err);
+    var buffer = Buffer.isBuffer(data) ? data : new Buffer('' + data, encoding);
+    writeAll(fd, buffer, 0, buffer.length, null, callback);
+  });
+};
+
+fs.appendFileSync = function(path, data, encoding) {
+  assertEncoding(encoding);
+
+  var fd = fs.openSync(path, 'a');
+  if (!Buffer.isBuffer(data)) {
+    data = new Buffer('' + data, encoding || 'utf8');
+  }
+  var written = 0;
+  var position = null;
+  var length = data.length;
+
+  try {
+    while (written < length) {
+      written += fs.writeSync(fd, data, written, length - written, position);
+      position += written; // XXX not safe with multiple concurrent writers?
+    }
+  } finally {
+    fs.closeSync(fd);
+  }
+};
+
+function errnoException(errorno, syscall) {
+  // TODO make this more compatible with ErrnoException from src/node.cc
+  // Once all of Node is using this function the ErrnoException from
+  // src/node.cc should be removed.
+  var e = new Error(syscall + ' ' + errorno);
+  e.errno = e.code = errorno;
+  e.syscall = syscall;
+  return e;
+}
+
+
+function FSWatcher() {
+  EventEmitter.call(this);
+
+  var self = this;
+  var FSEvent = process.binding('fs_event_wrap').FSEvent;
+  this._handle = new FSEvent();
+  this._handle.owner = this;
+
+  this._handle.onchange = function(status, event, filename) {
+    if (status) {
+      self._handle.close();
+      self.emit('error', errnoException(errno, 'watch'));
+    } else {
+      self.emit('change', event, filename);
+    }
+  };
+}
+util.inherits(FSWatcher, EventEmitter);
+
+FSWatcher.prototype.start = function(filename, persistent) {
+  nullCheck(filename);
+  var r = this._handle.start(pathModule._makeLong(filename), persistent);
+
+  if (r) {
+    this._handle.close();
+    throw errnoException(errno, 'watch');
+  }
+};
+
+FSWatcher.prototype.close = function() {
+  this._handle.close();
+};
+
+fs.watch = function(filename) {
+  nullCheck(filename);
+  var watcher;
+  var options;
+  var listener;
+
+  if ('object' == typeof arguments[1]) {
+    options = arguments[1];
+    listener = arguments[2];
+  } else {
+    options = {};
+    listener = arguments[1];
+  }
+
+  if (options.persistent === undefined) options.persistent = true;
+
+  watcher = new FSWatcher();
+  watcher.start(filename, options.persistent);
+
+  if (listener) {
+    watcher.addListener('change', listener);
+  }
+
+  return watcher;
+};
+
+
+// Stat Change Watchers
+
+function StatWatcher() {
+  EventEmitter.call(this);
+
+  var self = this;
+  this._handle = new binding.StatWatcher();
+
+  // uv_fs_poll is a little more powerful than ev_stat but we curb it for
+  // the sake of backwards compatibility
+  var oldStatus = -1;
+
+  this._handle.onchange = function(current, previous, newStatus) {
+    if (oldStatus === -1 &&
+        newStatus === -1 &&
+        current.nlink === previous.nlink) return;
+
+    oldStatus = newStatus;
+    self.emit('change', current, previous);
+  };
+
+  this._handle.onstop = function() {
+    self.emit('stop');
+  };
+}
+util.inherits(StatWatcher, EventEmitter);
+
+
+StatWatcher.prototype.start = function(filename, persistent, interval) {
+  nullCheck(filename);
+  this._handle.start(pathModule._makeLong(filename), persistent, interval);
+};
+
+
+StatWatcher.prototype.stop = function() {
+  this._handle.stop();
+};
+
+
+var statWatchers = {};
+function inStatWatchers(filename) {
+  return Object.prototype.hasOwnProperty.call(statWatchers, filename) &&
+      statWatchers[filename];
+}
+
+
+fs.watchFile = function(filename) {
+  nullCheck(filename);
+  var stat;
+  var listener;
+
+  var options = {
+    // Poll interval in milliseconds. 5007 is what libev used to use. It's
+    // a little on the slow side but let's stick with it for now to keep
+    // behavioral changes to a minimum.
+    interval: 5007,
+    persistent: true
+  };
+
+  if ('object' == typeof arguments[1]) {
+    options = util._extend(options, arguments[1]);
+    listener = arguments[2];
+  } else {
+    listener = arguments[1];
+  }
+
+  if (!listener) {
+    throw new Error('watchFile requires a listener function');
+  }
+
+  if (inStatWatchers(filename)) {
+    stat = statWatchers[filename];
+  } else {
+    stat = statWatchers[filename] = new StatWatcher();
+    stat.start(filename, options.persistent, options.interval);
+  }
+  stat.addListener('change', listener);
+  return stat;
+};
+
+fs.unwatchFile = function(filename, listener) {
+  nullCheck(filename);
+  if (!inStatWatchers(filename)) return;
+
+  var stat = statWatchers[filename];
+
+  if (typeof listener === 'function') {
+    stat.removeListener('change', listener);
+  } else {
+    stat.removeAllListeners('change');
+  }
+
+  if (stat.listeners('change').length === 0) {
+    stat.stop();
+    statWatchers[filename] = undefined;
+  }
+};
+
+// Realpath
+// Not using realpath(2) because it's bad.
+// See: http://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html
+
+var normalize = pathModule.normalize;
+
+// Regexp that finds the next partion of a (partial) path
+// result is [base_with_slash, base], e.g. ['somedir/', 'somedir']
+if (isWindows) {
+  var nextPartRe = /(.*?)(?:[\/\\]+|$)/g;
+} else {
+  var nextPartRe = /(.*?)(?:[\/]+|$)/g;
+}
+
+// Regex to find the device root, including trailing slash. E.g. 'c:\\'.
+if (isWindows) {
+  var splitRootRe = /^(?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?[\\\/]*/;
+} else {
+  var splitRootRe = /^[\/]*/;
+}
+
+fs.realpathSync = function realpathSync(p, cache) {
+  // make p is absolute
+  p = pathModule.resolve(p);
+
+  if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {
+    return cache[p];
+  }
+
+  var original = p,
+      seenLinks = {},
+      knownHard = {};
+
+  // current character position in p
+  var pos;
+  // the partial path so far, including a trailing slash if any
+  var current;
+  // the partial path without a trailing slash (except when pointing at a root)
+  var base;
+  // the partial path scanned in the previous round, with slash
+  var previous;
+
+  start();
+
+  function start() {
+    // Skip over roots
+    var m = splitRootRe.exec(p);
+    pos = m[0].length;
+    current = m[0];
+    base = m[0];
+    previous = '';
+
+    // On windows, check that the root exists. On unix there is no need.
+    if (isWindows && !knownHard[base]) {
+      fs.lstatSync(base);
+      knownHard[base] = true;
+    }
+  }
+
+  // walk down the path, swapping out linked pathparts for their real
+  // values
+  // NB: p.length changes.
+  while (pos < p.length) {
+    // find the next part
+    nextPartRe.lastIndex = pos;
+    var result = nextPartRe.exec(p);
+    previous = current;
+    current += result[0];
+    base = previous + result[1];
+    pos = nextPartRe.lastIndex;
+
+    // continue if not a symlink
+    if (knownHard[base] || (cache && cache[base] === base)) {
+      continue;
+    }
+
+    var resolvedLink;
+    if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {
+      // some known symbolic link.  no need to stat again.
+      resolvedLink = cache[base];
+    } else {
+      var stat = fs.lstatSync(base);
+      if (!stat.isSymbolicLink()) {
+        knownHard[base] = true;
+        if (cache) cache[base] = base;
+        continue;
+      }
+
+      // read the link if it wasn't read before
+      // dev/ino always return 0 on windows, so skip the check.
+      var linkTarget = null;
+      if (!isWindows) {
+        var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);
+        if (seenLinks.hasOwnProperty(id)) {
+          linkTarget = seenLinks[id];
+        }
+      }
+      if (linkTarget === null) {
+        fs.statSync(base);
+        linkTarget = fs.readlinkSync(base);
+      }
+      resolvedLink = pathModule.resolve(previous, linkTarget);
+      // track this, if given a cache.
+      if (cache) cache[base] = resolvedLink;
+      if (!isWindows) seenLinks[id] = linkTarget;
+    }
+
+    // resolve the link, then start over
+    p = pathModule.resolve(resolvedLink, p.slice(pos));
+    start();
+  }
+
+  if (cache) cache[original] = p;
+
+  return p;
+};
+
+
+fs.realpath = function realpath(p, cache, cb) {
+  if (typeof cb !== 'function') {
+    cb = maybeCallback(cache);
+    cache = null;
+  }
+
+  // make p is absolute
+  p = pathModule.resolve(p);
+
+  if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {
+    return process.nextTick(cb.bind(null, null, cache[p]));
+  }
+
+  var original = p,
+      seenLinks = {},
+      knownHard = {};
+
+  // current character position in p
+  var pos;
+  // the partial path so far, including a trailing slash if any
+  var current;
+  // the partial path without a trailing slash (except when pointing at a root)
+  var base;
+  // the partial path scanned in the previous round, with slash
+  var previous;
+
+  start();
+
+  function start() {
+    // Skip over roots
+    var m = splitRootRe.exec(p);
+    pos = m[0].length;
+    current = m[0];
+    base = m[0];
+    previous = '';
+
+    // On windows, check that the root exists. On unix there is no need.
+    if (isWindows && !knownHard[base]) {
+      fs.lstat(base, function(err) {
+        if (err) return cb(err);
+        knownHard[base] = true;
+        LOOP();
+      });
+    } else {
+      process.nextTick(LOOP);
+    }
+  }
+
+  // walk down the path, swapping out linked pathparts for their real
+  // values
+  function LOOP() {
+    // stop if scanned past end of path
+    if (pos >= p.length) {
+      if (cache) cache[original] = p;
+      return cb(null, p);
+    }
+
+    // find the next part
+    nextPartRe.lastIndex = pos;
+    var result = nextPartRe.exec(p);
+    previous = current;
+    current += result[0];
+    base = previous + result[1];
+    pos = nextPartRe.lastIndex;
+
+    // continue if not a symlink
+    if (knownHard[base] || (cache && cache[base] === base)) {
+      return process.nextTick(LOOP);
+    }
+
+    if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {
+      // known symbolic link.  no need to stat again.
+      return gotResolvedLink(cache[base]);
+    }
+
+    return fs.lstat(base, gotStat);
+  }
+
+  function gotStat(err, stat) {
+    if (err) return cb(err);
+
+    // if not a symlink, skip to the next path part
+    if (!stat.isSymbolicLink()) {
+      knownHard[base] = true;
+      if (cache) cache[base] = base;
+      return process.nextTick(LOOP);
+    }
+
+    // stat & read the link if not read before
+    // call gotTarget as soon as the link target is known
+    // dev/ino always return 0 on windows, so skip the check.
+    if (!isWindows) {
+      var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);
+      if (seenLinks.hasOwnProperty(id)) {
+        return gotTarget(null, seenLinks[id], base);
+      }
+    }
+    fs.stat(base, function(err) {
+      if (err) return cb(err);
+
+      fs.readlink(base, function(err, target) {
+        if (!isWindows) seenLinks[id] = target;
+        gotTarget(err, target);
+      });
+    });
+  }
+
+  function gotTarget(err, target, base) {
+    if (err) return cb(err);
+
+    var resolvedLink = pathModule.resolve(previous, target);
+    if (cache) cache[base] = resolvedLink;
+    gotResolvedLink(resolvedLink);
+  }
+
+  function gotResolvedLink(resolvedLink) {
+    // resolve the link, then start over
+    p = pathModule.resolve(resolvedLink, p.slice(pos));
+    start();
+  }
+};
+
+
+
+var pool;
+
+function allocNewPool() {
+  pool = new Buffer(kPoolSize);
+  pool.used = 0;
+}
+
+
+
+fs.createReadStream = function(path, options) {
+  return new ReadStream(path, options);
+};
+
+util.inherits(ReadStream, Readable);
+fs.ReadStream = ReadStream;
+
+function ReadStream(path, options) {
+  if (!(this instanceof ReadStream))
+    return new ReadStream(path, options);
+
+  // a little bit bigger buffer and water marks by default
+  options = util._extend({
+    bufferSize: 64 * 1024,
+    lowWaterMark: 16 * 1024,
+    highWaterMark: 64 * 1024
+  }, options || {});
+
+  Readable.call(this, options);
+
+  this.path = path;
+  this.fd = options.hasOwnProperty('fd') ? options.fd : null;
+  this.flags = options.hasOwnProperty('flags') ? options.flags : 'r';
+  this.mode = options.hasOwnProperty('mode') ? options.mode : 438; /*=0666*/
+
+  this.start = options.hasOwnProperty('start') ? options.start : undefined;
+  this.end = options.hasOwnProperty('start') ? options.end : undefined;
+  this.pos = undefined;
+
+  if (this.start !== undefined) {
+    if ('number' !== typeof this.start) {
+      throw TypeError('start must be a Number');
+    }
+    if (this.end === undefined) {
+      this.end = Infinity;
+    } else if ('number' !== typeof this.end) {
+      throw TypeError('end must be a Number');
+    }
+
+    if (this.start > this.end) {
+      throw new Error('start must be <= end');
+    }
+
+    this.pos = this.start;
+  }
+
+  if (typeof this.fd !== 'number')
+    this.open();
+
+  this.on('end', function() {
+    this.destroy();
+  });
+}
+
+fs.FileReadStream = fs.ReadStream; // support the legacy name
+
+ReadStream.prototype.open = function() {
+  var self = this;
+  fs.open(this.path, this.flags, this.mode, function(er, fd) {
+    if (er) {
+      self.destroy();
+      self.emit('error', er);
+      return;
+    }
+
+    self.fd = fd;
+    self.emit('open', fd);
+    // start the flow of data.
+    self.read();
+  });
+};
+
+ReadStream.prototype._read = function(n, cb) {
+  if (typeof this.fd !== 'number')
+    return this.once('open', function() {
+      this._read(n, cb);
+    });
+
+  if (this.destroyed)
+    return;
+
+  if (!pool || pool.length - pool.used < kMinPoolSpace) {
+    // discard the old pool. Can't add to the free list because
+    // users might have refernces to slices on it.
+    pool = null;
+    allocNewPool();
+  }
+
+  // Grab another reference to the pool in the case that while we're
+  // in the thread pool another read() finishes up the pool, and
+  // allocates a new one.
+  var thisPool = pool;
+  var toRead = Math.min(pool.length - pool.used, n);
+  var start = pool.used;
+
+  if (this.pos !== undefined)
+    toRead = Math.min(this.end - this.pos + 1, toRead);
+
+  // already read everything we were supposed to read!
+  // treat as EOF.
+  if (toRead <= 0)
+    return cb();
+
+  // the actual read.
+  var self = this;
+  fs.read(this.fd, pool, pool.used, toRead, this.pos, onread);
+
+  // move the pool positions, and internal position for reading.
+  if (this.pos !== undefined)
+    this.pos += toRead;
+  pool.used += toRead;
+
+  function onread(er, bytesRead) {
+    if (er) {
+      self.destroy();
+      return cb(er);
+    }
+
+    var b = null;
+    if (bytesRead > 0)
+      b = thisPool.slice(start, start + bytesRead);
+
+    cb(null, b);
+  }
+};
+
+
+ReadStream.prototype.destroy = function() {
+  if (this.destroyed)
+    return;
+  this.destroyed = true;
+  if ('number' === typeof this.fd)
+    this.close();
+};
+
+
+ReadStream.prototype.close = function(cb) {
+  if (cb)
+    this.once('close', cb);
+  if (this.closed || 'number' !== typeof this.fd) {
+    if ('number' !== typeof this.fd)
+      this.once('open', close);
+    return process.nextTick(this.emit.bind(this, 'close'));
+  }
+  this.closed = true;
+  var self = this;
+  close();
+
+  function close() {
+    fs.close(self.fd, function(er) {
+      if (er)
+        self.emit('error', er);
+      else
+        self.emit('close');
+    });
+  }
+};
+
+
+
+
+fs.createWriteStream = function(path, options) {
+  return new WriteStream(path, options);
+};
+
+util.inherits(WriteStream, Writable);
+fs.WriteStream = WriteStream;
+function WriteStream(path, options) {
+  if (!(this instanceof WriteStream))
+    return new WriteStream(path, options);
+
+  // a little bit bigger buffer and water marks by default
+  options = util._extend({
+    bufferSize: 64 * 1024,
+    lowWaterMark: 16 * 1024,
+    highWaterMark: 64 * 1024
+  }, options || {});
+
+  Writable.call(this, options);
+
+  this.path = path;
+  this.fd = null;
+
+  this.fd = options.hasOwnProperty('fd') ? options.fd : null;
+  this.flags = options.hasOwnProperty('flags') ? options.flags : 'w';
+  this.mode = options.hasOwnProperty('mode') ? options.mode : 438; /*=0666*/
+
+  this.start = options.hasOwnProperty('start') ? options.start : undefined;
+  this.pos = undefined;
+  this.bytesWritten = 0;
+
+  if (this.start !== undefined) {
+    if ('number' !== typeof this.start) {
+      throw TypeError('start must be a Number');
+    }
+    if (this.start < 0) {
+      throw new Error('start must be >= zero');
+    }
+
+    this.pos = this.start;
+  }
+
+  if ('number' !== typeof this.fd)
+    this.open();
+
+  // dispose on finish.
+  this.once('finish', this.close);
+}
+
+fs.FileWriteStream = fs.WriteStream; // support the legacy name
+
+
+WriteStream.prototype.open = function() {
+  fs.open(this.path, this.flags, this.mode, function(er, fd) {
+    if (er) {
+      this.destroy();
+      this.emit('error', er);
+      return;
+    }
+
+    this.fd = fd;
+    this.emit('open', fd);
+  }.bind(this));
+};
+
+
+WriteStream.prototype._write = function(data, cb) {
+  if (!Buffer.isBuffer(data))
+    return this.emit('error', new Error('Invalid data'));
+
+  if (typeof this.fd !== 'number')
+    return this.once('open', this._write.bind(this, data, cb));
+
+  fs.write(this.fd, data, 0, data.length, this.pos, function(er, bytes) {
+    if (er) {
+      this.destroy();
+      return cb(er);
+    }
+    this.bytesWritten += bytes;
+    cb();
+  }.bind(this));
+
+  if (this.pos !== undefined)
+    this.pos += data.length;
+};
+
+
+WriteStream.prototype.destroy = ReadStream.prototype.destroy;
+WriteStream.prototype.close = ReadStream.prototype.close;
+
+// There is no shutdown() for files.
+WriteStream.prototype.destroySoon = WriteStream.prototype.end;
+
+
+// SyncWriteStream is internal. DO NOT USE.
+// Temporary hack for process.stdout and process.stderr when piped to files.
+function SyncWriteStream(fd) {
+  Stream.call(this);
+
+  this.fd = fd;
+  this.writable = true;
+  this.readable = false;
+}
+
+util.inherits(SyncWriteStream, Stream);
+
+
+// Export
+fs.SyncWriteStream = SyncWriteStream;
+
+
+SyncWriteStream.prototype.write = function(data, arg1, arg2) {
+  var encoding, cb;
+
+  // parse arguments
+  if (arg1) {
+    if (typeof arg1 === 'string') {
+      encoding = arg1;
+      cb = arg2;
+    } else if (typeof arg1 === 'function') {
+      cb = arg1;
+    } else {
+      throw new Error('bad arg');
+    }
+  }
+  assertEncoding(encoding);
+
+  // Change strings to buffers. SLOW
+  if (typeof data == 'string') {
+    data = new Buffer(data, encoding);
+  }
+
+  fs.writeSync(this.fd, data, 0, data.length);
+
+  if (cb) {
+    process.nextTick(cb);
+  }
+
+  return true;
+};
+
+
+SyncWriteStream.prototype.end = function(data, arg1, arg2) {
+  if (data) {
+    this.write(data, arg1, arg2);
+  }
+  this.destroy();
+};
+
+
+SyncWriteStream.prototype.destroy = function() {
+  fs.closeSync(this.fd);
+  this.fd = null;
+  this.emit('close');
+  return true;
+};
+
+SyncWriteStream.prototype.destroySoon = SyncWriteStream.prototype.destroy;
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_duplex.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_duplex.js
new file mode 100644
index 0000000..a2e0d8e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_duplex.js
@@ -0,0 +1,69 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+// a duplex stream is just a stream that is both readable and writable.
+// Since JS doesn't have multiple prototypal inheritance, this class
+// prototypally inherits from Readable, and then parasitically from
+// Writable.
+
+module.exports = Duplex;
+var util = require('util');
+var Readable = require('./_stream_readable');
+var Writable = require('./_stream_writable');
+
+util.inherits(Duplex, Readable);
+
+Object.keys(Writable.prototype).forEach(function(method) {
+  if (!Duplex.prototype[method])
+    Duplex.prototype[method] = Writable.prototype[method];
+});
+
+function Duplex(options) {
+  if (!(this instanceof Duplex))
+    return new Duplex(options);
+
+  Readable.call(this, options);
+  Writable.call(this, options);
+
+  if (options && options.readable === false)
+    this.readable = false;
+
+  if (options && options.writable === false)
+    this.writable = false;
+
+  this.allowHalfOpen = true;
+  if (options && options.allowHalfOpen === false)
+    this.allowHalfOpen = false;
+
+  this.once('end', onend);
+}
+
+// the no-half-open enforcer
+function onend() {
+  // if we allow half-open state, or if the writable side ended,
+  // then we're ok.
+  if (this.allowHalfOpen || this._writableState.ended)
+    return;
+
+  // no more data can be written.
+  // But allow more writes to happen in this tick.
+  process.nextTick(this.end.bind(this));
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_passthrough.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_passthrough.js
new file mode 100644
index 0000000..330c247
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_passthrough.js
@@ -0,0 +1,41 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+// a passthrough stream.
+// basically just the most minimal sort of Transform stream.
+// Every written chunk gets output as-is.
+
+module.exports = PassThrough;
+
+var Transform = require('./_stream_transform');
+var util = require('util');
+util.inherits(PassThrough, Transform);
+
+function PassThrough(options) {
+  if (!(this instanceof PassThrough))
+    return new PassThrough(options);
+
+  Transform.call(this, options);
+}
+
+PassThrough.prototype._transform = function(chunk, encoding, cb) {
+  cb(null, chunk);
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_readable.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_readable.js
new file mode 100644
index 0000000..3c9da08
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_readable.js
@@ -0,0 +1,927 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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 = Readable;
+Readable.ReadableState = ReadableState;
+
+var EE = require('events').EventEmitter;
+if (!EE.listenerCount) EE.listenerCount = function(emitter, type) {
+  return emitter.listeners(type).length;
+};
+var Stream = require('stream');
+var util = require('util');
+var StringDecoder;
+
+util.inherits(Readable, Stream);
+
+function ReadableState(options, stream) {
+  options = options || {};
+
+  // the point at which it stops calling _read() to fill the buffer
+  // Note: 0 is a valid value, means "don't call _read preemptively ever"
+  var hwm = options.highWaterMark;
+  this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024;
+
+  // cast to ints.
+  this.highWaterMark = ~~this.highWaterMark;
+
+  this.buffer = [];
+  this.length = 0;
+  this.pipes = null;
+  this.pipesCount = 0;
+  this.flowing = false;
+  this.ended = false;
+  this.endEmitted = false;
+  this.reading = false;
+
+  // In streams that never have any data, and do push(null) right away,
+  // the consumer can miss the 'end' event if they do some I/O before
+  // consuming the stream.  So, we don't emit('end') until some reading
+  // happens.
+  this.calledRead = false;
+
+  // a flag to be able to tell if the onwrite cb is called immediately,
+  // or on a later tick.  We set this to true at first, becuase any
+  // actions that shouldn't happen until "later" should generally also
+  // not happen before the first write call.
+  this.sync = true;
+
+  // whenever we return null, then we set a flag to say
+  // that we're awaiting a 'readable' event emission.
+  this.needReadable = false;
+  this.emittedReadable = false;
+  this.readableListening = false;
+
+
+  // object stream flag. Used to make read(n) ignore n and to
+  // make all the buffer merging and length checks go away
+  this.objectMode = !!options.objectMode;
+
+  // Crypto is kind of old and crusty.  Historically, its default string
+  // encoding is 'binary' so we have to make this configurable.
+  // Everything else in the universe uses 'utf8', though.
+  this.defaultEncoding = options.defaultEncoding || 'utf8';
+
+  // when piping, we only care about 'readable' events that happen
+  // after read()ing all the bytes and not getting any pushback.
+  this.ranOut = false;
+
+  // the number of writers that are awaiting a drain event in .pipe()s
+  this.awaitDrain = 0;
+
+  // if true, a maybeReadMore has been scheduled
+  this.readingMore = false;
+
+  this.decoder = null;
+  this.encoding = null;
+  if (options.encoding) {
+    if (!StringDecoder)
+      StringDecoder = require('string_decoder').StringDecoder;
+    this.decoder = new StringDecoder(options.encoding);
+    this.encoding = options.encoding;
+  }
+}
+
+function Readable(options) {
+  if (!(this instanceof Readable))
+    return new Readable(options);
+
+  this._readableState = new ReadableState(options, this);
+
+  // legacy
+  this.readable = true;
+
+  Stream.call(this);
+}
+
+// Manually shove something into the read() buffer.
+// This returns true if the highWaterMark has not been hit yet,
+// similar to how Writable.write() returns true if you should
+// write() some more.
+Readable.prototype.push = function(chunk, encoding) {
+  var state = this._readableState;
+
+  if (typeof chunk === 'string' && !state.objectMode) {
+    encoding = encoding || state.defaultEncoding;
+    if (encoding !== state.encoding) {
+      chunk = new Buffer(chunk, encoding);
+      encoding = '';
+    }
+  }
+
+  return readableAddChunk(this, state, chunk, encoding, false);
+};
+
+// Unshift should *always* be something directly out of read()
+Readable.prototype.unshift = function(chunk) {
+  var state = this._readableState;
+  return readableAddChunk(this, state, chunk, '', true);
+};
+
+function readableAddChunk(stream, state, chunk, encoding, addToFront) {
+  var er = chunkInvalid(state, chunk);
+  if (er) {
+    stream.emit('error', er);
+  } else if (chunk === null || chunk === undefined) {
+    state.reading = false;
+    if (!state.ended)
+      onEofChunk(stream, state);
+  } else if (state.objectMode || chunk && chunk.length > 0) {
+    if (state.ended && !addToFront) {
+      var e = new Error('stream.push() after EOF');
+      stream.emit('error', e);
+    } else if (state.endEmitted && addToFront) {
+      var e = new Error('stream.unshift() after end event');
+      stream.emit('error', e);
+    } else {
+      if (state.decoder && !addToFront && !encoding)
+        chunk = state.decoder.write(chunk);
+
+      // update the buffer info.
+      state.length += state.objectMode ? 1 : chunk.length;
+      if (addToFront) {
+        state.buffer.unshift(chunk);
+      } else {
+        state.reading = false;
+        state.buffer.push(chunk);
+      }
+
+      if (state.needReadable)
+        emitReadable(stream);
+
+      maybeReadMore(stream, state);
+    }
+  } else if (!addToFront) {
+    state.reading = false;
+  }
+
+  return needMoreData(state);
+}
+
+
+
+// if it's past the high water mark, we can push in some more.
+// Also, if we have no data yet, we can stand some
+// more bytes.  This is to work around cases where hwm=0,
+// such as the repl.  Also, if the push() triggered a
+// readable event, and the user called read(largeNumber) such that
+// needReadable was set, then we ought to push more, so that another
+// 'readable' event will be triggered.
+function needMoreData(state) {
+  return !state.ended &&
+         (state.needReadable ||
+          state.length < state.highWaterMark ||
+          state.length === 0);
+}
+
+// backwards compatibility.
+Readable.prototype.setEncoding = function(enc) {
+  if (!StringDecoder)
+    StringDecoder = require('string_decoder').StringDecoder;
+  this._readableState.decoder = new StringDecoder(enc);
+  this._readableState.encoding = enc;
+};
+
+// Don't raise the hwm > 128MB
+var MAX_HWM = 0x800000;
+function roundUpToNextPowerOf2(n) {
+  if (n >= MAX_HWM) {
+    n = MAX_HWM;
+  } else {
+    // Get the next highest power of 2
+    n--;
+    for (var p = 1; p < 32; p <<= 1) n |= n >> p;
+    n++;
+  }
+  return n;
+}
+
+function howMuchToRead(n, state) {
+  if (state.length === 0 && state.ended)
+    return 0;
+
+  if (state.objectMode)
+    return n === 0 ? 0 : 1;
+
+  if (isNaN(n) || n === null) {
+    // only flow one buffer at a time
+    if (state.flowing && state.buffer.length)
+      return state.buffer[0].length;
+    else
+      return state.length;
+  }
+
+  if (n <= 0)
+    return 0;
+
+  // If we're asking for more than the target buffer level,
+  // then raise the water mark.  Bump up to the next highest
+  // power of 2, to prevent increasing it excessively in tiny
+  // amounts.
+  if (n > state.highWaterMark)
+    state.highWaterMark = roundUpToNextPowerOf2(n);
+
+  // don't have that much.  return null, unless we've ended.
+  if (n > state.length) {
+    if (!state.ended) {
+      state.needReadable = true;
+      return 0;
+    } else
+      return state.length;
+  }
+
+  return n;
+}
+
+// you can override either this method, or the async _read(n) below.
+Readable.prototype.read = function(n) {
+  var state = this._readableState;
+  state.calledRead = true;
+  var nOrig = n;
+
+  if (typeof n !== 'number' || n > 0)
+    state.emittedReadable = false;
+
+  // if we're doing read(0) to trigger a readable event, but we
+  // already have a bunch of data in the buffer, then just trigger
+  // the 'readable' event and move on.
+  if (n === 0 &&
+      state.needReadable &&
+      (state.length >= state.highWaterMark || state.ended)) {
+    emitReadable(this);
+    return null;
+  }
+
+  n = howMuchToRead(n, state);
+
+  // if we've ended, and we're now clear, then finish it up.
+  if (n === 0 && state.ended) {
+    if (state.length === 0)
+      endReadable(this);
+    return null;
+  }
+
+  // All the actual chunk generation logic needs to be
+  // *below* the call to _read.  The reason is that in certain
+  // synthetic stream cases, such as passthrough streams, _read
+  // may be a completely synchronous operation which may change
+  // the state of the read buffer, providing enough data when
+  // before there was *not* enough.
+  //
+  // So, the steps are:
+  // 1. Figure out what the state of things will be after we do
+  // a read from the buffer.
+  //
+  // 2. If that resulting state will trigger a _read, then call _read.
+  // Note that this may be asynchronous, or synchronous.  Yes, it is
+  // deeply ugly to write APIs this way, but that still doesn't mean
+  // that the Readable class should behave improperly, as streams are
+  // designed to be sync/async agnostic.
+  // Take note if the _read call is sync or async (ie, if the read call
+  // has returned yet), so that we know whether or not it's safe to emit
+  // 'readable' etc.
+  //
+  // 3. Actually pull the requested chunks out of the buffer and return.
+
+  // if we need a readable event, then we need to do some reading.
+  var doRead = state.needReadable;
+
+  // if we currently have less than the highWaterMark, then also read some
+  if (state.length - n <= state.highWaterMark)
+    doRead = true;
+
+  // however, if we've ended, then there's no point, and if we're already
+  // reading, then it's unnecessary.
+  if (state.ended || state.reading)
+    doRead = false;
+
+  if (doRead) {
+    state.reading = true;
+    state.sync = true;
+    // if the length is currently zero, then we *need* a readable event.
+    if (state.length === 0)
+      state.needReadable = true;
+    // call internal read method
+    this._read(state.highWaterMark);
+    state.sync = false;
+  }
+
+  // If _read called its callback synchronously, then `reading`
+  // will be false, and we need to re-evaluate how much data we
+  // can return to the user.
+  if (doRead && !state.reading)
+    n = howMuchToRead(nOrig, state);
+
+  var ret;
+  if (n > 0)
+    ret = fromList(n, state);
+  else
+    ret = null;
+
+  if (ret === null) {
+    state.needReadable = true;
+    n = 0;
+  }
+
+  state.length -= n;
+
+  // If we have nothing in the buffer, then we want to know
+  // as soon as we *do* get something into the buffer.
+  if (state.length === 0 && !state.ended)
+    state.needReadable = true;
+
+  // If we happened to read() exactly the remaining amount in the
+  // buffer, and the EOF has been seen at this point, then make sure
+  // that we emit 'end' on the very next tick.
+  if (state.ended && !state.endEmitted && state.length === 0)
+    endReadable(this);
+
+  return ret;
+};
+
+function chunkInvalid(state, chunk) {
+  var er = null;
+  if (!Buffer.isBuffer(chunk) &&
+      'string' !== typeof chunk &&
+      chunk !== null &&
+      chunk !== undefined &&
+      !state.objectMode &&
+      !er) {
+    er = new TypeError('Invalid non-string/buffer chunk');
+  }
+  return er;
+}
+
+
+function onEofChunk(stream, state) {
+  if (state.decoder && !state.ended) {
+    var chunk = state.decoder.end();
+    if (chunk && chunk.length) {
+      state.buffer.push(chunk);
+      state.length += state.objectMode ? 1 : chunk.length;
+    }
+  }
+  state.ended = true;
+
+  // if we've ended and we have some data left, then emit
+  // 'readable' now to make sure it gets picked up.
+  if (state.length > 0)
+    emitReadable(stream);
+  else
+    endReadable(stream);
+}
+
+// Don't emit readable right away in sync mode, because this can trigger
+// another read() call => stack overflow.  This way, it might trigger
+// a nextTick recursion warning, but that's not so bad.
+function emitReadable(stream) {
+  var state = stream._readableState;
+  state.needReadable = false;
+  if (state.emittedReadable)
+    return;
+
+  state.emittedReadable = true;
+  if (state.sync)
+    process.nextTick(function() {
+      emitReadable_(stream);
+    });
+  else
+    emitReadable_(stream);
+}
+
+function emitReadable_(stream) {
+  stream.emit('readable');
+}
+
+
+// at this point, the user has presumably seen the 'readable' event,
+// and called read() to consume some data.  that may have triggered
+// in turn another _read(n) call, in which case reading = true if
+// it's in progress.
+// However, if we're not ended, or reading, and the length < hwm,
+// then go ahead and try to read some more preemptively.
+function maybeReadMore(stream, state) {
+  if (!state.readingMore) {
+    state.readingMore = true;
+    process.nextTick(function() {
+      maybeReadMore_(stream, state);
+    });
+  }
+}
+
+function maybeReadMore_(stream, state) {
+  var len = state.length;
+  while (!state.reading && !state.flowing && !state.ended &&
+         state.length < state.highWaterMark) {
+    stream.read(0);
+    if (len === state.length)
+      // didn't get any data, stop spinning.
+      break;
+    else
+      len = state.length;
+  }
+  state.readingMore = false;
+}
+
+// abstract method.  to be overridden in specific implementation classes.
+// call cb(er, data) where data is <= n in length.
+// for virtual (non-string, non-buffer) streams, "length" is somewhat
+// arbitrary, and perhaps not very meaningful.
+Readable.prototype._read = function(n) {
+  this.emit('error', new Error('not implemented'));
+};
+
+Readable.prototype.pipe = function(dest, pipeOpts) {
+  var src = this;
+  var state = this._readableState;
+
+  switch (state.pipesCount) {
+    case 0:
+      state.pipes = dest;
+      break;
+    case 1:
+      state.pipes = [state.pipes, dest];
+      break;
+    default:
+      state.pipes.push(dest);
+      break;
+  }
+  state.pipesCount += 1;
+
+  var doEnd = (!pipeOpts || pipeOpts.end !== false) &&
+              dest !== process.stdout &&
+              dest !== process.stderr;
+
+  var endFn = doEnd ? onend : cleanup;
+  if (state.endEmitted)
+    process.nextTick(endFn);
+  else
+    src.once('end', endFn);
+
+  dest.on('unpipe', onunpipe);
+  function onunpipe(readable) {
+    if (readable !== src) return;
+    cleanup();
+  }
+
+  function onend() {
+    dest.end();
+  }
+
+  // when the dest drains, it reduces the awaitDrain counter
+  // on the source.  This would be more elegant with a .once()
+  // handler in flow(), but adding and removing repeatedly is
+  // too slow.
+  var ondrain = pipeOnDrain(src);
+  dest.on('drain', ondrain);
+
+  function cleanup() {
+    // cleanup event handlers once the pipe is broken
+    dest.removeListener('close', onclose);
+    dest.removeListener('finish', onfinish);
+    dest.removeListener('drain', ondrain);
+    dest.removeListener('error', onerror);
+    dest.removeListener('unpipe', onunpipe);
+    src.removeListener('end', onend);
+    src.removeListener('end', cleanup);
+
+    // if the reader is waiting for a drain event from this
+    // specific writer, then it would cause it to never start
+    // flowing again.
+    // So, if this is awaiting a drain, then we just call it now.
+    // If we don't know, then assume that we are waiting for one.
+    if (!dest._writableState || dest._writableState.needDrain)
+      ondrain();
+  }
+
+  // if the dest has an error, then stop piping into it.
+  // however, don't suppress the throwing behavior for this.
+  function onerror(er) {
+    unpipe();
+    dest.removeListener('error', onerror);
+    if (EE.listenerCount(dest, 'error') === 0)
+      dest.emit('error', er);
+  }
+  // This is a brutally ugly hack to make sure that our error handler
+  // is attached before any userland ones.  NEVER DO THIS.
+  if (!dest._events.error)
+    dest.on('error', onerror);
+  else if (Array.isArray(dest._events.error))
+    dest._events.error.unshift(onerror);
+  else
+    dest._events.error = [onerror, dest._events.error];
+
+
+
+  // Both close and finish should trigger unpipe, but only once.
+  function onclose() {
+    dest.removeListener('finish', onfinish);
+    unpipe();
+  }
+  dest.once('close', onclose);
+  function onfinish() {
+    dest.removeListener('close', onclose);
+    unpipe();
+  }
+  dest.once('finish', onfinish);
+
+  function unpipe() {
+    src.unpipe(dest);
+  }
+
+  // tell the dest that it's being piped to
+  dest.emit('pipe', src);
+
+  // start the flow if it hasn't been started already.
+  if (!state.flowing) {
+    // the handler that waits for readable events after all
+    // the data gets sucked out in flow.
+    // This would be easier to follow with a .once() handler
+    // in flow(), but that is too slow.
+    this.on('readable', pipeOnReadable);
+
+    state.flowing = true;
+    process.nextTick(function() {
+      flow(src);
+    });
+  }
+
+  return dest;
+};
+
+function pipeOnDrain(src) {
+  return function() {
+    var dest = this;
+    var state = src._readableState;
+    state.awaitDrain--;
+    if (state.awaitDrain === 0)
+      flow(src);
+  };
+}
+
+function flow(src) {
+  var state = src._readableState;
+  var chunk;
+  state.awaitDrain = 0;
+
+  function write(dest, i, list) {
+    var written = dest.write(chunk);
+    if (false === written) {
+      state.awaitDrain++;
+    }
+  }
+
+  while (state.pipesCount && null !== (chunk = src.read())) {
+
+    if (state.pipesCount === 1)
+      write(state.pipes, 0, null);
+    else
+      state.pipes.forEach(write);
+
+    src.emit('data', chunk);
+
+    // if anyone needs a drain, then we have to wait for that.
+    if (state.awaitDrain > 0)
+      return;
+  }
+
+  // if every destination was unpiped, either before entering this
+  // function, or in the while loop, then stop flowing.
+  //
+  // NB: This is a pretty rare edge case.
+  if (state.pipesCount === 0) {
+    state.flowing = false;
+
+    // if there were data event listeners added, then switch to old mode.
+    if (EE.listenerCount(src, 'data') > 0)
+      emitDataEvents(src);
+    return;
+  }
+
+  // at this point, no one needed a drain, so we just ran out of data
+  // on the next readable event, start it over again.
+  state.ranOut = true;
+}
+
+function pipeOnReadable() {
+  if (this._readableState.ranOut) {
+    this._readableState.ranOut = false;
+    flow(this);
+  }
+}
+
+
+Readable.prototype.unpipe = function(dest) {
+  var state = this._readableState;
+
+  // if we're not piping anywhere, then do nothing.
+  if (state.pipesCount === 0)
+    return this;
+
+  // just one destination.  most common case.
+  if (state.pipesCount === 1) {
+    // passed in one, but it's not the right one.
+    if (dest && dest !== state.pipes)
+      return this;
+
+    if (!dest)
+      dest = state.pipes;
+
+    // got a match.
+    state.pipes = null;
+    state.pipesCount = 0;
+    this.removeListener('readable', pipeOnReadable);
+    state.flowing = false;
+    if (dest)
+      dest.emit('unpipe', this);
+    return this;
+  }
+
+  // slow case. multiple pipe destinations.
+
+  if (!dest) {
+    // remove all.
+    var dests = state.pipes;
+    var len = state.pipesCount;
+    state.pipes = null;
+    state.pipesCount = 0;
+    this.removeListener('readable', pipeOnReadable);
+    state.flowing = false;
+
+    for (var i = 0; i < len; i++)
+      dests[i].emit('unpipe', this);
+    return this;
+  }
+
+  // try to find the right one.
+  var i = state.pipes.indexOf(dest);
+  if (i === -1)
+    return this;
+
+  state.pipes.splice(i, 1);
+  state.pipesCount -= 1;
+  if (state.pipesCount === 1)
+    state.pipes = state.pipes[0];
+
+  dest.emit('unpipe', this);
+
+  return this;
+};
+
+// set up data events if they are asked for
+// Ensure readable listeners eventually get something
+Readable.prototype.on = function(ev, fn) {
+  var res = Stream.prototype.on.call(this, ev, fn);
+
+  if (ev === 'data' && !this._readableState.flowing)
+    emitDataEvents(this);
+
+  if (ev === 'readable' && this.readable) {
+    var state = this._readableState;
+    if (!state.readableListening) {
+      state.readableListening = true;
+      state.emittedReadable = false;
+      state.needReadable = true;
+      if (!state.reading) {
+        this.read(0);
+      } else if (state.length) {
+        emitReadable(this, state);
+      }
+    }
+  }
+
+  return res;
+};
+Readable.prototype.addListener = Readable.prototype.on;
+
+// pause() and resume() are remnants of the legacy readable stream API
+// If the user uses them, then switch into old mode.
+Readable.prototype.resume = function() {
+  emitDataEvents(this);
+  this.read(0);
+  this.emit('resume');
+};
+
+Readable.prototype.pause = function() {
+  emitDataEvents(this, true);
+  this.emit('pause');
+};
+
+function emitDataEvents(stream, startPaused) {
+  var state = stream._readableState;
+
+  if (state.flowing) {
+    // https://github.com/isaacs/readable-stream/issues/16
+    throw new Error('Cannot switch to old mode now.');
+  }
+
+  var paused = startPaused || false;
+  var readable = false;
+
+  // convert to an old-style stream.
+  stream.readable = true;
+  stream.pipe = Stream.prototype.pipe;
+  stream.on = stream.addListener = Stream.prototype.on;
+
+  stream.on('readable', function() {
+    readable = true;
+
+    var c;
+    while (!paused && (null !== (c = stream.read())))
+      stream.emit('data', c);
+
+    if (c === null) {
+      readable = false;
+      stream._readableState.needReadable = true;
+    }
+  });
+
+  stream.pause = function() {
+    paused = true;
+    this.emit('pause');
+  };
+
+  stream.resume = function() {
+    paused = false;
+    if (readable)
+      process.nextTick(function() {
+        stream.emit('readable');
+      });
+    else
+      this.read(0);
+    this.emit('resume');
+  };
+
+  // now make it start, just in case it hadn't already.
+  stream.emit('readable');
+}
+
+// wrap an old-style stream as the async data source.
+// This is *not* part of the readable stream interface.
+// It is an ugly unfortunate mess of history.
+Readable.prototype.wrap = function(stream) {
+  var state = this._readableState;
+  var paused = false;
+
+  var self = this;
+  stream.on('end', function() {
+    if (state.decoder && !state.ended) {
+      var chunk = state.decoder.end();
+      if (chunk && chunk.length)
+        self.push(chunk);
+    }
+
+    self.push(null);
+  });
+
+  stream.on('data', function(chunk) {
+    if (state.decoder)
+      chunk = state.decoder.write(chunk);
+    if (!chunk || !state.objectMode && !chunk.length)
+      return;
+
+    var ret = self.push(chunk);
+    if (!ret) {
+      paused = true;
+      stream.pause();
+    }
+  });
+
+  // proxy all the other methods.
+  // important when wrapping filters and duplexes.
+  for (var i in stream) {
+    if (typeof stream[i] === 'function' &&
+        typeof this[i] === 'undefined') {
+      this[i] = function(method) { return function() {
+        return stream[method].apply(stream, arguments);
+      }}(i);
+    }
+  }
+
+  // proxy certain important events.
+  var events = ['error', 'close', 'destroy', 'pause', 'resume'];
+  events.forEach(function(ev) {
+    stream.on(ev, self.emit.bind(self, ev));
+  });
+
+  // when we try to consume some more bytes, simply unpause the
+  // underlying stream.
+  self._read = function(n) {
+    if (paused) {
+      paused = false;
+      stream.resume();
+    }
+  };
+
+  return self;
+};
+
+
+
+// exposed for testing purposes only.
+Readable._fromList = fromList;
+
+// Pluck off n bytes from an array of buffers.
+// Length is the combined lengths of all the buffers in the list.
+function fromList(n, state) {
+  var list = state.buffer;
+  var length = state.length;
+  var stringMode = !!state.decoder;
+  var objectMode = !!state.objectMode;
+  var ret;
+
+  // nothing in the list, definitely empty.
+  if (list.length === 0)
+    return null;
+
+  if (length === 0)
+    ret = null;
+  else if (objectMode)
+    ret = list.shift();
+  else if (!n || n >= length) {
+    // read it all, truncate the array.
+    if (stringMode)
+      ret = list.join('');
+    else
+      ret = Buffer.concat(list, length);
+    list.length = 0;
+  } else {
+    // read just some of it.
+    if (n < list[0].length) {
+      // just take a part of the first list item.
+      // slice is the same for buffers and strings.
+      var buf = list[0];
+      ret = buf.slice(0, n);
+      list[0] = buf.slice(n);
+    } else if (n === list[0].length) {
+      // first list is a perfect match
+      ret = list.shift();
+    } else {
+      // complex case.
+      // we have enough to cover it, but it spans past the first buffer.
+      if (stringMode)
+        ret = '';
+      else
+        ret = new Buffer(n);
+
+      var c = 0;
+      for (var i = 0, l = list.length; i < l && c < n; i++) {
+        var buf = list[0];
+        var cpy = Math.min(n - c, buf.length);
+
+        if (stringMode)
+          ret += buf.slice(0, cpy);
+        else
+          buf.copy(ret, c, 0, cpy);
+
+        if (cpy < buf.length)
+          list[0] = buf.slice(cpy);
+        else
+          list.shift();
+
+        c += cpy;
+      }
+    }
+  }
+
+  return ret;
+}
+
+function endReadable(stream) {
+  var state = stream._readableState;
+
+  // If we get here before consuming all the bytes, then that is a
+  // bug in node.  Should never happen.
+  if (state.length > 0)
+    throw new Error('endReadable called on non-empty stream');
+
+  if (!state.endEmitted && state.calledRead) {
+    state.ended = true;
+    process.nextTick(function() {
+      // Check that we didn't get one last unshift.
+      if (!state.endEmitted && state.length === 0) {
+        state.endEmitted = true;
+        stream.readable = false;
+        stream.emit('end');
+      }
+    });
+  }
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_transform.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_transform.js
new file mode 100644
index 0000000..f08b05e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_transform.js
@@ -0,0 +1,205 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+
+// a transform stream is a readable/writable stream where you do
+// something with the data.  Sometimes it's called a "filter",
+// but that's not a great name for it, since that implies a thing where
+// some bits pass through, and others are simply ignored.  (That would
+// be a valid example of a transform, of course.)
+//
+// While the output is causally related to the input, it's not a
+// necessarily symmetric or synchronous transformation.  For example,
+// a zlib stream might take multiple plain-text writes(), and then
+// emit a single compressed chunk some time in the future.
+//
+// Here's how this works:
+//
+// The Transform stream has all the aspects of the readable and writable
+// stream classes.  When you write(chunk), that calls _write(chunk,cb)
+// internally, and returns false if there's a lot of pending writes
+// buffered up.  When you call read(), that calls _read(n) until
+// there's enough pending readable data buffered up.
+//
+// In a transform stream, the written data is placed in a buffer.  When
+// _read(n) is called, it transforms the queued up data, calling the
+// buffered _write cb's as it consumes chunks.  If consuming a single
+// written chunk would result in multiple output chunks, then the first
+// outputted bit calls the readcb, and subsequent chunks just go into
+// the read buffer, and will cause it to emit 'readable' if necessary.
+//
+// This way, back-pressure is actually determined by the reading side,
+// since _read has to be called to start processing a new chunk.  However,
+// a pathological inflate type of transform can cause excessive buffering
+// here.  For example, imagine a stream where every byte of input is
+// interpreted as an integer from 0-255, and then results in that many
+// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in
+// 1kb of data being output.  In this case, you could write a very small
+// amount of input, and end up with a very large amount of output.  In
+// such a pathological inflating mechanism, there'd be no way to tell
+// the system to stop doing the transform.  A single 4MB write could
+// cause the system to run out of memory.
+//
+// However, even in such a pathological case, only a single written chunk
+// would be consumed, and then the rest would wait (un-transformed) until
+// the results of the previous transformed chunk were consumed.
+
+module.exports = Transform;
+
+var Duplex = require('./_stream_duplex');
+var util = require('util');
+util.inherits(Transform, Duplex);
+
+
+function TransformState(options, stream) {
+  this.afterTransform = function(er, data) {
+    return afterTransform(stream, er, data);
+  };
+
+  this.needTransform = false;
+  this.transforming = false;
+  this.writecb = null;
+  this.writechunk = null;
+}
+
+function afterTransform(stream, er, data) {
+  var ts = stream._transformState;
+  ts.transforming = false;
+
+  var cb = ts.writecb;
+
+  if (!cb)
+    return stream.emit('error', new Error('no writecb in Transform class'));
+
+  ts.writechunk = null;
+  ts.writecb = null;
+
+  if (data !== null && data !== undefined)
+    stream.push(data);
+
+  if (cb)
+    cb(er);
+
+  var rs = stream._readableState;
+  rs.reading = false;
+  if (rs.needReadable || rs.length < rs.highWaterMark) {
+    stream._read(rs.highWaterMark);
+  }
+}
+
+
+function Transform(options) {
+  if (!(this instanceof Transform))
+    return new Transform(options);
+
+  Duplex.call(this, options);
+
+  var ts = this._transformState = new TransformState(options, this);
+
+  // when the writable side finishes, then flush out anything remaining.
+  var stream = this;
+
+  // start out asking for a readable event once data is transformed.
+  this._readableState.needReadable = true;
+
+  // we have implemented the _read method, and done the other things
+  // that Readable wants before the first _read call, so unset the
+  // sync guard flag.
+  this._readableState.sync = false;
+
+  this.once('finish', function() {
+    if ('function' === typeof this._flush)
+      this._flush(function(er) {
+        done(stream, er);
+      });
+    else
+      done(stream);
+  });
+}
+
+Transform.prototype.push = function(chunk, encoding) {
+  this._transformState.needTransform = false;
+  return Duplex.prototype.push.call(this, chunk, encoding);
+};
+
+// This is the part where you do stuff!
+// override this function in implementation classes.
+// 'chunk' is an input chunk.
+//
+// Call `push(newChunk)` to pass along transformed output
+// to the readable side.  You may call 'push' zero or more times.
+//
+// Call `cb(err)` when you are done with this chunk.  If you pass
+// an error, then that'll put the hurt on the whole operation.  If you
+// never call cb(), then you'll never get another chunk.
+Transform.prototype._transform = function(chunk, encoding, cb) {
+  throw new Error('not implemented');
+};
+
+Transform.prototype._write = function(chunk, encoding, cb) {
+  var ts = this._transformState;
+  ts.writecb = cb;
+  ts.writechunk = chunk;
+  ts.writeencoding = encoding;
+  if (!ts.transforming) {
+    var rs = this._readableState;
+    if (ts.needTransform ||
+        rs.needReadable ||
+        rs.length < rs.highWaterMark)
+      this._read(rs.highWaterMark);
+  }
+};
+
+// Doesn't matter what the args are here.
+// _transform does all the work.
+// That we got here means that the readable side wants more data.
+Transform.prototype._read = function(n) {
+  var ts = this._transformState;
+
+  if (ts.writechunk && ts.writecb && !ts.transforming) {
+    ts.transforming = true;
+    this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
+  } else {
+    // mark that we need a transform, so that any data that comes in
+    // will get processed, now that we've asked for it.
+    ts.needTransform = true;
+  }
+};
+
+
+function done(stream, er) {
+  if (er)
+    return stream.emit('error', er);
+
+  // if there's nothing in the write buffer, then that means
+  // that nothing more will ever be provided
+  var ws = stream._writableState;
+  var rs = stream._readableState;
+  var ts = stream._transformState;
+
+  if (ws.length)
+    throw new Error('calling transform done when ws.length != 0');
+
+  if (ts.transforming)
+    throw new Error('calling transform done when still transforming');
+
+  return stream.push(null);
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_writable.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_writable.js
new file mode 100644
index 0000000..56ca47d
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_writable.js
@@ -0,0 +1,367 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+// A bit simpler than readable streams.
+// Implement an async ._write(chunk, cb), and it'll handle all
+// the drain event emission and buffering.
+
+module.exports = Writable;
+Writable.WritableState = WritableState;
+
+var util = require('util');
+var assert = require('assert');
+var Stream = require('stream');
+
+util.inherits(Writable, Stream);
+
+function WriteReq(chunk, encoding, cb) {
+  this.chunk = chunk;
+  this.encoding = encoding;
+  this.callback = cb;
+}
+
+function WritableState(options, stream) {
+  options = options || {};
+
+  // the point at which write() starts returning false
+  // Note: 0 is a valid value, means that we always return false if
+  // the entire buffer is not flushed immediately on write()
+  var hwm = options.highWaterMark;
+  this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024;
+
+  // object stream flag to indicate whether or not this stream
+  // contains buffers or objects.
+  this.objectMode = !!options.objectMode;
+
+  // cast to ints.
+  this.highWaterMark = ~~this.highWaterMark;
+
+  this.needDrain = false;
+  // at the start of calling end()
+  this.ending = false;
+  // when end() has been called, and returned
+  this.ended = false;
+  // when 'finish' is emitted
+  this.finished = false;
+
+  // should we decode strings into buffers before passing to _write?
+  // this is here so that some node-core streams can optimize string
+  // handling at a lower level.
+  var noDecode = options.decodeStrings === false;
+  this.decodeStrings = !noDecode;
+
+  // Crypto is kind of old and crusty.  Historically, its default string
+  // encoding is 'binary' so we have to make this configurable.
+  // Everything else in the universe uses 'utf8', though.
+  this.defaultEncoding = options.defaultEncoding || 'utf8';
+
+  // not an actual buffer we keep track of, but a measurement
+  // of how much we're waiting to get pushed to some underlying
+  // socket or file.
+  this.length = 0;
+
+  // a flag to see when we're in the middle of a write.
+  this.writing = false;
+
+  // a flag to be able to tell if the onwrite cb is called immediately,
+  // or on a later tick.  We set this to true at first, becuase any
+  // actions that shouldn't happen until "later" should generally also
+  // not happen before the first write call.
+  this.sync = true;
+
+  // a flag to know if we're processing previously buffered items, which
+  // may call the _write() callback in the same tick, so that we don't
+  // end up in an overlapped onwrite situation.
+  this.bufferProcessing = false;
+
+  // the callback that's passed to _write(chunk,cb)
+  this.onwrite = function(er) {
+    onwrite(stream, er);
+  };
+
+  // the callback that the user supplies to write(chunk,encoding,cb)
+  this.writecb = null;
+
+  // the amount that is being written when _write is called.
+  this.writelen = 0;
+
+  this.buffer = [];
+}
+
+function Writable(options) {
+  // Writable ctor is applied to Duplexes, though they're not
+  // instanceof Writable, they're instanceof Readable.
+  if (!(this instanceof Writable) && !(this instanceof require('./_stream_duplex')))
+    return new Writable(options);
+
+  this._writableState = new WritableState(options, this);
+
+  // legacy.
+  this.writable = true;
+
+  Stream.call(this);
+}
+
+// Otherwise people can pipe Writable streams, which is just wrong.
+Writable.prototype.pipe = function() {
+  this.emit('error', new Error('Cannot pipe. Not readable.'));
+};
+
+
+function writeAfterEnd(stream, state, cb) {
+  var er = new Error('write after end');
+  // TODO: defer error events consistently everywhere, not just the cb
+  stream.emit('error', er);
+  process.nextTick(function() {
+    cb(er);
+  });
+}
+
+// If we get something that is not a buffer, string, null, or undefined,
+// and we're not in objectMode, then that's an error.
+// Otherwise stream chunks are all considered to be of length=1, and the
+// watermarks determine how many objects to keep in the buffer, rather than
+// how many bytes or characters.
+function validChunk(stream, state, chunk, cb) {
+  var valid = true;
+  if (!Buffer.isBuffer(chunk) &&
+      'string' !== typeof chunk &&
+      chunk !== null &&
+      chunk !== undefined &&
+      !state.objectMode) {
+    var er = new TypeError('Invalid non-string/buffer chunk');
+    stream.emit('error', er);
+    process.nextTick(function() {
+      cb(er);
+    });
+    valid = false;
+  }
+  return valid;
+}
+
+Writable.prototype.write = function(chunk, encoding, cb) {
+  var state = this._writableState;
+  var ret = false;
+
+  if (typeof encoding === 'function') {
+    cb = encoding;
+    encoding = null;
+  }
+
+  if (Buffer.isBuffer(chunk))
+    encoding = 'buffer';
+  else if (!encoding)
+    encoding = state.defaultEncoding;
+
+  if (typeof cb !== 'function')
+    cb = function() {};
+
+  if (state.ended)
+    writeAfterEnd(this, state, cb);
+  else if (validChunk(this, state, chunk, cb))
+    ret = writeOrBuffer(this, state, chunk, encoding, cb);
+
+  return ret;
+};
+
+function decodeChunk(state, chunk, encoding) {
+  if (!state.objectMode &&
+      state.decodeStrings !== false &&
+      typeof chunk === 'string') {
+    chunk = new Buffer(chunk, encoding);
+  }
+  return chunk;
+}
+
+// if we're already writing something, then just put this
+// in the queue, and wait our turn.  Otherwise, call _write
+// If we return false, then we need a drain event, so set that flag.
+function writeOrBuffer(stream, state, chunk, encoding, cb) {
+  chunk = decodeChunk(state, chunk, encoding);
+  var len = state.objectMode ? 1 : chunk.length;
+
+  state.length += len;
+
+  var ret = state.length < state.highWaterMark;
+  state.needDrain = !ret;
+
+  if (state.writing)
+    state.buffer.push(new WriteReq(chunk, encoding, cb));
+  else
+    doWrite(stream, state, len, chunk, encoding, cb);
+
+  return ret;
+}
+
+function doWrite(stream, state, len, chunk, encoding, cb) {
+  state.writelen = len;
+  state.writecb = cb;
+  state.writing = true;
+  state.sync = true;
+  stream._write(chunk, encoding, state.onwrite);
+  state.sync = false;
+}
+
+function onwriteError(stream, state, sync, er, cb) {
+  if (sync)
+    process.nextTick(function() {
+      cb(er);
+    });
+  else
+    cb(er);
+
+  stream.emit('error', er);
+}
+
+function onwriteStateUpdate(state) {
+  state.writing = false;
+  state.writecb = null;
+  state.length -= state.writelen;
+  state.writelen = 0;
+}
+
+function onwrite(stream, er) {
+  var state = stream._writableState;
+  var sync = state.sync;
+  var cb = state.writecb;
+
+  onwriteStateUpdate(state);
+
+  if (er)
+    onwriteError(stream, state, sync, er, cb);
+  else {
+    // Check if we're actually ready to finish, but don't emit yet
+    var finished = needFinish(stream, state);
+
+    if (!finished && !state.bufferProcessing && state.buffer.length)
+      clearBuffer(stream, state);
+
+    if (sync) {
+      process.nextTick(function() {
+        afterWrite(stream, state, finished, cb);
+      });
+    } else {
+      afterWrite(stream, state, finished, cb);
+    }
+  }
+}
+
+function afterWrite(stream, state, finished, cb) {
+  if (!finished)
+    onwriteDrain(stream, state);
+  cb();
+  if (finished)
+    finishMaybe(stream, state);
+}
+
+// Must force callback to be called on nextTick, so that we don't
+// emit 'drain' before the write() consumer gets the 'false' return
+// value, and has a chance to attach a 'drain' listener.
+function onwriteDrain(stream, state) {
+  if (state.length === 0 && state.needDrain) {
+    state.needDrain = false;
+    stream.emit('drain');
+  }
+}
+
+
+// if there's something in the buffer waiting, then process it
+function clearBuffer(stream, state) {
+  state.bufferProcessing = true;
+
+  for (var c = 0; c < state.buffer.length; c++) {
+    var entry = state.buffer[c];
+    var chunk = entry.chunk;
+    var encoding = entry.encoding;
+    var cb = entry.callback;
+    var len = state.objectMode ? 1 : chunk.length;
+
+    doWrite(stream, state, len, chunk, encoding, cb);
+
+    // if we didn't call the onwrite immediately, then
+    // it means that we need to wait until it does.
+    // also, that means that the chunk and cb are currently
+    // being processed, so move the buffer counter past them.
+    if (state.writing) {
+      c++;
+      break;
+    }
+  }
+
+  state.bufferProcessing = false;
+  if (c < state.buffer.length)
+    state.buffer = state.buffer.slice(c);
+  else
+    state.buffer.length = 0;
+}
+
+Writable.prototype._write = function(chunk, encoding, cb) {
+  cb(new Error('not implemented'));
+};
+
+Writable.prototype.end = function(chunk, encoding, cb) {
+  var state = this._writableState;
+
+  if (typeof chunk === 'function') {
+    cb = chunk;
+    chunk = null;
+    encoding = null;
+  } else if (typeof encoding === 'function') {
+    cb = encoding;
+    encoding = null;
+  }
+
+  if (typeof chunk !== 'undefined' && chunk !== null)
+    this.write(chunk, encoding);
+
+  // ignore unnecessary end() calls.
+  if (!state.ending && !state.finished)
+    endWritable(this, state, cb);
+};
+
+
+function needFinish(stream, state) {
+  return (state.ending &&
+          state.length === 0 &&
+          !state.finished &&
+          !state.writing);
+}
+
+function finishMaybe(stream, state) {
+  var need = needFinish(stream, state);
+  if (need) {
+    state.finished = true;
+    stream.emit('finish');
+  }
+  return need;
+}
+
+function endWritable(stream, state, cb) {
+  state.ending = true;
+  finishMaybe(stream, state);
+  if (cb) {
+    if (state.finished)
+      process.nextTick(cb);
+    else
+      stream.once('finish', cb);
+  }
+  state.ended = true;
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/package.json b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/package.json
new file mode 100644
index 0000000..dc6db3a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/package.json
@@ -0,0 +1,35 @@
+{
+  "name": "readable-stream",
+  "version": "1.0.17",
+  "description": "An exploration of a new kind of readable streams for Node.js",
+  "main": "readable.js",
+  "dependencies": {},
+  "devDependencies": {
+    "tap": "~0.2.6"
+  },
+  "scripts": {
+    "test": "tap test/simple/*.js"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/isaacs/readable-stream"
+  },
+  "keywords": [
+    "readable",
+    "stream",
+    "pipe"
+  ],
+  "author": {
+    "name": "Isaac Z. Schlueter",
+    "email": "i at izs.me",
+    "url": "http://blog.izs.me/"
+  },
+  "license": "BSD",
+  "readme": "# readable-stream\n\nA new class of streams for Node.js\n\nThis module provides the new Stream base classes introduced in Node\nv0.10, for use in Node v0.8.  You can use it to have programs that\nhave to work with node v0.8, while being forward-compatible for v0.10\nand beyond.  When you drop support for v0.8, you can remove this\nmodule, and only use the native streams.\n\nThis is almost exactly the same codebase as appears in Node v0.10.\nHowever:\n\n1. The exported object [...]
+  "readmeFilename": "README.md",
+  "bugs": {
+    "url": "https://github.com/isaacs/readable-stream/issues"
+  },
+  "_id": "readable-stream at 1.0.17",
+  "_from": "readable-stream at 1.0"
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/passthrough.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/passthrough.js
new file mode 100644
index 0000000..27e8d8a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/passthrough.js
@@ -0,0 +1 @@
+module.exports = require("./lib/_stream_passthrough.js")
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/readable.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/readable.js
new file mode 100644
index 0000000..4d1ddfc
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/readable.js
@@ -0,0 +1,6 @@
+exports = module.exports = require('./lib/_stream_readable.js');
+exports.Readable = exports;
+exports.Writable = require('./lib/_stream_writable.js');
+exports.Duplex = require('./lib/_stream_duplex.js');
+exports.Transform = require('./lib/_stream_transform.js');
+exports.PassThrough = require('./lib/_stream_passthrough.js');
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/transform.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/transform.js
new file mode 100644
index 0000000..5d482f0
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/transform.js
@@ -0,0 +1 @@
+module.exports = require("./lib/_stream_transform.js")
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/writable.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/writable.js
new file mode 100644
index 0000000..e1e9efd
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/writable.js
@@ -0,0 +1 @@
+module.exports = require("./lib/_stream_writable.js")
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/zlib.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/zlib.js
new file mode 100644
index 0000000..a30ca20
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/zlib.js
@@ -0,0 +1,452 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+var Transform = require('./lib/_stream_transform.js');
+
+var binding = process.binding('zlib');
+var util = require('util');
+var assert = require('assert').ok;
+
+// zlib doesn't provide these, so kludge them in following the same
+// const naming scheme zlib uses.
+binding.Z_MIN_WINDOWBITS = 8;
+binding.Z_MAX_WINDOWBITS = 15;
+binding.Z_DEFAULT_WINDOWBITS = 15;
+
+// fewer than 64 bytes per chunk is stupid.
+// technically it could work with as few as 8, but even 64 bytes
+// is absurdly low.  Usually a MB or more is best.
+binding.Z_MIN_CHUNK = 64;
+binding.Z_MAX_CHUNK = Infinity;
+binding.Z_DEFAULT_CHUNK = (16 * 1024);
+
+binding.Z_MIN_MEMLEVEL = 1;
+binding.Z_MAX_MEMLEVEL = 9;
+binding.Z_DEFAULT_MEMLEVEL = 8;
+
+binding.Z_MIN_LEVEL = -1;
+binding.Z_MAX_LEVEL = 9;
+binding.Z_DEFAULT_LEVEL = binding.Z_DEFAULT_COMPRESSION;
+
+// expose all the zlib constants
+Object.keys(binding).forEach(function(k) {
+  if (k.match(/^Z/)) exports[k] = binding[k];
+});
+
+// translation table for return codes.
+exports.codes = {
+  Z_OK: binding.Z_OK,
+  Z_STREAM_END: binding.Z_STREAM_END,
+  Z_NEED_DICT: binding.Z_NEED_DICT,
+  Z_ERRNO: binding.Z_ERRNO,
+  Z_STREAM_ERROR: binding.Z_STREAM_ERROR,
+  Z_DATA_ERROR: binding.Z_DATA_ERROR,
+  Z_MEM_ERROR: binding.Z_MEM_ERROR,
+  Z_BUF_ERROR: binding.Z_BUF_ERROR,
+  Z_VERSION_ERROR: binding.Z_VERSION_ERROR
+};
+
+Object.keys(exports.codes).forEach(function(k) {
+  exports.codes[exports.codes[k]] = k;
+});
+
+exports.Deflate = Deflate;
+exports.Inflate = Inflate;
+exports.Gzip = Gzip;
+exports.Gunzip = Gunzip;
+exports.DeflateRaw = DeflateRaw;
+exports.InflateRaw = InflateRaw;
+exports.Unzip = Unzip;
+
+exports.createDeflate = function(o) {
+  return new Deflate(o);
+};
+
+exports.createInflate = function(o) {
+  return new Inflate(o);
+};
+
+exports.createDeflateRaw = function(o) {
+  return new DeflateRaw(o);
+};
+
+exports.createInflateRaw = function(o) {
+  return new InflateRaw(o);
+};
+
+exports.createGzip = function(o) {
+  return new Gzip(o);
+};
+
+exports.createGunzip = function(o) {
+  return new Gunzip(o);
+};
+
+exports.createUnzip = function(o) {
+  return new Unzip(o);
+};
+
+
+// Convenience methods.
+// compress/decompress a string or buffer in one step.
+exports.deflate = function(buffer, callback) {
+  zlibBuffer(new Deflate(), buffer, callback);
+};
+
+exports.gzip = function(buffer, callback) {
+  zlibBuffer(new Gzip(), buffer, callback);
+};
+
+exports.deflateRaw = function(buffer, callback) {
+  zlibBuffer(new DeflateRaw(), buffer, callback);
+};
+
+exports.unzip = function(buffer, callback) {
+  zlibBuffer(new Unzip(), buffer, callback);
+};
+
+exports.inflate = function(buffer, callback) {
+  zlibBuffer(new Inflate(), buffer, callback);
+};
+
+exports.gunzip = function(buffer, callback) {
+  zlibBuffer(new Gunzip(), buffer, callback);
+};
+
+exports.inflateRaw = function(buffer, callback) {
+  zlibBuffer(new InflateRaw(), buffer, callback);
+};
+
+function zlibBuffer(engine, buffer, callback) {
+  var buffers = [];
+  var nread = 0;
+
+  engine.on('error', onError);
+  engine.on('end', onEnd);
+
+  engine.end(buffer);
+  flow();
+
+  function flow() {
+    var chunk;
+    while (null !== (chunk = engine.read())) {
+      buffers.push(chunk);
+      nread += chunk.length;
+    }
+    engine.once('readable', flow);
+  }
+
+  function onError(err) {
+    engine.removeListener('end', onEnd);
+    engine.removeListener('readable', flow);
+    callback(err);
+  }
+
+  function onEnd() {
+    var buf = Buffer.concat(buffers, nread);
+    buffers = [];
+    callback(null, buf);
+  }
+}
+
+
+// generic zlib
+// minimal 2-byte header
+function Deflate(opts) {
+  if (!(this instanceof Deflate)) return new Deflate(opts);
+  Zlib.call(this, opts, binding.DEFLATE);
+}
+
+function Inflate(opts) {
+  if (!(this instanceof Inflate)) return new Inflate(opts);
+  Zlib.call(this, opts, binding.INFLATE);
+}
+
+
+
+// gzip - bigger header, same deflate compression
+function Gzip(opts) {
+  if (!(this instanceof Gzip)) return new Gzip(opts);
+  Zlib.call(this, opts, binding.GZIP);
+}
+
+function Gunzip(opts) {
+  if (!(this instanceof Gunzip)) return new Gunzip(opts);
+  Zlib.call(this, opts, binding.GUNZIP);
+}
+
+
+
+// raw - no header
+function DeflateRaw(opts) {
+  if (!(this instanceof DeflateRaw)) return new DeflateRaw(opts);
+  Zlib.call(this, opts, binding.DEFLATERAW);
+}
+
+function InflateRaw(opts) {
+  if (!(this instanceof InflateRaw)) return new InflateRaw(opts);
+  Zlib.call(this, opts, binding.INFLATERAW);
+}
+
+
+// auto-detect header.
+function Unzip(opts) {
+  if (!(this instanceof Unzip)) return new Unzip(opts);
+  Zlib.call(this, opts, binding.UNZIP);
+}
+
+
+// the Zlib class they all inherit from
+// This thing manages the queue of requests, and returns
+// true or false if there is anything in the queue when
+// you call the .write() method.
+
+function Zlib(opts, mode) {
+  this._opts = opts = opts || {};
+  this._chunkSize = opts.chunkSize || exports.Z_DEFAULT_CHUNK;
+
+  Transform.call(this, opts);
+
+  // means a different thing there.
+  this._readableState.chunkSize = null;
+
+  if (opts.chunkSize) {
+    if (opts.chunkSize < exports.Z_MIN_CHUNK ||
+        opts.chunkSize > exports.Z_MAX_CHUNK) {
+      throw new Error('Invalid chunk size: ' + opts.chunkSize);
+    }
+  }
+
+  if (opts.windowBits) {
+    if (opts.windowBits < exports.Z_MIN_WINDOWBITS ||
+        opts.windowBits > exports.Z_MAX_WINDOWBITS) {
+      throw new Error('Invalid windowBits: ' + opts.windowBits);
+    }
+  }
+
+  if (opts.level) {
+    if (opts.level < exports.Z_MIN_LEVEL ||
+        opts.level > exports.Z_MAX_LEVEL) {
+      throw new Error('Invalid compression level: ' + opts.level);
+    }
+  }
+
+  if (opts.memLevel) {
+    if (opts.memLevel < exports.Z_MIN_MEMLEVEL ||
+        opts.memLevel > exports.Z_MAX_MEMLEVEL) {
+      throw new Error('Invalid memLevel: ' + opts.memLevel);
+    }
+  }
+
+  if (opts.strategy) {
+    if (opts.strategy != exports.Z_FILTERED &&
+        opts.strategy != exports.Z_HUFFMAN_ONLY &&
+        opts.strategy != exports.Z_RLE &&
+        opts.strategy != exports.Z_FIXED &&
+        opts.strategy != exports.Z_DEFAULT_STRATEGY) {
+      throw new Error('Invalid strategy: ' + opts.strategy);
+    }
+  }
+
+  if (opts.dictionary) {
+    if (!Buffer.isBuffer(opts.dictionary)) {
+      throw new Error('Invalid dictionary: it should be a Buffer instance');
+    }
+  }
+
+  this._binding = new binding.Zlib(mode);
+
+  var self = this;
+  this._hadError = false;
+  this._binding.onerror = function(message, errno) {
+    // there is no way to cleanly recover.
+    // continuing only obscures problems.
+    self._binding = null;
+    self._hadError = true;
+
+    var error = new Error(message);
+    error.errno = errno;
+    error.code = exports.codes[errno];
+    self.emit('error', error);
+  };
+
+  this._binding.init(opts.windowBits || exports.Z_DEFAULT_WINDOWBITS,
+                     opts.level || exports.Z_DEFAULT_COMPRESSION,
+                     opts.memLevel || exports.Z_DEFAULT_MEMLEVEL,
+                     opts.strategy || exports.Z_DEFAULT_STRATEGY,
+                     opts.dictionary);
+
+  this._buffer = new Buffer(this._chunkSize);
+  this._offset = 0;
+  this._closed = false;
+
+  this.once('end', this.close);
+}
+
+util.inherits(Zlib, Transform);
+
+Zlib.prototype.reset = function reset() {
+  return this._binding.reset();
+};
+
+Zlib.prototype._flush = function(output, callback) {
+  var rs = this._readableState;
+  var self = this;
+  this._transform(null, output, function(er) {
+    if (er)
+      return callback(er);
+
+    // now a weird thing happens... it could be that you called flush
+    // but everything had already actually been consumed, but it wasn't
+    // enough to get over the Readable class's lowWaterMark.
+    // In that case, we emit 'readable' now to make sure it's consumed.
+    if (rs.length &&
+        rs.length < rs.lowWaterMark &&
+        !rs.ended &&
+        rs.needReadable)
+      self.emit('readable');
+
+    callback();
+  });
+};
+
+Zlib.prototype.flush = function(callback) {
+  var ws = this._writableState;
+  var ts = this._transformState;
+
+  if (ws.writing) {
+    ws.needDrain = true;
+    var self = this;
+    this.once('drain', function() {
+      self._flush(ts.output, callback);
+    });
+    return;
+  }
+
+  this._flush(ts.output, callback || function() {});
+};
+
+Zlib.prototype.close = function(callback) {
+  if (callback)
+    process.nextTick(callback);
+
+  if (this._closed)
+    return;
+
+  this._closed = true;
+
+  this._binding.close();
+
+  var self = this;
+  process.nextTick(function() {
+    self.emit('close');
+  });
+};
+
+Zlib.prototype._transform = function(chunk, output, cb) {
+  var flushFlag;
+  var ws = this._writableState;
+  var ending = ws.ending || ws.ended;
+  var last = ending && (!chunk || ws.length === chunk.length);
+
+  if (chunk !== null && !Buffer.isBuffer(chunk))
+    return cb(new Error('invalid input'));
+
+  // If it's the last chunk, or a final flush, we use the Z_FINISH flush flag.
+  // If it's explicitly flushing at some other time, then we use
+  // Z_FULL_FLUSH. Otherwise, use Z_NO_FLUSH for maximum compression
+  // goodness.
+  if (last)
+    flushFlag = binding.Z_FINISH;
+  else if (chunk === null)
+    flushFlag = binding.Z_FULL_FLUSH;
+  else
+    flushFlag = binding.Z_NO_FLUSH;
+
+  var availInBefore = chunk && chunk.length;
+  var availOutBefore = this._chunkSize - this._offset;
+  var inOff = 0;
+
+  var req = this._binding.write(flushFlag,
+                                chunk, // in
+                                inOff, // in_off
+                                availInBefore, // in_len
+                                this._buffer, // out
+                                this._offset, //out_off
+                                availOutBefore); // out_len
+
+  req.buffer = chunk;
+  req.callback = callback;
+
+  var self = this;
+  function callback(availInAfter, availOutAfter, buffer) {
+    if (self._hadError)
+      return;
+
+    var have = availOutBefore - availOutAfter;
+    assert(have >= 0, 'have should not go down');
+
+    if (have > 0) {
+      var out = self._buffer.slice(self._offset, self._offset + have);
+      self._offset += have;
+      // serve some output to the consumer.
+      output(out);
+    }
+
+    // exhausted the output buffer, or used all the input create a new one.
+    if (availOutAfter === 0 || self._offset >= self._chunkSize) {
+      availOutBefore = self._chunkSize;
+      self._offset = 0;
+      self._buffer = new Buffer(self._chunkSize);
+    }
+
+    if (availOutAfter === 0) {
+      // Not actually done.  Need to reprocess.
+      // Also, update the availInBefore to the availInAfter value,
+      // so that if we have to hit it a third (fourth, etc.) time,
+      // it'll have the correct byte counts.
+      inOff += (availInBefore - availInAfter);
+      availInBefore = availInAfter;
+
+      var newReq = self._binding.write(flushFlag,
+                                       chunk,
+                                       inOff,
+                                       availInBefore,
+                                       self._buffer,
+                                       self._offset,
+                                       self._chunkSize);
+      newReq.callback = callback; // this same function
+      newReq.buffer = chunk;
+      return;
+    }
+
+    // finished with the chunk.
+    cb();
+  }
+};
+
+util.inherits(Deflate, Zlib);
+util.inherits(Inflate, Zlib);
+util.inherits(Gzip, Zlib);
+util.inherits(Gunzip, Zlib);
+util.inherits(DeflateRaw, Zlib);
+util.inherits(InflateRaw, Zlib);
+util.inherits(Unzip, Zlib);
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/package.json b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/package.json
new file mode 100644
index 0000000..f6d5a97
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/htmlparser2/package.json
@@ -0,0 +1,58 @@
+{
+  "name": "htmlparser2",
+  "description": "Fast & forgiving HTML/XML/RSS parser",
+  "version": "3.3.0",
+  "author": {
+    "name": "Felix Boehm",
+    "email": "me at feedic.com"
+  },
+  "keywords": [
+    "html",
+    "parser",
+    "streams",
+    "xml",
+    "dom",
+    "rss",
+    "feed",
+    "atom"
+  ],
+  "contributors": [
+    {
+      "name": "Chris Winberry",
+      "email": "chris at winberry.net"
+    }
+  ],
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/fb55/htmlparser2.git"
+  },
+  "bugs": {
+    "url": "http://github.com/fb55/htmlparser2/issues"
+  },
+  "directories": {
+    "lib": "lib/"
+  },
+  "main": "lib/index.js",
+  "scripts": {
+    "test": "mocha -R spec"
+  },
+  "dependencies": {
+    "domhandler": "2.1",
+    "domutils": "1.1",
+    "domelementtype": "1",
+    "readable-stream": "1.0"
+  },
+  "devDependencies": {
+    "mocha": "1"
+  },
+  "licenses": [
+    {
+      "type": "MIT",
+      "url": "http://github.com/fb55/htmlparser2/raw/master/LICENSE"
+    }
+  ],
+  "readme": "#htmlparser2 [![NPM version](https://badge.fury.io/js/htmlparser2.png)](https://npmjs.org/package/htmlparser2) [![Build Status](https://secure.travis-ci.org/fb55/htmlparser2.png)](http://travis-ci.org/fb55/htmlparser2) [![Dependency Status](https://david-dm.org/fb55/htmlparser2.png)](https://david-dm.org/fb55/htmlparser2)\n\nA forgiving HTML/XML/RSS parser written in JS for NodeJS. The parser can handle streams (chunked data) and supports custom handlers for writing custom D [...]
+  "readmeFilename": "README.md",
+  "_id": "htmlparser2 at 3.3.0",
+  "_from": "htmlparser2@>= 3.1.5 <4"
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/.npmignore b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/.npmignore
new file mode 100644
index 0000000..9bee2f0
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/.npmignore
@@ -0,0 +1,8 @@
+bin/
+build/
+test/
+test/ender/.gitignore
+.gitattributes
+.gitignore
+Makefile
+node_modules/
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/LICENSE b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/LICENSE
new file mode 100644
index 0000000..d7ac905
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) 2007-2013 Diego Perini (http://www.iport.it)
+
+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/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/README b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/README
new file mode 100644
index 0000000..e69de29
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/README.md b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/README.md
new file mode 100644
index 0000000..802ef75
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/README.md
@@ -0,0 +1,91 @@
+# NWMatcher
+
+A fast CSS selector engine and matcher.
+
+
+## Install
+
+To include NWMatcher in a standard web page:
+
+    <script type="text/javascript" src="nwmatcher.js"></script>
+
+In nodeJS:
+
+$ npm install nwmatcher.js
+
+
+## Notes
+
+NWMatcher currently supports browsers and headless environments.
+
+
+# Supported selectors
+
+Here is a list of all the CSS2/CSS3 [Supported selectors](https://github.com/dperini/nwmatcher/wiki/CSS-supported-selectors).
+
+# Features and compliance
+
+You can read more about NWMatcher [Features and compliance](https://github.com/dperini/nwmatcher/wiki/Features-and-compliance).
+
+
+# DOM Selection API
+
+*first( selector, context )*
+>return a reference to the first element matching the selector starting at context
+
+*match( element, selector, context )*
+>return true if the element matches the selector, return false otherwise, starting at context
+
+*select( selector, context, callback )*
+>return an array of all the elements matching the selector starting at context, if available invoke the callback for each element
+
+
+# DOM Helpers API
+
+*byId( id, from )*
+>return a reference to the first element matching the ID
+
+*byTag( tag, from )*
+>return an array of element having the specified tag name
+
+*byClass( class, from )*
+>return an array of element having the specified class name
+
+*byName( name, from )*
+>return an array of element having the specified name attribute
+
+*getAttribute( element, attribute )*
+>return the value read from the element attribute as a string
+
+*hasAttribute( element, attribute )*
+>return true if the element has the attribute set, return false otherwise
+
+
+# Engine Configuration
+
+*configure( options )*
+
+>the following 'flags' exists and can be set to true/false:
+
+* CACHING: enable/disable caching of results
+* SHORTCUTS: allow accepting mangled selectors
+* SIMPLENOT: allow nested complex :not() selectors
+* UNIQUE_ID: allow multiple elements with same ID
+* USE_QSAPI: enable native querySelectorAll if available
+* USE_HTML5: enable/disable special HTML5 rules (checked/selected)
+* VERBOSITY: enable/disable throwing of errors or just console warnings
+
+>Example: configure( { USE_QSAPI: false, VERBOSITY: false } );
+
+
+*registerOperator( symbol, resolver )*
+
+>register a new symbol and its matching resolver in the Operators table
+
+>Example: NW.Dom.registerOperator( '!=', 'n!="%m"' );
+
+*registerSelector( name, rexp, func )*
+
+>register a new selector, the matching RegExp and the appropriate resolver function in the Selectors table
+
+
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/dist/lint.log b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/dist/lint.log
new file mode 100644
index 0000000..e69de29
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/lib/ender/bridge.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/lib/ender/bridge.js
new file mode 100644
index 0000000..d341fac
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/lib/ender/bridge.js
@@ -0,0 +1,105 @@
+!function (doc, $) {
+  // a bunch of this code is borrowed from Qwery so NW is a drop-in replacement
+  var nw = require('nwmatcher')
+    , isNode = function (el, t) {
+        return el && typeof el === 'object' && (t = el.nodeType) && (t == 1 || t == 9)
+      }
+    , arrayLike = function (o) {
+        return (typeof o === 'object' && isFinite(o.length))
+      }
+    , flatten = function (ar) {
+        for (var r = [], i = 0, l = ar.length; i < l; ++i) arrayLike(ar[i]) ? (r = r.concat(ar[i])) : (r[r.length] = ar[i])
+        return r
+      }
+    , uniq = function (ar) {
+        var a = [], i, j
+        o: for (i = 0; i < ar.length; ++i) {
+          for (j = 0; j < a.length; ++j) {
+            if (a[j] == ar[i]) {
+              continue o
+            }
+          }
+          a[a.length] = ar[i]
+        }
+        return a
+      }
+    , normalizeRoot = function (root) {
+        if (!root) return doc
+        if (typeof root == 'string') return nw.select(root)[0]
+        if (!root.nodeType && arrayLike(root)) return root[0]
+        return root
+      }
+    , select = function (selector, _root) {
+        var root = normalizeRoot(_root)
+        if (!root || !selector) return []
+        if (selector === window || isNode(selector)) {
+          return !_root || (selector !== window && isNode(root) && nw.contains(root, container)) ? [selector] : []
+        }
+        if (selector && arrayLike(selector)) return flatten(selector)
+        return nw.select(selector, root)
+      }
+    , is = function (s, r) {
+        var i, l
+        for (i = 0, l = this.length; i < l; i++) {
+          if (nw.match(this[i], s, r)) {
+            return true
+          }
+        }
+        return false
+      }
+
+  $._select = function (selector, root) {
+    // if 'bonzo' is available at run-time use it for <element> creation
+    return ($._select = (function(bonzo) {
+      try {
+        bonzo = require('bonzo')
+        return function (selector, root) {
+          return /^\s*</.test(selector) ? bonzo.create(selector, root) : select(selector, root)
+        }
+      } catch (e) { }
+      return select
+    })())(selector, root)
+  }
+
+  $.ender({
+      // boolean, does at least one element in the collection match the given selector
+      is: is
+    , match: is
+      // find all elements that are children of the elements in this collection matching
+      // the given selector
+    , find: function (s) {
+        var r = [], i, l, j, k, els
+        for (i = 0, l = this.length; i < l; i++) {
+          els = select(s, this[i])
+          for (j = 0, k = els.length; j < k; j++) r.push(els[j])
+        }
+        return $(uniq(r))
+      }
+      // add additional elements to this collection matching the given selector
+    , and: function (s, r) {
+        var plus = $(s, r)
+        for (var i = this.length, j = 0, l = this.length + plus.length; i < l; i++, j++) {
+          this[i] = plus[j]
+        }
+        return this
+      }
+  }, true)
+
+  $.ender({
+      // allow for NW.Dom.select(selector, root, callback), for speedy code such as
+      // $.select("div", null, function ( e ) { e.style.backgroundColor = "#ffe"; });
+      select: function () {
+        return $(nw.select.apply(null, arguments))
+      }
+      // like querySelector(), return only the first match, document-order
+    , first: function (selector, root) {
+        return $(nw.select(selector, root, function() { return false }))
+      }
+      // direct access in to NW.Dom.configure(options), for use such as:
+      // $.configure({ USE_QSAPI: false, VERBOSITY: false });
+    , configure: function (options) {
+        nw.configure(options)
+      }
+  })
+
+}(document, ender)
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/lib/prototype/selector_engine.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/lib/prototype/selector_engine.js
new file mode 100644
index 0000000..2c2f9c4
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/lib/prototype/selector_engine.js
@@ -0,0 +1,23 @@
+Prototype._original_property = window.NW;
+//= require "repository/src/nwmatcher"
+
+(function(engine, selector) {
+  var engSelect = engine.select, extend = Element.extend;
+
+  function select(selector, context) {
+    return engSelect(selector, context, extend);
+  }
+
+  // back compat negated attribute operator '!='
+  // comment this out for strict CSS3 compliance
+  engine.registerOperator('!=', 'n!="%m"');
+
+  selector.engine = engine;
+  selector.select = extend === Prototype.K ? engSelect : select;
+  selector.match = engine.match;
+  selector.configure = engine.configure;
+})(NW.Dom, Prototype.Selector);
+
+// Restore globals.
+window.NW = Prototype._original_property;
+delete Prototype._original_property;
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/package.json b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/package.json
new file mode 100644
index 0000000..3bd7641
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/package.json
@@ -0,0 +1,43 @@
+{
+  "name": "nwmatcher",
+  "version": "1.3.1",
+  "description": "A CSS3-compliant JavaScript selector engine.",
+  "homepage": "http://javascript.nwbox.com/NWMatcher/",
+  "main": "./src/nwmatcher",
+  "keywords": [
+    "css",
+    "matcher",
+    "selector",
+    "ender"
+  ],
+  "licenses": [
+    {
+      "type": "MIT",
+      "url": "http://javascript.nwbox.com/NWMatcher/MIT-LICENSE"
+    }
+  ],
+  "author": {
+    "name": "Diego Perini",
+    "email": "diego.perini at gmail.com",
+    "url": "http://www.iport.it/"
+  },
+  "maintainers": [
+    {
+      "name": "Diego Perini",
+      "email": "diego.perini at gmail.com",
+      "url": "http://www.iport.it/"
+    }
+  ],
+  "bugs": {
+    "url": "http://github.com/dperini/nwmatcher/issues"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/dperini/nwmatcher.git"
+  },
+  "ender": "./lib/ender/bridge.js",
+  "readme": "ERROR: No README data found!",
+  "readmeFilename": "README",
+  "_id": "nwmatcher at 1.3.1",
+  "_from": "nwmatcher@~1.3.1"
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-cache.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-cache.js
new file mode 100644
index 0000000..1980e52
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-cache.js
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2007-2013 Diego Perini
+ * All rights reserved.
+ *
+ * Caching/memoization module for NWMatcher
+ *
+ * Added capabilities:
+ *
+ * - Mutation Events are feature tested and used safely
+ * - handle caching different document types HTML/XML/SVG
+ * - store result sets for different selectors / contexts
+ * - simultaneously control mutation on multiple documents
+ *
+ */
+
+(function(global) {
+
+  // export the public API for CommonJS implementations,
+  // for headless JS engines or for standard web browsers
+  var Dom =
+    // as CommonJS/NodeJS module
+    typeof exports == 'object' ? exports :
+    // create or extend NW namespace
+    ((global.NW || (global.NW = { })) &&
+    (global.NW.Dom || (global.NW.Dom = { }))),
+
+  Contexts = { },
+  Results = { },
+
+  isEnabled = false,
+  isExpired = true,
+  isPaused = false,
+
+  context = global.document,
+  root = context.documentElement,
+
+  // last time cache initialization was called
+  lastCalled = 0,
+
+  // minimum time allowed between calls to the cache initialization
+  minCacheRest = 15, //ms
+
+  mutationTest =
+    function(type, callback) {
+      var isSupported = false,
+      root = document.documentElement,
+      div = document.createElement('div'),
+      handler = function() { isSupported = true; };
+      root.insertBefore(div, root.firstChild);
+      div.addEventListener(type, handler, true);
+      if (callback && callback.call) callback(div);
+      div.removeEventListener(type, handler, true);
+      root.removeChild(div);
+      return isSupported;
+    },
+
+  // check for Mutation Events, DOMAttrModified should be
+  // enough to ensure DOMNodeInserted/DOMNodeRemoved exist
+  HACKED_MUTATION_EVENTS = false,
+
+  NATIVE_MUTATION_EVENTS = root.addEventListener ?
+    mutationTest('DOMAttrModified', function(e) { e.setAttribute('id', 'nw'); }) : false,
+
+  loadResults =
+    function(selector, from, doc, root) {
+      if (isEnabled && !isPaused) {
+        if (!isExpired) {
+          if (Results[selector] && Contexts[selector] === from) {
+            return Results[selector];
+          }
+        } else {
+          // pause caching while we are getting
+          // hammered by dom mutations (jdalton)
+          now = new Date;
+          if ((now - lastCalled) < minCacheRest) {
+            isPaused = isExpired = true;
+            setTimeout(function() { isPaused = false; }, minCacheRest);
+          } else setCache(true, doc);
+          lastCalled = now;
+        }
+      }
+      return undefined;
+    },
+
+  saveResults =
+    function(selector, from, doc, data) {
+      Contexts[selector] = from;
+      Results[selector] = data;
+      return;
+    },
+
+  /*-------------------------------- CACHING ---------------------------------*/
+
+  // invoked by mutation events to expire cached parts
+  mutationWrapper =
+    function(event) {
+      var d = event.target.ownerDocument || event.target;
+      stopMutation(d);
+      expireCache(d);
+    },
+
+  // append mutation events
+  startMutation =
+    function(d) {
+      if (!d.isCaching && d.addEventListener) {
+        // FireFox/Opera/Safari/KHTML have support for Mutation Events
+        d.addEventListener('DOMAttrModified', mutationWrapper, true);
+        d.addEventListener('DOMNodeInserted', mutationWrapper, true);
+        d.addEventListener('DOMNodeRemoved',  mutationWrapper, true);
+        d.isCaching = true;
+      }
+    },
+
+  // remove mutation events
+  stopMutation =
+    function(d) {
+      if (d.isCaching && d.removeEventListener) {
+        d.removeEventListener('DOMAttrModified', mutationWrapper, true);
+        d.removeEventListener('DOMNodeInserted', mutationWrapper, true);
+        d.removeEventListener('DOMNodeRemoved',  mutationWrapper, true);
+        d.isCaching = false;
+      }
+    },
+
+  // enable/disable context caching system
+  // @d optional document context (iframe, xml document)
+  // script loading context will be used as default context
+  setCache =
+    function(enable, d) {
+      if (!!enable) {
+        isExpired = false;
+        startMutation(d);
+      } else {
+        isExpired = true;
+        stopMutation(d);
+      }
+      isEnabled = !!enable;
+    },
+
+  // expire complete cache
+  // can be invoked by Mutation Events or
+  // programmatically by other code/scripts
+  // document context is mandatory no checks
+  expireCache =
+    function(d) {
+      isExpired = true;
+      Contexts = { };
+      Results = { };
+    };
+
+  if (!NATIVE_MUTATION_EVENTS && root.addEventListener && Element && Element.prototype) {
+    if (mutationTest('DOMNodeInserted', function(e) { e.appendChild(document.createElement('div')); }) &&
+        mutationTest('DOMNodeRemoved', function(e) { e.removeChild(e.appendChild(document.createElement('div'))); })) {
+      HACKED_MUTATION_EVENTS = true;
+      Element.prototype._setAttribute = Element.prototype.setAttribute;
+      Element.prototype.setAttribute =
+        function(name, val) {
+          this._setAttribute(name, val);
+          mutationWrapper({
+            target: this,
+            type: 'DOMAttrModified',
+            attrName: name,
+            attrValue: val });
+        };
+    }
+  }
+
+  isEnabled = NATIVE_MUTATION_EVENTS || HACKED_MUTATION_EVENTS;
+
+  /*------------------------------- PUBLIC API -------------------------------*/
+
+  // save results into cache
+  Dom.saveResults = saveResults;
+
+  // load results from cache
+  Dom.loadResults = loadResults;
+
+  // expire DOM tree cache
+  Dom.expireCache = expireCache;
+
+  // enable/disable cache
+  Dom.setCache = setCache;
+
+})(this);
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-jquery.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-jquery.js
new file mode 100644
index 0000000..6656e17
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-jquery.js
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2007-2009 Diego Perini
+ * All rights reserved.
+ *
+ * this is just a small example to show
+ * how an extension for NWMatcher could be
+ * adapted to handle special jQuery selectors
+ *
+ * Child Selectors
+ * :even, :odd, :eq, :lt, :gt, :first, :last, :nth
+ *
+ * Pseudo Selectors
+ * :has, :button, :header, :input, :checkbox, :radio, :file, :image
+ * :password, :reset, :submit, :text, :hidden, :visible, :parent
+ *
+ */
+
+// for structural pseudo-classes extensions
+NW.Dom.registerSelector(
+  'jquery:child',
+  /^\:((?:(nth|eq|lt|gt)\(([^()]*)\))|(?:even|odd|first|last))(.*)/i,
+  function(match, source, selector) {
+
+  var status = true, ACCEPT_NODE = NW.Dom.ACCEPT_NODE;
+
+  switch (match[1].toLowerCase()) {
+    case 'odd':
+      source = source.replace(ACCEPT_NODE, 'if((x=x^1)==0){' + ACCEPT_NODE + '}');
+      break;
+    case 'even':
+      source = source.replace(ACCEPT_NODE, 'if((x=x^1)==1){' + ACCEPT_NODE + '}');
+      break;
+    case 'first':
+      source = 'n=h.getElementsByTagName(e.nodeName);if(n.length&&n[0]===e){' + source + '}';
+      break;
+    case 'last':
+      source = 'n=h.getElementsByTagName(e.nodeName);if(n.length&&n[n.length-1]===e){' + source + '}';
+      break;
+	default:
+      switch (match[2].toLowerCase()) {
+        case 'nth':
+          source = 'n=h.getElementsByTagName(e.nodeName);if(n.length&&n[' + match[3] + ']===e){' + source + '}';
+          break;
+        case 'eq':
+          source = source.replace(ACCEPT_NODE, 'if(x++==' + match[3] + '){' + ACCEPT_NODE + '}');
+          break;
+        case 'lt':
+          source = source.replace(ACCEPT_NODE, 'if(x++<' + match[3] + '){' + ACCEPT_NODE + '}');
+          break;
+        case 'gt':
+          source = source.replace(ACCEPT_NODE, 'if(x++>' + match[3] + '){' + ACCEPT_NODE + '}');
+          break;
+        default:
+          status = false;
+          break;
+      }
+      break;
+  }
+
+  // compiler will add this to "source"
+  return {
+    'source': source,
+    'status': status
+  };
+
+});
+
+
+// for element pseudo-classes extensions
+NW.Dom.registerSelector(
+  'jquery:pseudo',
+  /^\:(has|checkbox|file|image|password|radio|reset|submit|text|button|input|header|hidden|visible|parent)(?:\(\s*(["']*)?([^'"()]*)\2\s*\))?(.*)/i,
+  function(match, source) {
+
+  var status = true, ACCEPT_NODE = NW.Dom.ACCEPT_NODE;
+
+  switch(match[1].toLowerCase()) {
+    case 'has':
+      source = source.replace(ACCEPT_NODE, 'if(e.getElementsByTagName("' + match[3].replace(/^\s|\s$/g, '') + '")[0]){' + ACCEPT_NODE + '}');
+      break;
+    case 'checkbox':
+    case 'file':
+    case 'image':
+    case 'password':
+    case 'radio':
+    case 'reset':
+    case 'submit':
+    case 'text':
+      // :checkbox, :file, :image, :password, :radio, :reset, :submit, :text
+      source = 'if(/^' + match[1] + '$/i.test(e.type)){' + source + '}';
+      break;
+    case 'button':
+    case 'input':
+      source = 'if(e.type||/button/i.test(e.nodeName)){' + source + '}';
+      break;
+    case 'header':
+      source = 'if(/h[1-6]/i.test(e.nodeName)){' + source + '}';
+      break;
+    case 'hidden':
+      source = 'if(!e.offsetWidth&&!e.offsetHeight){' + source + '}';
+      break;
+    case 'visible':
+      source = 'if(e.offsetWidth||e.offsetHeight){' + source + '}';
+      break;
+    case 'parent':
+      source += 'if(e.firstChild){' + source + '}';
+      break;
+    default:
+      status = false;
+      break;
+  }
+
+  // compiler will add this to "source"
+  return {
+    'source': source,
+    'status': status
+  };
+
+});
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-pseudos.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-pseudos.js
new file mode 100644
index 0000000..79fc1db
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-pseudos.js
@@ -0,0 +1,275 @@
+/*
+ * Copyright (C) 2007-2013 Diego Perini
+ * All rights reserved.
+ *
+ * CSS3 pseudo-classes extension for NWMatcher
+ *
+ * Added capabilities:
+ *
+ * - structural pseudo-classes
+ *
+ * :root, :empty,
+ * :nth-child(), nth-of-type(),
+ * :nth-last-child(), nth-last-of-type(),
+ * :first-child, :last-child, :only-child
+ * :first-of-type, :last-of-type, :only-of-type
+ *
+ * - negation, language, target and UI element pseudo-classes
+ *
+ * :not(), :target, :lang(), :target
+ * :link, :visited, :active, :focus, :hover,
+ * :checked, :disabled, :enabled, :selected
+ */
+
+(function() {
+
+  var LINK_NODES = {
+    'a': 1, 'A': 1,
+    'area': 1, 'AREA': 1,
+    'link': 1, 'LINK': 1
+  },
+
+  root = document.documentElement,
+
+  contains = 'compareDocumentPosition' in root ?
+    function(container, element) {
+      return (container.compareDocumentPosition(element) & 16) == 16;
+    } : 'contains' in root ?
+    function(container, element) {
+      return element.nodeType == 1 && container.contains(element);
+    } :
+    function(container, element) {
+      while ((element = element.parentNode) && element.nodeType == 1) {
+        if (element === container) return true;
+      }
+      return false;
+    },
+
+  isLink =
+    function(element) {
+      return element.getAttribute('href') && LINK_NODES[element.nodeName];
+    },
+
+  isEmpty =
+    function(node) {
+      node = node.firstChild;
+      while (node) {
+        if (node.nodeType == 3 || node.nodeName > '@') return false;
+        node = node.nextSibling;
+      }
+      return true;
+    },
+
+  nthElement =
+    function(element, last) {
+      var count = 1, succ = last ? 'nextSibling' : 'previousSibling';
+      while ((element = element[succ])) {
+        if (element.nodeName > '@') ++count;
+      }
+      return count;
+    },
+
+  nthOfType =
+    function(element, last) {
+      var count = 1, succ = last ? 'nextSibling' : 'previousSibling', type = element.nodeName;
+      while ((element = element[succ])) {
+        if (element.nodeName == type) ++count;
+      }
+      return count;
+    };
+
+  NW.Dom.Snapshot['contains'] = contains;
+
+  NW.Dom.Snapshot['isLink'] = isLink;
+  NW.Dom.Snapshot['isEmpty'] = isEmpty;
+  NW.Dom.Snapshot['nthOfType'] = nthOfType;
+  NW.Dom.Snapshot['nthElement'] = nthElement;
+
+})();
+
+NW.Dom.registerSelector(
+  'nwmatcher:spseudos',
+  /^\:(root|empty|(?:first|last|only)(?:-child|-of-type)|nth(?:-last)?(?:-child|-of-type)\(\s*(even|odd|(?:[-+]{0,1}\d*n\s*)?[-+]{0,1}\s*\d*)\s*\))?(.*)/i,
+  function(match, source) {
+
+  var a, n, b, status = true, test, type;
+
+  switch (match[1]) {
+
+    case 'root':
+      if (match[3])
+        source = 'if(e===h||s.contains(h,e)){' + source + '}';
+      else
+        source = 'if(e===h){' + source + '}';
+      break;
+
+    case 'empty':
+      source = 'if(s.isEmpty(e)){' + source + '}';
+      break;
+
+    default:
+      if (match[1] && match[2]) {
+
+        if (match[2] == 'n') {
+          source = 'if(e!==h){' + source + '}';
+          break;
+        } else if (match[2] == 'even') {
+          a = 2;
+          b = 0;
+        } else if (match[2] == 'odd') {
+          a = 2;
+          b = 1;
+        } else {
+          b = ((n = match[2].match(/(-?\d+)$/)) ? parseInt(n[1], 10) : 0);
+          a = ((n = match[2].match(/(-?\d*)n/i)) ? parseInt(n[1], 10) : 0);
+          if (n && n[1] == '-') a = -1;
+        }
+        test = a > 1 ?
+          (/last/i.test(match[1])) ? '(n-(' + b + '))%' + a + '==0' :
+          'n>=' + b + '&&(n-(' + b + '))%' + a + '==0' : a < -1 ?
+          (/last/i.test(match[1])) ? '(n-(' + b + '))%' + a + '==0' :
+          'n<=' + b + '&&(n-(' + b + '))%' + a + '==0' : a=== 0 ?
+          'n==' + b :
+          (/last/i.test(match[1])) ?
+          a == -1 ? 'n>=' + b : 'n<=' + b :
+          a == -1 ? 'n<=' + b : 'n>=' + b;
+        source =
+          'if(e!==h){' +
+            'n=s[' + (/-of-type/i.test(match[1]) ? '"nthOfType"' : '"nthElement"') + ']' +
+              '(e,' + (/last/i.test(match[1]) ? 'true' : 'false') + ');' +
+            'if(' + test + '){' + source + '}' +
+          '}';
+
+      } else if (match[1]) {
+
+        a = /first/i.test(match[1]) ? 'previous' : 'next';
+        n = /only/i.test(match[1]) ? 'previous' : 'next';
+        b = /first|last/i.test(match[1]);
+        type = /-of-type/i.test(match[1]) ? '&&n.nodeName!==e.nodeName' : '&&n.nodeName<"@"';
+        source = 'if(e!==h){' +
+          ( 'n=e;while((n=n.' + a + 'Sibling)' + type + ');if(!n){' + (b ? source :
+            'n=e;while((n=n.' + n + 'Sibling)' + type + ');if(!n){' + source + '}') + '}' ) + '}';
+
+      } else {
+
+        status = false;
+
+      }
+      break;
+  }
+
+  return {
+    'source': source,
+    'status': status
+  };
+
+});
+
+NW.Dom.registerSelector(
+  'nwmatcher:dpseudos',
+  /^\:(link|visited|target|active|focus|hover|checked|disabled|enabled|selected|lang\(([-\w]{2,})\)|not\(([^()]*|.*)\))?(.*)/i,
+  (function() {
+
+    var doc = document,
+    Config = NW.Dom.Config,
+    Tokens = NW.Dom.Tokens,
+
+    reTrimSpace = RegExp('^\\s+|\\s+$', 'g'),
+
+    reSimpleNot = RegExp('^((?!:not)' +
+      '(' + Tokens.prefixes + '|' + Tokens.identifier +
+      '|\\([^()]*\\))+|\\[' + Tokens.attributes + '\\])$');
+
+    return function(match, source) {
+
+      var expr, status = true, test;
+
+      switch (match[1].match(/^\w+/)[0]) {
+
+        case 'not':
+          expr = match[3].replace(reTrimSpace, '');
+          if (Config.SIMPLENOT && !reSimpleNot.test(expr)) {
+            NW.Dom.emit('Negation pseudo-class only accepts simple selectors "' + match.join('') + '"');
+          } else {
+            if ('compatMode' in doc) {
+              source = 'if(!' + NW.Dom.compile(expr, '', false) + '(e,s,r,d,h,g)){' + source + '}';
+            } else {
+              source = 'if(!s.match(e, "' + expr.replace(/\x22/g, '\\"') + '",g)){' + source +'}';
+            }
+          }
+          break;
+
+        case 'checked':
+          source = 'if((typeof e.form!=="undefined"&&(/^(?:radio|checkbox)$/i).test(e.type)&&e.checked)' +
+            (Config.USE_HTML5 ? '||(/^option$/i.test(e.nodeName)&&(e.selected||e.checked))' : '') +
+            '){' + source + '}';
+          break;
+
+        case 'disabled':
+          source = 'if(((typeof e.form!=="undefined"' +
+            (Config.USE_HTML5 ? '' : '&&!(/^hidden$/i).test(e.type)') +
+            ')||s.isLink(e))&&e.disabled===true){' + source + '}';
+          break;
+
+        case 'enabled':
+          source = 'if(((typeof e.form!=="undefined"' +
+            (Config.USE_HTML5 ? '' : '&&!(/^hidden$/i).test(e.type)') +
+            ')||s.isLink(e))&&e.disabled===false){' + source + '}';
+          break;
+
+        case 'lang':
+          test = '';
+          if (match[2]) test = match[2].substr(0, 2) + '-';
+          source = 'do{(n=e.lang||"").toLowerCase();' +
+            'if((n==""&&h.lang=="' + match[2].toLowerCase() + '")||' +
+            '(n&&(n=="' + match[2].toLowerCase() +
+            '"||n.substr(0,3)=="' + test.toLowerCase() + '")))' +
+            '{' + source + 'break;}}while((e=e.parentNode)&&e!==g);';
+          break;
+
+        case 'target':
+          n = doc.location ? doc.location.hash : '';
+          if (n) {
+            source = 'if(e.id=="' + n.slice(1) + '"){' + source + '}';
+          }
+          break;
+
+        case 'link':
+          source = 'if(s.isLink(e)&&!e.visited){' + source + '}';
+          break;
+
+        case 'visited':
+          source = 'if(s.isLink(e)&&e.visited){' + source + '}';
+          break;
+
+        case 'active':
+          source = 'if(e===d.activeElement){' + source + '}';
+          break;
+
+        case 'hover':
+          source = 'if(e===d.hoverElement){' + source + '}';
+          break;
+
+        case 'focus':
+          source = 'hasFocus' in doc ?
+            'if(e===d.activeElement&&d.hasFocus()&&(e.type||e.href||!isNaN(e.tabIndex))){' + source + '}' :
+            'if(e===d.activeElement&&(e.type||e.href)){' + source + '}';
+          break;
+
+        case 'selected':
+          source = 'if(/^option$/i.test(e.nodeName)&&(e.selected||e.checked)){' + source + '}';
+          break;
+
+        default:
+          status = false;
+          break;
+      }
+
+      return {
+        'source': source,
+        'status': status
+      };
+
+    };
+
+  })());
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-shortcuts.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-shortcuts.js
new file mode 100644
index 0000000..ce6ce62
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-shortcuts.js
@@ -0,0 +1,35 @@
+NW.Dom.shortcuts = (function() {
+
+  // match missing R/L context
+  var nextID = 0,
+  reLeftContext = /^[\x20\t\n\r\f]*[>+~]/,
+  reRightContext = /[>+~][\x20\t\n\r\f]*$/;
+
+  return function(selector, from, alt) {
+
+    // add left context if missing
+    if (reLeftContext.test(selector)) {
+      if (from.nodeType == 9) {
+        selector = '* ' + selector; 
+      } else if (/html|body/i.test(from.nodeName)) {
+        selector = from.nodeName + ' ' + selector;
+      } else if (alt) {
+        selector = NW.Dom.shortcuts(selector, alt);
+      } else if (from.nodeType == 1 && from.id) {
+        selector = '#' + from.id + ' ' + selector;
+      } else {
+        ++nextID;
+        selector = '#' + (from.id = 'NW' + nextID) + ' ' + selector; 
+        //NW.Dom.emit('Unable to resolve a context for the shortcut selector "' + selector + '"');
+      }
+    }
+
+    // add right context if missing
+    if (reRightContext.test(selector)) {
+      selector += ' *';
+    }
+
+    return selector;
+  };
+
+})();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-traversal.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-traversal.js
new file mode 100644
index 0000000..9d2b62f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-traversal.js
@@ -0,0 +1,90 @@
+/*
+ * Element Traversal methods from Juriy Zaytsev (kangax)
+ * used to emulate Prototype up/down/previous/next methods
+ */
+
+(function(D){
+
+  // TODO: all of this needs tests
+  var match = D.match, select = D.select, root = document.documentElement,
+
+  // Use the Element Traversal API if available.
+  nextElement = 'nextElementSibling',
+  previousElement = 'previousElementSibling',
+  parentElement = 'parentElement';
+
+  // Fall back to the DOM Level 1 API.
+  if (!(nextElement in root)) nextElement = 'nextSibling';
+  if (!(previousElement in root)) previousElement = 'previousSibling';
+  if (!(parentElement in root)) parentElement = 'parentNode';
+
+  function walkElements(property, element, expr) {
+    var i = 0, isIndex = typeof expr == 'number';
+    if (typeof expr == 'undefined') {
+      isIndex = true;
+      expr = 0;
+    }
+    while ((element = element[property])) {
+      if (element.nodeType != 1) continue;
+      if (isIndex) {
+        ++i;
+        if (i == expr) return element;
+      } else if (match(element, expr)) {
+        return element;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * @method up
+   * @param {HTMLElement} element element to walk from
+   * @param {String | Number} expr CSS expression or an index
+   * @return {HTMLElement | null}
+   */
+  function up(element, expr) {
+    return walkElements(parentElement, element, expr);
+  }
+  /**
+   * @method next
+   * @param {HTMLElement} element element to walk from
+   * @param {String | Number} expr CSS expression or an index
+   * @return {HTMLElement | null}
+   */
+  function next(element, expr) {
+    return walkElements(nextElement, element, expr);
+  }
+  /**
+   * @method previous
+   * @param {HTMLElement} element element to walk from
+   * @param {String | Number} expr CSS expression or an index
+   * @return {HTMLElement | null}
+   */
+  function previous(element, expr) {
+    return walkElements(previousElement, element, expr);
+  }
+  /**
+   * @method down
+   * @param {HTMLElement} element element to walk from
+   * @param {String | Number} expr CSS expression or an index
+   * @return {HTMLElement | null}
+   */
+  function down(element, expr) {
+    var isIndex = typeof expr == 'number', descendants, index, descendant;
+    if (expr === null) {
+      element = element.firstChild;
+      while (element && element.nodeType != 1) element = element[nextElement];
+      return element;
+    }
+    if (!isIndex && match(element, expr) || isIndex && expr === 0) return element;
+    descendants = select('*', element);
+    if (isIndex) return descendants[expr] || null;
+    index = 0;
+    while ((descendant = descendants[index]) && !match(descendant, expr)) { ++index; }
+    return descendant || null;
+  }
+  D.up = up;
+  D.down = down;
+  D.next = next;
+  D.previous = previous;
+})(NW.Dom);
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-webforms.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-webforms.js
new file mode 100644
index 0000000..f8fabc2
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-webforms.js
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2007-2010 Diego Perini
+ * All rights reserved.
+ *
+ * this is just a small example to show
+ * how an extension for NWMatcher could be
+ * adapted to handle WebForms/HTML5 selectors
+ *
+ * Pseudo Selectors
+ * :default, :indeterminate, :optional, :required,
+ * :valid, :invalid, :in-range, :out-of-range,
+ * :read-only, :read-write
+ * :has, :matches (not yet in a defined specification)
+ *
+ */
+
+// for UI pseudo-classes extensions (WebForms/HTML5)
+NW.Dom.registerSelector(
+  'html5:pseudos',
+  /^\:(default|indeterminate|optional|required|valid|invalid|in-range|out-of-range|read-only|read-write)(.*)/,
+  function(match, source) {
+
+  var status = true,
+
+  HTML5PseudoClasses = {
+      'default': 4, 'indeterminate': 4, 'invalid': 4, 'valid': 4,
+      'optional': 4, 'required': 4, 'read-write': 4, 'read-only': 4
+  };
+
+  switch (match[1]) {
+
+    // HTML5 UI element states (form controls)
+    case 'default': 
+      // only radio buttons, check boxes and option elements
+      source = 'if(((typeof e.form!=="undefined"&&(/radio|checkbox/i).test(e.type))||/option/i.test(e.nodeName))&&(e.defaultChecked||e.defaultSelected)){' + source + '}';
+      break;
+
+    case 'indeterminate':
+      // only radio buttons, check boxes and option elements
+      source = 'if(typeof e.form!=="undefined"&&(/radio|checkbox/i).test(e.type)&&s.select("[checked]",e.form).length===0){' + source + '}';
+      break;
+
+    case 'optional':
+      // only fields for which "required" applies
+      source = 'if(typeof e.form!=="undefined"&&typeof e.required!="undefined"&&!e.required){' + source + '}';
+      break;
+
+    case 'required':
+      // only fields for which "required" applies
+      source = 'if(typeof e.form!=="undefined"&&typeof e.required!="undefined"&&e.required){' + source + '}';
+      break;
+
+    case 'read-write':
+      // only fields for which "readOnly" applies
+      source = 'if(typeof e.form!=="undefined"&&typeof e.readOnly!="undefined"&&!e.readOnly){' + source + '}';
+      break;
+
+    case 'read-only':
+      // only fields for which "readOnly" applies
+      source = 'if(typeof e.form!=="undefined"&&typeof e.readOnly!="undefined"&&e.readOnly){' + source + '}';
+      break;
+
+    case 'invalid':
+      // only fields for which validity applies
+      source = 'if(typeof e.form!=="undefined"&&typeof e.validity=="object"&&!e.validity.valid){' + source + '}';
+      break;
+
+    case 'valid':
+      // only fields for which validity applies
+      source = 'if(typeof e.form!=="undefined"&&typeof e.validity=="object"&&e.validity.valid){' + source + '}';
+      break;
+
+    case 'in-range':
+      // only fields for which validity applies
+      source = 'if(typeof e.form!=="undefined"&&' +
+        '(s.getAttribute(e,"min")||s.getAttribute(e,"max"))&&' +
+        'typeof e.validity=="object"&&!e.validity.typeMismatch&&' +
+        '!e.validity.rangeUnderflow&&!e.validity.rangeOverflow){' + source + '}';
+      break;
+
+    case 'out-of-range':
+      // only fields for which validity applies
+      source = 'if(typeof e.form!=="undefined"&&' +
+        '(s.getAttribute(e,"min")||s.getAttribute(e,"max"))&&' +
+        'typeof e.validity=="object"&&(e.validity.rangeUnderflow||e.validity.rangeOverflow)){' + source + '}';
+      break;
+
+    default:
+      status = false;
+      break;
+
+  }
+
+  // compiler will add this to "source"
+  return {
+    'source': source,
+    'status': status
+  };
+
+});
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/nwmatcher-base.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/nwmatcher-base.js
new file mode 100644
index 0000000..bc4b5eb
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/nwmatcher-base.js
@@ -0,0 +1,683 @@
+/*
+ * Copyright (C) 2007-2013 Diego Perini
+ * All rights reserved.
+ *
+ * nwmatcher-base.js - A fast CSS selector engine and matcher
+ *
+ * Author: Diego Perini <diego.perini at gmail com>
+ * Version: 1.3.1
+ * Created: 20070722
+ * Release: 20130211
+ *
+ * License:
+ *  http://javascript.nwbox.com/NWMatcher/MIT-LICENSE
+ * Download:
+ *  http://javascript.nwbox.com/NWMatcher/nwmatcher.js
+ */
+
+(function(global, factory) {
+
+  if (typeof module === 'object' && typeof exports === 'object') {
+    module.exports = function (browserGlobal) {
+      var exports = { };
+      factory(browserGlobal, exports);
+      return exports;
+    };
+  } else {
+    if (!global.NW) {
+      global.NW = { };
+    }
+    if (!global.NW.Dom) {
+      global.NW.Dom = { };
+    }
+    factory(global, global.NW.Dom);
+  }
+
+})(this, function(global, exports) {
+
+  var version = 'nwmatcher-1.3.1',
+
+  Dom = exports,
+
+  doc = global.document,
+  root = doc.documentElement,
+
+  slice = [ ].slice,
+
+  isSingleMatch,
+  isSingleSelect,
+
+  lastSlice,
+  lastContext,
+  lastPosition,
+
+  lastMatcher,
+  lastSelector,
+
+  lastPartsMatch,
+  lastPartsSelect,
+
+  prefixes = '[#.:]?',
+  operators = '([~*^$|!]?={1})',
+  whitespace = '[\\x20\\t\\n\\r\\f]*',
+  combinators = '[\\x20]|[>+~][^>+~]',
+  pseudoparms = '(?:[-+]?\\d*n)?[-+]?\\d*',
+
+  quotedvalue = '"[^"]*"' + "|'[^']*'",
+  skipgroup = '\\[.*\\]|\\(.*\\)|\\{.*\\}',
+
+  encoding = '(?:[-\\w]|[^\\x00-\\xa0]|\\\\.)',
+  identifier = '(?:-?[_a-zA-Z]{1}[-\\w]*|[^\\x00-\\xa0]+|\\\\.+)+',
+
+  attrcheck = '(' + quotedvalue + '|' + identifier + ')',
+  attributes = whitespace + '(' + encoding + '*:?' + encoding + '+)' +
+    whitespace + '(?:' + operators + whitespace + attrcheck + ')?' + whitespace,
+
+  attrmatcher = attributes.replace(attrcheck, '([\\x22\\x27]*)((?:\\\\?.)*?)\\3'),
+
+  pseudoclass = '((?:' +
+    pseudoparms + '|' + quotedvalue + '|' +
+    prefixes + '|' + encoding + '+|' +
+    '\\[' + attributes + '\\]|' +
+    '\\(.+\\)|' + whitespace + '|' +
+    ',)+)',
+
+  extensions = '.+',
+
+  standardValidator =
+    '(?=[\\x20\\t\\n\\r\\f]*[^>+~(){}<>])' +
+    '(' +
+    '\\*' +
+    '|(?:' + prefixes + identifier + ')' +
+    '|' + combinators +
+    '|\\[' + attributes + '\\]' +
+    '|\\(' + pseudoclass + '\\)' +
+    '|\\{' + extensions + '\\}' +
+    '|(?:,|' + whitespace + ')' +
+    ')+',
+
+  extendedValidator = standardValidator.replace(pseudoclass, '.*'),
+
+  reValidator = RegExp(standardValidator, 'g'),
+
+  reTrimSpaces = RegExp('^' +
+    whitespace + '|' + whitespace + '$', 'g'),
+
+  reSplitGroup = RegExp('(' +
+    '[^,\\\\()[\\]]+' +
+    '|\\[[^[\\]]*\\]|\\[.*\\]' +
+    '|\\([^()]+\\)|\\(.*\\)' +
+    '|\\{[^{}]+\\}|\\{.*\\}' +
+    '|\\\\.' +
+    ')+', 'g'),
+
+  reSplitToken = RegExp('(' +
+    '\\[' + attributes + '\\]|' +
+    '\\(' + pseudoclass + '\\)|' +
+    '\\\\.|[^\\x20\\t\\n\\r\\f>+~])+', 'g'),
+
+  reWhiteSpace = /[\x20\t\n\r\f]+/g,
+
+  reOptimizeSelector = RegExp(identifier + '|^$'),
+
+  ATTR_BOOLEAN = {
+    checked: 1, disabled: 1, ismap: 1,
+    multiple: 1, readonly: 1, selected: 1
+  },
+
+  ATTR_DEFAULT = {
+    value: 'defaultValue',
+    checked: 'defaultChecked',
+    selected: 'defaultSelected'
+  },
+
+  ATTR_URIDATA = {
+    action: 2, cite: 2, codebase: 2, data: 2, href: 2,
+    longdesc: 2, lowsrc: 2, src: 2, usemap: 2
+  },
+
+  Selectors = { },
+
+  Operators = {
+     '=': "n=='%m'",
+    '^=': "n.indexOf('%m')==0",
+    '*=': "n.indexOf('%m')>-1",
+    '|=': "(n+'-').indexOf('%m-')==0",
+    '~=': "(' '+n+' ').indexOf(' %m ')>-1",
+    '$=': "n.substr(n.length-'%m'.length)=='%m'"
+  },
+
+  Optimize = {
+    ID: RegExp('^\\*?#(' + encoding + '+)|' + skipgroup),
+    TAG: RegExp('^(' + encoding + '+)|' + skipgroup),
+    CLASS: RegExp('^\\*?\\.(' + encoding + '+$)|' + skipgroup)
+  },
+
+  Patterns = {
+    universal: /^\*(.*)/,
+    id: RegExp('^#(' + encoding + '+)(.*)'),
+    tagName: RegExp('^(' + encoding + '+)(.*)'),
+    className: RegExp('^\\.(' + encoding + '+)(.*)'),
+    attribute: RegExp('^\\[' + attrmatcher + '\\](.*)'),
+    children: /^[\x20\t\n\r\f]*\>[\x20\t\n\r\f]*(.*)/,
+    adjacent: /^[\x20\t\n\r\f]*\+[\x20\t\n\r\f]*(.*)/,
+    relative: /^[\x20\t\n\r\f]*\~[\x20\t\n\r\f]*(.*)/,
+    ancestor: /^[\x20\t\n\r\f]+(.*)/
+  },
+
+  QUIRKS_MODE,
+  XML_DOCUMENT,
+
+  GEBTN = 'getElementsByTagName' in doc,
+  GEBCN = 'getElementsByClassName' in doc,
+
+  IE_LT_9 = typeof doc.addEventListener != 'function',
+
+  INSENSITIVE_MAP = {
+    'href': 1, 'lang': 1, 'src': 1, 'style': 1, 'title': 1,
+    'type': 1, 'xmlns': 1, 'xml:lang': 1, 'xml:space': 1
+  },
+
+  TO_UPPER_CASE = IE_LT_9 ? '.toUpperCase()' : '',
+
+  ACCEPT_NODE = 'r[r.length]=c[k];if(f&&false===f(c[k]))break main;else continue main;',
+  REJECT_NODE = IE_LT_9 ? 'if(e.nodeName<"A")continue;' : '',
+
+  Config = {
+    CACHING: false,
+    SIMPLENOT: true,
+    UNIQUE_ID: true,
+    USE_HTML5: true,
+    VERBOSITY: true
+  },
+
+  configure =
+    function(option) {
+      if (typeof option == 'string') { return Config[option]; }
+      if (typeof option != 'object') { return false; }
+      for (var i in option) {
+        Config[i] = !!option[i];
+        if (i == 'SIMPLENOT') {
+          matchContexts = { };
+          matchResolvers = { };
+          selectContexts = { };
+          selectResolvers = { };
+        }
+      }
+      reValidator = RegExp(Config.SIMPLENOT ?
+        standardValidator : extendedValidator, 'g');
+      return true;
+    },
+
+  concatCall =
+    function(data, elements, callback) {
+      var i = -1, element;
+      while ((element = elements[++i])) {
+        if (false === callback(data[data.length] = element)) { break; }
+      }
+      return data;
+    },
+
+  emit =
+    function(message) {
+      if (Config.VERBOSITY) { throw Error(message); }
+      if (global.console && global.console.log) {
+        global.console.log(message);
+      }
+    },
+
+  switchContext =
+    function(from, force) {
+      var oldDoc = doc;
+      lastContext = from;
+      doc = from.ownerDocument || from;
+      if (force || oldDoc !== doc) {
+        root = doc.documentElement;
+        XML_DOCUMENT = doc.createElement('DiV').nodeName == 'DiV';
+        QUIRKS_MODE = !XML_DOCUMENT &&
+          typeof doc.compatMode == 'string' ?
+          doc.compatMode.indexOf('CSS') < 0 :
+          (function() {
+            var style = doc.createElement('div').style;
+            return style && (style.width = 1) && style.width == '1px';
+          })();
+
+        Config.CACHING && Dom.setCache(true, doc);
+      }
+    },
+
+  byIdRaw =
+    function(id, elements) {
+      var i = 0, element = null;
+      while ((element = elements[i])) {
+        if (element.getAttribute('id') == id) {
+          break;
+        }
+        ++i;
+      }
+      return element;
+    },
+
+  _byId = !('fileSize' in doc) ?
+    function(id, from) {
+      id = id.replace(/\\([^\\]{1})/g, '$1');
+      return from.getElementById && from.getElementById(id) ||
+        byIdRaw(id, from.getElementsByTagName('*'));
+    } :
+    function(id, from) {
+      var element = null;
+      id = id.replace(/\\([^\\]{1})/g, '$1');
+      if (XML_DOCUMENT || from.nodeType != 9) {
+        return byIdRaw(id, from.getElementsByTagName('*'));
+      }
+      if ((element = from.getElementById(id)) &&
+        element.name == id && from.getElementsByName) {
+        return byIdRaw(id, from.getElementsByName(id));
+      }
+      return element;
+    },
+
+  byId =
+    function(id, from) {
+      from || (from = doc);
+      if (lastContext !== from) { switchContext(from); }
+      return _byId(id, from);
+    },
+
+  getAttribute =
+    function(node, attribute) {
+      attribute = attribute.toLowerCase();
+      if (typeof node[attribute] == 'object') {
+        return node.attributes[attribute] &&
+          node.attributes[attribute].value || '';
+      }
+      return (
+        attribute == 'type' ? node.getAttribute(attribute) || '' :
+        ATTR_URIDATA[attribute] ? node.getAttribute(attribute, 2) || '' :
+        ATTR_BOOLEAN[attribute] ? node.getAttribute(attribute) ? attribute : 'false' :
+          ((node = node.getAttributeNode(attribute)) && node.value) || '');
+    },
+
+  hasAttribute = root.hasAttribute ?
+    function(node, attribute) {
+        return node.hasAttribute(attribute);
+    } :
+    function(node, attribute) {
+      attribute = attribute.toLowerCase();
+      if (ATTR_DEFAULT[attribute]) {
+        return !!node[ATTR_DEFAULT[attribute]];
+      }
+      node = node.getAttributeNode(attribute);
+      return !!(node && node.specified);
+    },
+
+  compile =
+    function(selector, source, mode) {
+
+      var parts = typeof selector == 'string' ? selector.match(reSplitGroup) : selector;
+
+      typeof source == 'string' || (source = '');
+
+      if (parts.length == 1) {
+        source += compileSelector(parts[0], mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode);
+      } else {
+        var i = -1, seen = { }, token;
+        while ((token = parts[++i])) {
+          token = token.replace(reTrimSpaces, '');
+          if (!seen[token] && (seen[token] = true)) {
+            source += compileSelector(token, mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode);
+          }
+        }
+      }
+
+      if (mode)
+        return Function('c,s,r,d,h,g,f,v',
+          'var N,n,x=0,k=-1,e;main:while((e=c[++k])){' + source + '}return r;');
+      else
+        return Function('e,s,r,d,h,g,f,v',
+          'var N,n,x=0,k=e;' + source + 'return false;');
+    },
+
+  FILTER =
+    'var z=v[@]||(v[@]=[]),l=z.length-1;' +
+    'while(l>=0&&z[l]!==e)--l;' +
+    'if(l!==-1){break;}' +
+    'z[z.length]=e;',
+
+  compileSelector =
+    function(selector, source, mode) {
+
+      var k = 0, expr, match, name, result, status, test, type;
+
+      while (selector) {
+
+        k++;
+
+        if ((match = selector.match(Patterns.universal))) {
+          expr = '';
+        }
+
+        else if ((match = selector.match(Patterns.id))) {
+          source = 'if(' + (XML_DOCUMENT ?
+            's.getAttribute(e,"id")' :
+            '(e.submit?s.getAttribute(e,"id"):e.id)') +
+            '=="' + match[1] + '"' +
+            '){' + source + '}';
+        }
+
+        else if ((match = selector.match(Patterns.tagName))) {
+          source = 'if(e.nodeName' + (XML_DOCUMENT ?
+            '=="' + match[1] + '"' : TO_UPPER_CASE +
+            '=="' + match[1].toUpperCase() + '"') +
+            '){' + source + '}';
+        }
+
+        else if ((match = selector.match(Patterns.className))) {
+          source = 'if((n=' + (XML_DOCUMENT ?
+            'e.getAttribute("class")' : 'e.className') +
+            ')&&n.length&&(" "+' + (QUIRKS_MODE ? 'n.toLowerCase()' : 'n') +
+            '.replace(' + reWhiteSpace + '," ")+" ").indexOf(" ' +
+            (QUIRKS_MODE ? match[1].toLowerCase() : match[1]) + ' ")>-1' +
+            '){' + source + '}';
+        }
+
+        else if ((match = selector.match(Patterns.attribute))) {
+          if (match[2] && !Operators[match[2]]) {
+            emit('Unsupported operator in attribute selectors "' + selector + '"');
+            return '';
+          }
+          test = 'false';
+          if (match[4]) {
+            type = INSENSITIVE_MAP[match[1].toLowerCase()];
+            match[4] =
+              (type ? match[4].toLowerCase() : match[4])
+              .replace(/\\([0-9a-f]{2,2})/g, '\\x$1')
+              .replace(/(\x22|\x27)/g, '\\$1');
+          }
+          if (match[2] && match[4] && (test = Operators[match[2]])) {
+            test = test.replace(/\%m/g, match[4]);
+          } else if (match[2] == '!=' || match[2] == '=') {
+            test = 'n' + match[2] + '="' + match[4] + '"';
+          }
+          expr = 'n=s.' + (match[2] ? 'get' : 'has') + 'Attribute(e,"' + match[1] + '")' + (type ? '.toLowerCase();' : ';');
+          source = expr + 'if(' + (match[2] ? test : 'n') + '){' + source + '}';
+        }
+
+        else if ((match = selector.match(Patterns.adjacent))) {
+          source = (mode ? '' : FILTER.replace(/@/g, k)) + source;
+          source = 'var N' + k + '=e;while(e&&(e=e.previousSibling)){if(e.nodeName>"@"){' + source + 'break;}}e=N' + k + ';';
+        }
+
+        else if ((match = selector.match(Patterns.relative))) {
+          source = (mode ? '' : FILTER.replace(/@/g, k)) + source;
+          source = 'var N' + k + '=e;e=e.parentNode.firstChild;while(e&&e!==N' + k + '){if(e.nodeName>"@"){' + source + '}e=e.nextSibling;}e=N' + k + ';';
+        }
+
+        else if ((match = selector.match(Patterns.children))) {
+          source = (mode ? '' : FILTER.replace(/@/g, k)) + source;
+          source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + 'break;}e=N' + k + ';';
+        }
+
+        else if ((match = selector.match(Patterns.ancestor))) {
+          source = (mode ? '' : FILTER.replace(/@/g, k)) + source;
+          source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + '}e=N' + k + ';';
+        }
+
+        else {
+
+          expr = false;
+          status = false;
+          for (expr in Selectors) {
+            if ((match = selector.match(Selectors[expr].Expression)) && match[1]) {
+              result = Selectors[expr].Callback(match, source);
+              source = result.source;
+              status = result.status;
+              if (status) { break; }
+            }
+          }
+
+          if (!status) {
+            emit('Unknown pseudo-class selector "' + selector + '"');
+            return '';
+          }
+
+          if (!expr) {
+            emit('Unknown token in selector "' + selector + '"');
+            return '';
+          }
+
+        }
+
+        if (!match) {
+          emit('Invalid syntax in selector "' + selector + '"');
+          return '';
+        }
+
+        selector = match && match[match.length - 1];
+      }
+
+      return source;
+    },
+
+  match =
+    function(element, selector, from, callback) {
+
+      var parts;
+
+      if (!(element && element.nodeName > '@')) {
+        emit('Invalid element argument');
+        return false;
+      } else if (typeof selector != 'string') {
+        emit('Invalid selector argument');
+        return false;
+      } else if (lastContext !== from) {
+        switchContext(from || (from = element.ownerDocument));
+      }
+
+      selector = selector.replace(reTrimSpaces, '');
+
+      Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, element, from));
+
+      if (lastMatcher != selector) {
+        if ((parts = selector.match(reValidator)) && parts[0] == selector) {
+          isSingleMatch = (parts = selector.match(reSplitGroup)).length < 2;
+          lastMatcher = selector;
+          lastPartsMatch = parts;
+        } else {
+          emit('The string "' + selector + '", is not a valid CSS selector');
+          return false;
+        }
+      } else parts = lastPartsMatch;
+
+      if (!matchResolvers[selector] || matchContexts[selector] !== from) {
+        matchResolvers[selector] = compile(isSingleMatch ? [selector] : parts, '', false);
+        matchContexts[selector] = from;
+      }
+
+      return matchResolvers[selector](element, Snapshot, [ ], doc, root, from, callback, { });
+    },
+
+  first =
+    function(selector, from) {
+      return select(selector, from, function() { return false; })[0] || null;
+    },
+
+  select =
+    function(selector, from, callback) {
+
+      var i, changed, element, elements, parts, token, original = selector;
+
+      if (arguments.length === 0) {
+        emit('Not enough arguments');
+        return [ ];
+      } else if (typeof selector != 'string') {
+        return [ ];
+      } else if (from && !(/1|9|11/).test(from.nodeType)) {
+        emit('Invalid or illegal context element');
+        return [ ];
+      } else if (lastContext !== from) {
+        switchContext(from || (from = doc));
+      }
+
+      if (Config.CACHING && (elements = Dom.loadResults(original, from, doc, root))) {
+        return callback ? concatCall([ ], elements, callback) : elements;
+      }
+
+      selector = selector.replace(reTrimSpaces, '');
+
+      Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, from));
+
+      if ((changed = lastSelector != selector)) {
+        if ((parts = selector.match(reValidator)) && parts[0] == selector) {
+          isSingleSelect = (parts = selector.match(reSplitGroup)).length < 2;
+          lastSelector = selector;
+          lastPartsSelect = parts;
+        } else {
+          emit('The string "' + selector + '", is not a valid CSS selector');
+          return [ ];
+        }
+      } else parts = lastPartsSelect;
+
+      if (from.nodeType == 11) {
+
+        elements = from.childNodes;
+
+      } else if (isSingleSelect) {
+
+        if (changed) {
+          parts = selector.match(reSplitToken);
+          token = parts[parts.length - 1];
+          lastSlice = token.split(':not')[0];
+          lastPosition = selector.length - token.length;
+        }
+
+        if (Config.UNIQUE_ID && (parts = lastSlice.match(Optimize.ID)) && (token = parts[1])) {
+          if ((element = _byId(token, from))) {
+            if (match(element, selector)) {
+              callback && callback(element);
+              elements = [ element ];
+            } else elements = [ ];
+          }
+        }
+
+        else if (Config.UNIQUE_ID && (parts = selector.match(Optimize.ID)) && (token = parts[1])) {
+          if ((element = _byId(token, doc))) {
+            if ('#' + token == selector) {
+              callback && callback(element);
+              elements = [ element ];
+            } else if (/[>+~]/.test(selector)) {
+              from = element.parentNode;
+            } else {
+              from = element;
+            }
+          } else elements = [ ];
+        }
+
+        if (elements) {
+          Config.CACHING && Dom.saveResults(original, from, doc, elements);
+          return elements;
+        }
+
+        if (!XML_DOCUMENT && GEBTN && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) {
+          if ((elements = from.getElementsByTagName(token)).length === 0) return [ ];
+          selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*');
+        }
+
+        else if (!XML_DOCUMENT && GEBCN && (parts = lastSlice.match(Optimize.CLASS)) && (token = parts[1])) {
+          if ((elements = from.getElementsByClassName(token.replace(/\\([^\\]{1})/g, '$1'))).length === 0) return [ ];
+            selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token,
+              reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1)) ? '' : '*');
+        }
+
+      }
+
+      if (!elements) {
+        if (IE_LT_9) {
+          elements = /^(?:applet|object)$/i.test(from.nodeName) ?
+            from.childNodes : from.all;
+        } else {
+          elements = from.getElementsByTagName('*');
+        }
+      }
+
+      if (!selectResolvers[selector] || selectContexts[selector] !== from) {
+        selectResolvers[selector] = compile(isSingleSelect ? [selector] : parts, REJECT_NODE, true);
+        selectContexts[selector] = from;
+      }
+
+      elements = selectResolvers[selector](elements, Snapshot, [ ], doc, root, from, callback, { });
+
+      Config.CACHING && Dom.saveResults(original, from, doc, elements);
+
+      return elements;
+    },
+
+  FN = function(x) { return x; },
+
+  matchContexts = { },
+  matchResolvers = { },
+
+  selectContexts = { },
+  selectResolvers = { },
+
+  Snapshot = {
+    byId: _byId,
+    match: match,
+    select: select,
+    getAttribute: getAttribute,
+    hasAttribute: hasAttribute
+  };
+
+  Tokens = {
+    prefixes: prefixes,
+    encoding: encoding,
+    operators: operators,
+    whitespace: whitespace,
+    identifier: identifier,
+    attributes: attributes,
+    combinators: combinators,
+    pseudoclass: pseudoclass,
+    pseudoparms: pseudoparms,
+    quotedvalue: quotedvalue
+  };
+
+  Dom.ACCEPT_NODE = ACCEPT_NODE;
+
+  Dom.emit = emit;
+
+  Dom.byId = byId;
+  Dom.match = match;
+  Dom.first = first;
+  Dom.select = select;
+  Dom.compile = compile;
+  Dom.configure = configure;
+
+  Dom.Config = Config;
+
+  Dom.Operators = Operators;
+  Dom.Selectors = Selectors;
+
+  Dom.Snapshot = Snapshot;
+  Dom.Tokens = Tokens;
+
+  Dom.setCache = FN;
+  Dom.shortcuts = FN;
+  Dom.loadResults = FN;
+  Dom.saveResults = FN;
+
+  Dom.registerOperator =
+    function(symbol, resolver) {
+      Operators[symbol] || (Operators[symbol] = resolver);
+    };
+
+  Dom.registerSelector =
+    function(name, rexp, func) {
+      Selectors[name] || (Selectors[name] = {
+        Expression: rexp,
+        Callback: func
+      });
+    };
+
+  switchContext(doc, true);
+
+});
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/nwmatcher-noqsa.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/nwmatcher-noqsa.js
new file mode 100644
index 0000000..aa9d22c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/nwmatcher-noqsa.js
@@ -0,0 +1,841 @@
+/*
+ * Copyright (C) 2007-2013 Diego Perini
+ * All rights reserved.
+ *
+ * nwmatcher-noqsa.js - A fast CSS selector engine and matcher
+ *
+ * Author: Diego Perini <diego.perini at gmail com>
+ * Version: 1.3.1
+ * Created: 20070722
+ * Release: 20130211
+ *
+ * License:
+ *  http://javascript.nwbox.com/NWMatcher/MIT-LICENSE
+ * Download:
+ *  http://javascript.nwbox.com/NWMatcher/nwmatcher.js
+ */
+
+(function(global, factory) {
+
+  if (typeof module == 'object' && typeof exports == 'object') {
+    module.exports = function (browserGlobal) {
+      var exports = { };
+      factory(browserGlobal, exports);
+      return exports;
+    };
+  } else {
+    factory(global,
+      (global.NW || (global.NW = { })) &&
+      (global.NW.Dom || (global.NW.Dom = { })));
+  }
+
+})(this, function(global, exports) {
+
+  var Dom = exports,
+
+  doc = global.document,
+  root = doc.documentElement,
+
+  isSingleMatch,
+  isSingleSelect,
+
+  lastSlice,
+  lastContext,
+  lastPosition,
+
+  lastMatcher,
+  lastSelector,
+
+  lastPartsMatch,
+  lastPartsSelect,
+
+  operators = '([~*^$|!]?={1})',
+  combinators = '[\\s]|[>+~][^>+~]',
+  pseudoparms = '(?:[-+]?\\d*n)?[-+]?\\d*',
+
+  quotedvalue = '"[^"]*"' + "|'[^']*'",
+  skipgroup = '\\[.*\\]|\\(.*\\)|\\{.*\\}',
+
+  encoding = '(?:[-\\w]|[^\\x00-\\xa0]|\\\\.)',
+  identifier = '(?:-?[_a-zA-Z]{1}[-\\w]*|[^\\x00-\\xa0]+|\\\\.+)+',
+
+  attrcheck = '(' + quotedvalue + '|' + identifier + ')',
+  attributes = '\\s*(' + encoding + '*:?' + encoding + '+)\\s*(?:' + operators + '\\s*' + attrcheck + ')?\\s*',
+
+  attrmatcher = attributes.replace(attrcheck, '([\\x22\\x27]*)((?:\\\\?.)*?)\\3'),
+
+  pseudoclass = '((?:' +
+    pseudoparms + '|' + quotedvalue + '|' +
+    '[#.:]?|' + encoding + '+|' +
+    '\\[' + attributes + '\\]|' +
+    '\\(.+\\)|\\s*|' +
+    ',)+)',
+
+  extensions = '.+',
+
+  standardValidator =
+    '(?=\\s*[^>+~(){}<>])' +
+    '(' +
+    '\\*' +
+    '|(?:[#.:]?' + identifier + ')' +
+    '|' + combinators +
+    '|\\[' + attributes + '\\]' +
+    '|\\(' + pseudoclass + '\\)' +
+    '|\\{' + extensions + '\\}' +
+    '|(?:,|\\s*)' +
+    ')+',
+
+  extendedValidator = standardValidator.replace(pseudoclass, '.*'),
+
+  reValidator = RegExp(standardValidator, 'g'),
+
+  reTrimSpaces = /^\s*|\s*$/g,
+
+  reSimpleNot = RegExp('^(' +
+    '(?!:not)' +
+    '([#.:]?' +
+    '|' + identifier +
+    '|\\([^()]*\\))+' +
+    '|\\[' + attributes + '\\]' +
+    ')$'),
+
+  reSplitGroup = /([^,\\()[\]]+|\[[^[\]]*\]|\[.*\]|\([^()]+\)|\(.*\)|\{[^{}]+\}|\{.*\}|\\.)+/g,
+
+  reSplitToken = RegExp('(' +
+    '\\[' + attributes + '\\]|' +
+    '\\(' + pseudoclass + '\\)|' +
+    '\\\\.|[^\\s>+~])+', 'g'),
+
+  reOptimizeSelector = RegExp(identifier + '|^$'),
+
+  QUIRKS_MODE,
+  XML_DOCUMENT,
+
+  GEBTN = 'getElementsByTagName' in doc,
+  GEBCN = 'getElementsByClassName' in doc,
+
+  LINK_NODES = { a: 1, A: 1, area: 1, AREA: 1, link: 1, LINK: 1 },
+
+  ATTR_BOOLEAN = {
+    checked: 1, disabled: 1, ismap: 1,
+    multiple: 1, readonly: 1, selected: 1
+  },
+
+  ATTR_DEFAULT = {
+    value: 'defaultValue',
+    checked: 'defaultChecked',
+    selected: 'defaultSelected'
+  },
+
+  ATTR_URIDATA = {
+    action: 2, cite: 2, codebase: 2, data: 2, href: 2,
+    longdesc: 2, lowsrc: 2, src: 2, usemap: 2
+  },
+
+  Selectors = {
+  },
+
+  Operators = {
+     '=': "n=='%m'",
+    '^=': "n.indexOf('%m')==0",
+    '*=': "n.indexOf('%m')>-1",
+    '|=': "(n+'-').indexOf('%m-')==0",
+    '~=': "(' '+n+' ').indexOf(' %m ')>-1",
+    '$=': "n.substr(n.length-'%m'.length)=='%m'"
+  },
+
+  Optimize = {
+    ID: RegExp('^\\*?#(' + encoding + '+)|' + skipgroup),
+    TAG: RegExp('^(' + encoding + '+)|' + skipgroup),
+    CLASS: RegExp('^\\*?\\.(' + encoding + '+$)|' + skipgroup)
+  },
+
+  Patterns = {
+    spseudos: /^\:(root|empty|(?:first|last|only)(?:-child|-of-type)|nth(?:-last)?(?:-child|-of-type)\(\s*(even|odd|(?:[-+]{0,1}\d*n\s*)?[-+]{0,1}\s*\d*)\s*\))?(.*)/i,
+    dpseudos: /^\:(link|visited|target|active|focus|hover|checked|disabled|enabled|selected|lang\(([-\w]{2,})\)|not\(([^()]*|.*)\))?(.*)/i,
+    attribute: RegExp('^\\[' + attrmatcher + '\\](.*)'),
+    children: /^\s*\>\s*(.*)/,
+    adjacent: /^\s*\+\s*(.*)/,
+    relative: /^\s*\~\s*(.*)/,
+    ancestor: /^\s+(.*)/,
+    universal: /^\*(.*)/,
+    id: RegExp('^#(' + encoding + '+)(.*)'),
+    tagName: RegExp('^(' + encoding + '+)(.*)'),
+    className: RegExp('^\\.(' + encoding + '+)(.*)')
+  },
+
+  concatCall =
+    function(data, elements, callback) {
+      var i = -1, element;
+      while ((element = elements[++i])) {
+        if (false === callback(data[data.length] = element)) { break; }
+      }
+      return data;
+    },
+
+  switchContext =
+    function(from, force) {
+      var oldDoc = doc;
+      lastContext = from;
+      doc = from.ownerDocument || from;
+      if (force || oldDoc !== doc) {
+        root = doc.documentElement;
+        XML_DOCUMENT = doc.createElement('DiV').nodeName == 'DiV';
+        QUIRKS_MODE = !XML_DOCUMENT &&
+          typeof doc.compatMode == 'string' ?
+          doc.compatMode.indexOf('CSS') < 0 :
+          (function() {
+            var style = doc.createElement('div').style;
+            return style && (style.width = 1) && style.width == '1px';
+          })();
+
+        Config.CACHING && Dom.setCache(true, doc);
+      }
+    },
+
+  byIdRaw =
+    function(id, elements) {
+      var i = -1, element = null;
+      while ((element = elements[++i])) {
+        if (element.getAttribute('id') == id) {
+          break;
+        }
+      }
+      return element;
+    },
+
+  _byId = !('fileSize' in doc) ?
+    function(id, from) {
+      id = id.replace(/\\([^\\]{1})/g, '$1');
+      return from.getElementById && from.getElementById(id) ||
+        byIdRaw(id, from.getElementsByTagName('*'));
+    } :
+    function(id, from) {
+      var element = null;
+      id = id.replace(/\\([^\\]{1})/g, '$1');
+      if (XML_DOCUMENT || from.nodeType != 9) {
+        return byIdRaw(id, from.getElementsByTagName('*'));
+      }
+      if ((element = from.getElementById(id)) &&
+        element.name == id && from.getElementsByName) {
+        return byIdRaw(id, from.getElementsByName(id));
+      }
+      return element;
+    },
+
+  byId =
+    function(id, from) {
+      from || (from = doc);
+      if (lastContext !== from) { switchContext(from); }
+      return _byId(id, from);
+    },
+
+  contains = 'compareDocumentPosition' in root ?
+    function(container, element) {
+      return (container.compareDocumentPosition(element) & 16) == 16;
+    } : 'contains' in root ?
+    function(container, element) {
+      return element.nodeType == 1 && container.contains(element);
+    } :
+    function(container, element) {
+      while ((element = element.parentNode) && element.nodeType == 1) {
+        if (element === container) return true;
+      }
+      return false;
+    },
+
+  getAttribute =
+    function(node, attribute) {
+      attribute = attribute.toLowerCase();
+      if (typeof node[attribute] == 'object') {
+        return node.attributes[attribute] &&
+          node.attributes[attribute].value || '';
+      }
+      return (
+        attribute == 'type' ? node.getAttribute(attribute) || '' :
+        ATTR_URIDATA[attribute] ? node.getAttribute(attribute, 2) || '' :
+        ATTR_BOOLEAN[attribute] ? node.getAttribute(attribute) ? attribute : 'false' :
+          ((node = node.getAttributeNode(attribute)) && node.value) || '');
+    },
+
+  hasAttribute = root.hasAttribute ?
+    function(node, attribute) {
+      return node.hasAttribute(attribute);
+    } :
+    function(node, attribute) {
+      attribute = attribute.toLowerCase();
+      if (ATTR_DEFAULT[attribute]) {
+        return !!node[ATTR_DEFAULT[attribute]];
+      }
+      node = node.getAttributeNode(attribute);
+      return !!(node && node.specified);
+    },
+
+  isLink =
+    function(element) {
+      return element.getAttribute('href') && LINK_NODES[element.nodeName];
+    },
+
+  isEmpty =
+    function(node) {
+      node = node.firstChild;
+      while (node) {
+        if (node.nodeType == 3 || node.nodeName > '@') return false;
+        node = node.nextSibling;
+      }
+      return true;
+    },
+
+  nthElement =
+    function(element, last) {
+      var count = 1, succ = last ? 'nextSibling' : 'previousSibling';
+      while ((element = element[succ])) {
+        if (element.nodeName > '@') ++count;
+      }
+      return count;
+    },
+
+  nthOfType =
+    function(element, last) {
+      var count = 1, succ = last ? 'nextSibling' : 'previousSibling', type = element.nodeName;
+      while ((element = element[succ])) {
+        if (element.nodeName == type) ++count;
+      }
+      return count;
+    },
+
+  configure =
+    function(option) {
+      if (typeof option == 'string') { return Config[option]; }
+      if (typeof option != 'object') { return false; }
+      for (var i in option) {
+        Config[i] = !!option[i];
+        if (i == 'SIMPLENOT') {
+          matchContexts = { };
+          matchResolvers = { };
+          selectContexts = { };
+          selectResolvers = { };
+        }
+      }
+      reValidator = RegExp(Config.SIMPLENOT ?
+        standardValidator : extendedValidator, 'g');
+      return true;
+    },
+
+  emit =
+    function(message) {
+      if (Config.VERBOSITY) { throw Error(message); }
+      if (global.console && global.console.log) {
+        global.console.log(message);
+      }
+    },
+
+  Config = {
+    CACHING: false,
+    SIMPLENOT: true,
+    UNIQUE_ID: true,
+    USE_HTML5: true,
+    VERBOSITY: true
+  },
+
+  IE_LT_9 = typeof doc.addEventListener != 'function',
+
+  INSENSITIVE_MAP = {
+    href: 1, lang: 1, src: 1, style: 1, title: 1,
+    type: 1, xmlns: 1, 'xml:lang': 1, 'xml:space': 1
+  },
+
+  TO_UPPER_CASE = IE_LT_9 ? '.toUpperCase()' : '',
+
+  ACCEPT_NODE = 'r[r.length]=c[k];if(f&&false===f(c[k]))break main;else continue main;',
+  REJECT_NODE = IE_LT_9 ? 'if(e.nodeName<"A")continue;' : '',
+
+  compile =
+    function(selector, source, mode) {
+
+      var parts = typeof selector == 'string' ? selector.match(reSplitGroup) : selector;
+
+      typeof source == 'string' || (source = '');
+
+      if (parts.length == 1) {
+        source += compileSelector(parts[0], mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode);
+      } else {
+        var i = -1, seen = { }, token;
+        while ((token = parts[++i])) {
+          token = token.replace(reTrimSpaces, '');
+          if (!seen[token] && (seen[token] = true)) {
+            source += compileSelector(token, mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode);
+          }
+        }
+      }
+
+      if (mode) {
+        return Function('c,s,r,d,h,g,f,v',
+          'var N,n,x=0,k=-1,e;main:while((e=c[++k])){' + source + '}return r;');
+      } else {
+        return Function('e,s,r,d,h,g,f,v',
+          'var N,n,x=0,k=e;' + source + 'return false;');
+      }
+    },
+
+  FILTER =
+    'var z=v[@]||(v[@]=[]),l=z.length-1;' +
+    'while(l>=0&&z[l]!==e)--l;' +
+    'if(l!==-1){break;}' +
+    'z[z.length]=e;',
+
+  compileSelector =
+    function(selector, source, mode) {
+
+      var k = 0, expr, match, name, result, status, test, type;
+
+      while (selector) {
+
+        k++;
+
+        if ((match = selector.match(Patterns.universal))) {
+          expr = '';
+        }
+
+        else if ((match = selector.match(Patterns.id))) {
+          source = 'if(' + (XML_DOCUMENT ?
+            's.getAttribute(e,"id")' :
+            '(e.submit?s.getAttribute(e,"id"):e.id)') +
+            '=="' + match[1] + '"' +
+            '){' + source + '}';
+        }
+
+        else if ((match = selector.match(Patterns.tagName))) {
+          source = 'if(e.nodeName' + (XML_DOCUMENT ?
+            '=="' + match[1] + '"' : TO_UPPER_CASE +
+            '=="' + match[1].toUpperCase() + '"') +
+            '){' + source + '}';
+        }
+
+        else if ((match = selector.match(Patterns.className))) {
+          source = 'if((n=' + (XML_DOCUMENT ?
+            'e.getAttribute("class")' : 'e.className') +
+            ')&&n.length&&(" "+' + (QUIRKS_MODE ? 'n.toLowerCase()' : 'n') +
+            '.replace(/\\s+/g," ")+" ").indexOf(" ' +
+            (QUIRKS_MODE ? match[1].toLowerCase() : match[1]) + ' ")>-1' +
+            '){' + source + '}';
+        }
+
+        else if ((match = selector.match(Patterns.attribute))) {
+          if (match[2] && !Operators[match[2]]) {
+            emit('Unsupported operator in attribute selectors "' + selector + '"');
+            return '';
+          }
+          test = 'false';
+          if (match[4]) {
+            type = INSENSITIVE_MAP[match[1].toLowerCase()];
+            match[4] =
+              (type ? match[4].toLowerCase() : match[4])
+              .replace(/\\([0-9a-f]{2,2})/g, '\\x$1')
+              .replace(/(\x22|\x27)/g, '\\$1');
+          }
+          if (match[2] && match[4] && (test = Operators[match[2]])) {
+            test = test.replace(/\%m/g, match[4]);
+          } else if (match[2] == '!=' || match[2] == '=') {
+            test = 'n' + match[2] + '="' + match[4] + '"';
+          }
+          expr = 'n=s.' + (match[2] ? 'get' : 'has') + 'Attribute(e,"' + match[1] + '")' + (type ? '.toLowerCase();' : ';');
+          source = expr + 'if(' + (match[2] ? test : 'n') + '){' + source + '}';
+        }
+
+        else if ((match = selector.match(Patterns.adjacent))) {
+          source = (mode ? '' : FILTER.replace(/@/g, k)) + source;
+          source = 'var N' + k + '=e;while(e&&(e=e.previousSibling)){if(e.nodeName>"@"){' + source + 'break;}}e=N' + k + ';';
+        }
+
+        else if ((match = selector.match(Patterns.relative))) {
+          source = (mode ? '' : FILTER.replace(/@/g, k)) + source;
+          source = 'var N' + k + '=e;e=e.parentNode.firstChild;while(e&&e!==N' + k + '){if(e.nodeName>"@"){' + source + '}e=e.nextSibling;}e=N' + k + ';';
+        }
+
+        else if ((match = selector.match(Patterns.children))) {
+          source = (mode ? '' : FILTER.replace(/@/g, k)) + source;
+          source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + 'break;}e=N' + k + ';';
+        }
+
+        else if ((match = selector.match(Patterns.ancestor))) {
+          source = (mode ? '' : FILTER.replace(/@/g, k)) + source;
+          source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + '}e=N' + k + ';';
+        }
+
+        else if ((match = selector.match(Patterns.spseudos)) && match[1]) {
+          switch (match[1]) {
+            case 'root':
+              if (match[3]) {
+                source = 'if(e===h||s.contains(h,e)){' + source + '}';
+              } else {
+                source = 'if(e===h){' + source + '}';
+              }
+              break;
+            case 'empty':
+              source = 'if(s.isEmpty(e)){' + source + '}';
+              break;
+            default:
+              if (match[1] && match[2]) {
+                if (match[2] == 'n') {
+                  source = 'if(e!==h){' + source + '}';
+                  break;
+                } else if (match[2] == 'even') {
+                  a = 2;
+                  b = 0;
+                } else if (match[2] == 'odd') {
+                  a = 2;
+                  b = 1;
+                } else {
+                  b = ((n = match[2].match(/(-?\d+)$/)) ? parseInt(n[1], 10) : 0);
+                  a = ((n = match[2].match(/(-?\d*)n/i)) ? parseInt(n[1], 10) : 0);
+                  if (n && n[1] == '-') a = -1;
+                }
+                test = a > 1 ?
+                  (/last/i.test(match[1])) ? '(n-(' + b + '))%' + a + '==0' :
+                  'n>=' + b + '&&(n-(' + b + '))%' + a + '==0' : a < -1 ?
+                  (/last/i.test(match[1])) ? '(n-(' + b + '))%' + a + '==0' :
+                  'n<=' + b + '&&(n-(' + b + '))%' + a + '==0' : a=== 0 ?
+                  'n==' + b :
+                  (/last/i.test(match[1])) ?
+                    a == -1 ? 'n>=' + b : 'n<=' + b :
+                    a == -1 ? 'n<=' + b : 'n>=' + b;
+                source =
+                  'if(e!==h){' +
+                    'n=s[' + (/-of-type/i.test(match[1]) ? '"nthOfType"' : '"nthElement"') + ']' +
+                      '(e,' + (/last/i.test(match[1]) ? 'true' : 'false') + ');' +
+                    'if(' + test + '){' + source + '}' +
+                  '}';
+              } else {
+                a = /first/i.test(match[1]) ? 'previous' : 'next';
+                n = /only/i.test(match[1]) ? 'previous' : 'next';
+                b = /first|last/i.test(match[1]);
+                type = /-of-type/i.test(match[1]) ? '&&n.nodeName!=e.nodeName' : '&&n.nodeName<"@"';
+                source = 'if(e!==h){' +
+                  ( 'n=e;while((n=n.' + a + 'Sibling)' + type + ');if(!n){' + (b ? source :
+                    'n=e;while((n=n.' + n + 'Sibling)' + type + ');if(!n){' + source + '}') + '}' ) + '}';
+              }
+              break;
+          }
+        }
+
+        else if ((match = selector.match(Patterns.dpseudos)) && match[1]) {
+          switch (match[1].match(/^\w+/)[0]) {
+            case 'not':
+              expr = match[3].replace(reTrimSpaces, '');
+              if (Config.SIMPLENOT && !reSimpleNot.test(expr)) {
+                emit('Negation pseudo-class only accepts simple selectors "' + match.join('') + '"');
+                return '';
+              } else {
+                if ('compatMode' in doc) {
+                  source = 'if(!' + compile(expr, '', false) + '(e,s,r,d,h,g)){' + source + '}';
+                } else {
+                  source = 'if(!s.match(e, "' + expr.replace(/\x22/g, '\\"') + '",g)){' + source +'}';
+                }
+              }
+              break;
+            case 'checked':
+              source = 'if((typeof e.form!=="undefined"&&(/^(?:radio|checkbox)$/i).test(e.type)&&e.checked)' +
+                (Config.USE_HTML5 ? '||(/^option$/i.test(e.nodeName)&&(e.selected||e.checked))' : '') +
+                '){' + source + '}';
+              break;
+            case 'disabled':
+              source = 'if(((typeof e.form!=="undefined"' +
+                (Config.USE_HTML5 ? '' : '&&!(/^hidden$/i).test(e.type)') +
+                ')||s.isLink(e))&&e.disabled===true){' + source + '}';
+              break;
+            case 'enabled':
+              source = 'if(((typeof e.form!=="undefined"' +
+                (Config.USE_HTML5 ? '' : '&&!(/^hidden$/i).test(e.type)') +
+                ')||s.isLink(e))&&e.disabled===false){' + source + '}';
+              break;
+            case 'lang':
+              test = '';
+              if (match[2]) test = match[2].substr(0, 2) + '-';
+              source = 'do{(n=e.lang||"").toLowerCase();' +
+                'if((n==""&&h.lang=="' + match[2].toLowerCase() + '")||' +
+                '(n&&(n=="' + match[2].toLowerCase() +
+                '"||n.substr(0,3)=="' + test.toLowerCase() + '")))' +
+                '{' + source + 'break;}}while((e=e.parentNode)&&e!==g);';
+              break;
+            case 'target':
+              n = doc.location ? doc.location.hash : '';
+              if (n) {
+                source = 'if(e.id=="' + n.slice(1) + '"){' + source + '}';
+              }
+              break;
+            case 'link':
+              source = 'if(s.isLink(e)&&!e.visited){' + source + '}';
+              break;
+            case 'visited':
+              source = 'if(s.isLink(e)&&e.visited){' + source + '}';
+              break;
+            case 'active':
+              source = 'if(e===d.activeElement){' + source + '}';
+              break;
+            case 'hover':
+              source = 'if(e===d.hoverElement){' + source + '}';
+              break;
+            case 'focus':
+              source = 'hasFocus' in doc ?
+                'if(e===d.activeElement&&d.hasFocus()&&(e.type||e.href||!isNaN(e.tabIndex))){' + source + '}' :
+                'if(e===d.activeElement&&(e.type||e.href)){' + source + '}';
+              break;
+            case 'selected':
+              source = 'if(/^option$/i.test(e.nodeName)&&(e.selected||e.checked)){' + source + '}';
+              break;
+            default:
+              break;
+          }
+        }
+
+        else {
+
+          expr = false;
+          status = false;
+          for (expr in Selectors) {
+            if ((match = selector.match(Selectors[expr].Expression)) && match[1]) {
+              result = Selectors[expr].Callback(match, source);
+              source = result.source;
+              status = result.status;
+              if (status) { break; }
+            }
+          }
+
+          if (!status) {
+            emit('Unknown pseudo-class selector "' + selector + '"');
+            return '';
+          }
+
+          if (!expr) {
+            emit('Unknown token in selector "' + selector + '"');
+            return '';
+          }
+
+        }
+
+        if (!match) {
+          emit('Invalid syntax in selector "' + selector + '"');
+          return '';
+        }
+
+        selector = match && match[match.length - 1];
+      }
+
+      return source;
+    },
+
+  match =
+    function(element, selector, from, callback) {
+
+      var parts;
+
+      if (!(element && element.nodeName > '@')) {
+        emit('Invalid element argument');
+        return false;
+      } else if (typeof selector != 'string') {
+        emit('Invalid selector argument');
+        return false;
+      } else if (lastContext !== from) {
+        switchContext(from || (from = element.ownerDocument));
+      }
+
+      selector = selector.replace(reTrimSpaces, '');
+
+      Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, element, from));
+
+      if (lastMatcher != selector) {
+        if ((parts = selector.match(reValidator)) && parts[0] == selector) {
+          isSingleMatch = (parts = selector.match(reSplitGroup)).length < 2;
+          lastMatcher = selector;
+          lastPartsMatch = parts;
+        } else {
+          emit('The string "' + selector + '", is not a valid CSS selector');
+          return false;
+        }
+      } else parts = lastPartsMatch;
+
+      if (!matchResolvers[selector] || matchContexts[selector] !== from) {
+        matchResolvers[selector] = compile(isSingleMatch ? [selector] : parts, '', false);
+        matchContexts[selector] = from;
+      }
+
+      return matchResolvers[selector](element, Snapshot, [ ], doc, root, from, callback, { });
+    },
+
+  first =
+    function(selector, from) {
+      return select(selector, from, function() { return false; })[0] || null;
+    },
+
+  select =
+    function(selector, from, callback) {
+
+      var i, changed, element, elements, parts, token, original = selector;
+
+      if (arguments.length === 0) {
+        emit('Not enough arguments');
+        return [ ];
+      } else if (typeof selector != 'string') {
+        return [ ];
+      } else if (from && !(/1|9|11/).test(from.nodeType)) {
+        emit('Invalid or illegal context element');
+        return [ ];
+      } else if (lastContext !== from) {
+        switchContext(from || (from = doc));
+      }
+
+      if (Config.CACHING && (elements = Dom.loadResults(original, from, doc, root))) {
+        return callback ? concatCall([ ], elements, callback) : elements;
+      }
+
+      selector = selector.replace(reTrimSpaces, '');
+
+      Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, from));
+
+      if ((changed = lastSelector != selector)) {
+        if ((parts = selector.match(reValidator)) && parts[0] == selector) {
+          isSingleSelect = (parts = selector.match(reSplitGroup)).length < 2;
+          lastSelector = selector;
+          lastPartsSelect = parts;
+        } else {
+          emit('The string "' + selector + '", is not a valid CSS selector');
+          return [ ];
+        }
+      } else parts = lastPartsSelect;
+
+      if (from.nodeType == 11) {
+
+        elements = from.childNodes;
+
+      } else if (isSingleSelect) {
+
+        if (changed) {
+          parts = selector.match(reSplitToken);
+          token = parts[parts.length - 1];
+          lastSlice = token.split(':not')[0];
+          lastPosition = selector.length - token.length;
+        }
+
+        if (Config.UNIQUE_ID && (parts = lastSlice.match(Optimize.ID)) && (token = parts[1])) {
+          if ((element = _byId(token, from))) {
+            if (match(element, selector)) {
+              callback && callback(element);
+              elements = [ element ];
+            } else elements = [ ];
+          }
+        }
+
+        else if (Config.UNIQUE_ID && (parts = selector.match(Optimize.ID)) && (token = parts[1])) {
+          if ((element = _byId(token, doc))) {
+            if ('#' + token == selector) {
+              callback && callback(element);
+              elements = [ element ];
+            } else if (/[>+~]/.test(selector)) {
+              from = element.parentNode;
+            } else {
+              from = element;
+            }
+          } else elements = [ ];
+        }
+
+        if (elements) {
+          Config.CACHING && Dom.saveResults(original, from, doc, elements);
+          return elements;
+        }
+
+        if (!XML_DOCUMENT && GEBTN && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) {
+          if ((elements = from.getElementsByTagName(token)).length === 0) { return [ ]; }
+          selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*');
+        }
+
+        else if (!XML_DOCUMENT && GEBCN && (parts = lastSlice.match(Optimize.CLASS)) && (token = parts[1])) {
+          if ((elements = from.getElementsByClassName(token.replace(/\\([^\\]{1})/g, '$1'))).length === 0) { return [ ]; }
+            selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token,
+              reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1)) ? '' : '*');
+        }
+
+      }
+
+      if (!elements) {
+        if (IE_LT_9) {
+          elements = /^(?:applet|object)$/i.test(from.nodeName) ?
+            from.childNodes : from.all;
+        } else {
+          elements = from.getElementsByTagName('*');
+        }
+      }
+
+      if (!selectResolvers[selector] || selectContexts[selector] !== from) {
+        selectResolvers[selector] = compile(isSingleSelect ? [selector] : parts, REJECT_NODE, true);
+        selectContexts[selector] = from;
+      }
+
+      elements = selectResolvers[selector](elements, Snapshot, [ ], doc, root, from, callback, { });
+
+      Config.CACHING && Dom.saveResults(original, from, doc, elements);
+
+      return elements;
+    },
+
+  FN = function(x) { return x; },
+
+  matchContexts = { },
+  matchResolvers = { },
+
+  selectContexts = { },
+  selectResolvers = { },
+
+  Snapshot = {
+    byId: _byId,
+    match: match,
+    select: select,
+    isLink: isLink,
+    isEmpty: isEmpty,
+    contains: contains,
+    nthOfType: nthOfType,
+    nthElement: nthElement,
+    getAttribute: getAttribute,
+    hasAttribute: hasAttribute
+  };
+
+  Dom.ACCEPT_NODE = ACCEPT_NODE;
+
+  Dom.byId = byId;
+  Dom.match = match;
+  Dom.first = first;
+  Dom.select = select;
+  Dom.compile = compile;
+  Dom.contains = contains;
+  Dom.configure = configure;
+  Dom.getAttribute = getAttribute;
+  Dom.hasAttribute = hasAttribute;
+
+  Dom.setCache = FN;
+  Dom.shortcuts = FN;
+  Dom.loadResults = FN;
+  Dom.saveResults = FN;
+
+  Dom.emit = emit;
+  Dom.Config = Config;
+  Dom.Snapshot = Snapshot;
+
+  Dom.Operators = Operators;
+  Dom.Selectors = Selectors;
+
+  Dom.registerOperator =
+    function(symbol, resolver) {
+      Operators[symbol] || (Operators[symbol] = resolver);
+    };
+
+  Dom.registerSelector =
+    function(name, rexp, func) {
+      Selectors[name] || (Selectors[name] = {
+        Expression: rexp,
+        Callback: func
+      });
+    };
+
+  switchContext(doc, true);
+
+});
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/nwmatcher.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/nwmatcher.js
new file mode 100644
index 0000000..d73ed51
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/nwmatcher/src/nwmatcher.js
@@ -0,0 +1,1658 @@
+/*
+ * Copyright (C) 2007-2013 Diego Perini
+ * All rights reserved.
+ *
+ * nwmatcher.js - A fast CSS selector engine and matcher
+ *
+ * Author: Diego Perini <diego.perini at gmail com>
+ * Version: 1.3.1
+ * Created: 20070722
+ * Release: 20130211
+ *
+ * License:
+ *  http://javascript.nwbox.com/NWMatcher/MIT-LICENSE
+ * Download:
+ *  http://javascript.nwbox.com/NWMatcher/nwmatcher.js
+ */
+
+(function(global, factory) {
+
+  if (typeof module == 'object' && typeof exports == 'object') {
+    // in a Node.js environment, the nwmatcher functions will operate on
+    // the passed "browserGlobal" and will be returned in an object
+    module.exports = function (browserGlobal) {
+      var exports = { };
+      factory(browserGlobal, exports);
+      return exports;
+    };
+  } else {
+    // in a browser environment, the nwmatcher functions will operate on
+    // the "global" loading them and be attached to "global.NW.Dom"
+    if (!global.NW) {
+      global.NW = { };
+    }
+    if (!global.NW.Dom) {
+      global.NW.Dom = { };
+    }
+    factory(global, global.NW.Dom);
+  }
+
+})(this, function(global, exports) {
+
+  var version = 'nwmatcher-1.3.1',
+
+  Dom = exports,
+
+  // processing context & root element
+  doc = global.document,
+  root = doc.documentElement,
+
+  // save utility methods references
+  slice = [ ].slice,
+  string = { }.toString,
+
+  // persist previous parsed data
+  isSingleMatch,
+  isSingleSelect,
+
+  lastSlice,
+  lastContext,
+  lastPosition,
+
+  lastMatcher,
+  lastSelector,
+
+  lastPartsMatch,
+  lastPartsSelect,
+
+  // accepted prefix identifiers
+  // (id, class & pseudo-class)
+  prefixes = '[#.:]?',
+
+  // accepted attribute operators
+  operators = '([~*^$|!]?={1})',
+
+  // accepted whitespace characters
+  whitespace = '[\\x20\\t\\n\\r\\f]*',
+
+  // 4 combinators F E, F>E, F+E, F~E
+  combinators = '[\\x20]|[>+~][^>+~]',
+
+  // an+b format params for pseudo-classes
+  pseudoparms = '(?:[-+]?\\d*n)?[-+]?\\d*',
+
+  // CSS quoted string values
+  quotedvalue = '"[^"]*"' + "|'[^']*'",
+
+  // skip round brackets groups
+  skipround = '\\([^()]+\\)|\\(.*\\)',
+  // skip curly brackets groups
+  skipcurly = '\\{[^{}]+\\}|\\{.*\\}',
+  // skip square brackets groups
+  skipsquare = '\\[[^[\\]]*\\]|\\[.*\\]',
+
+  // skip [ ], ( ), { } brackets groups
+  skipgroup = '\\[.*\\]|\\(.*\\)|\\{.*\\}',
+
+  // http://www.w3.org/TR/css3-syntax/#characters
+  // unicode/ISO 10646 characters 161 and higher
+  // NOTE: Safari 2.0.x crashes with escaped (\\)
+  // Unicode ranges in regular expressions so we
+  // use a negated character range class instead
+  encoding = '(?:[-\\w]|[^\\x00-\\xa0]|\\\\.)',
+
+  // CSS identifier syntax
+  identifier = '(?:-?[_a-zA-Z]{1}[-\\w]*|[^\\x00-\\xa0]+|\\\\.+)+',
+
+  // build attribute string
+  attrcheck = '(' + quotedvalue + '|' + identifier + ')',
+  attributes = whitespace + '(' + encoding + '*:?' + encoding + '+)' +
+    whitespace + '(?:' + operators + whitespace + attrcheck + ')?' + whitespace,
+  attrmatcher = attributes.replace(attrcheck, '([\\x22\\x27]*)((?:\\\\?.)*?)\\3'),
+
+  // build pseudoclass string
+  pseudoclass = '((?:' +
+    // an+b parameters or quoted string
+    pseudoparms + '|' + quotedvalue + '|' +
+    // id, class, pseudo-class selector
+    prefixes + '|' + encoding + '+|' +
+    // nested HTML attribute selector
+    '\\[' + attributes + '\\]|' +
+    // nested pseudo-class selector
+    '\\(.+\\)|' + whitespace + '|' +
+    // nested pseudos/separators
+    ',)+)',
+
+  // placeholder for extensions
+  extensions = '.+',
+
+  // CSS3: syntax scanner and
+  // one pass validation only
+  // using regular expression
+  standardValidator =
+    // discard start
+    '(?=[\\x20\\t\\n\\r\\f]*[^>+~(){}<>])' +
+    // open match group
+    '(' +
+    //universal selector
+    '\\*' +
+    // id/class/tag/pseudo-class identifier
+    '|(?:' + prefixes + identifier + ')' +
+    // combinator selector
+    '|' + combinators +
+    // HTML attribute selector
+    '|\\[' + attributes + '\\]' +
+    // pseudo-classes parameters
+    '|\\(' + pseudoclass + '\\)' +
+    // dom properties selector (extension)
+    '|\\{' + extensions + '\\}' +
+    // selector group separator (comma)
+    '|(?:,|' + whitespace + ')' +
+    // close match group
+    ')+',
+
+  // validator for complex selectors in ':not()' pseudo-classes
+  extendedValidator = standardValidator.replace(pseudoclass, '.*'),
+
+  // validator for standard selectors as default
+  reValidator = new RegExp(standardValidator, 'g'),
+
+  // whitespace is any combination of these 5 character [\x20\t\n\r\f]
+  // http://www.w3.org/TR/css3-selectors/#selector-syntax
+  reTrimSpaces = new RegExp('^' +
+    whitespace + '|' + whitespace + '$', 'g'),
+
+  // only allow simple selectors nested in ':not()' pseudo-classes
+  reSimpleNot = new RegExp('^(' +
+    '(?!:not)' +
+    '(' + prefixes +
+    '|' + identifier +
+    '|\\([^()]*\\))+' +
+    '|\\[' + attributes + '\\]' +
+    ')$'),
+
+  // split comma groups, exclude commas from
+  // quotes '' "" and from brackets () [] {}
+  reSplitGroup = new RegExp('(' +
+    '[^,\\\\()[\\]]+' +
+    '|' + skipsquare +
+    '|' + skipround +
+    '|' + skipcurly +
+    '|\\\\.' +
+    ')+', 'g'),
+
+  // split last, right most, selector group token
+  reSplitToken = new RegExp('(' +
+    '\\[' + attributes + '\\]|' +
+    '\\(' + pseudoclass + '\\)|' +
+    '\\\\.|[^\\x20\\t\\r\\n\\f>+~])+', 'g'),
+
+  // for in excess whitespace removal
+  reWhiteSpace = /[\x20\t\n\r\f]+/g,
+
+  reOptimizeSelector = new RegExp(identifier + '|^$'),
+
+  /*----------------------------- FEATURE TESTING ----------------------------*/
+
+  // detect native methods
+  isNative = (function() {
+    var s = (doc.appendChild + '').replace(/appendChild/g, '');
+    return function(object, method) {
+      var m = object && object[method] || false;
+      return m && typeof m != 'string' &&
+        s == (m + '').replace(new RegExp(method, 'g'), '');
+    };
+  })(),
+
+  // NATIVE_XXXXX true if method exist and is callable
+  // detect if DOM methods are native in browsers
+  NATIVE_FOCUS = isNative(doc, 'hasFocus'),
+  NATIVE_QSAPI = isNative(doc, 'querySelector'),
+  NATIVE_GEBID = isNative(doc, 'getElementById'),
+  NATIVE_GEBTN = isNative(root, 'getElementsByTagName'),
+  NATIVE_GEBCN = isNative(root, 'getElementsByClassName'),
+
+  // detect native getAttribute/hasAttribute methods,
+  // frameworks extend these to elements, but it seems
+  // this does not work for XML namespaced attributes,
+  // used to check both getAttribute/hasAttribute in IE
+  NATIVE_GET_ATTRIBUTE = isNative(root, 'getAttribute'),
+  NATIVE_HAS_ATTRIBUTE = isNative(root, 'hasAttribute'),
+
+  // check if slice() can convert nodelist to array
+  // see http://yura.thinkweb2.com/cft/
+  NATIVE_SLICE_PROTO =
+    (function() {
+      var isBuggy = false, id = root.id;
+      root.id = 'length';
+      try {
+        isBuggy = !!slice.call(doc.childNodes, 0)[0];
+      } catch(e) { }
+      root.id = id;
+      return isBuggy;
+    })(),
+
+  // supports the new traversal API
+  NATIVE_TRAVERSAL_API =
+    'nextElementSibling' in root && 'previousElementSibling' in root,
+
+  // BUGGY_XXXXX true if method is feature tested and has known bugs
+  // detect buggy gEBID
+  BUGGY_GEBID = NATIVE_GEBID ?
+    (function() {
+      var isBuggy = true, x = 'x' + String(+new Date),
+        a = doc.createElementNS ? 'a' : '<a name="' + x + '">';
+      (a = doc.createElement(a)).name = x;
+      root.insertBefore(a, root.firstChild);
+      isBuggy = !!doc.getElementById(x);
+      root.removeChild(a);
+      return isBuggy;
+    })() :
+    true,
+
+  // detect IE gEBTN comment nodes bug
+  BUGGY_GEBTN = NATIVE_GEBTN ?
+    (function() {
+      var div = doc.createElement('div');
+      div.appendChild(doc.createComment(''));
+      return !!div.getElementsByTagName('*')[0];
+    })() :
+    true,
+
+  // detect Opera gEBCN second class and/or UTF8 bugs as well as Safari 3.2
+  // caching class name results and not detecting when changed,
+  // tests are based on the jQuery selector test suite
+  BUGGY_GEBCN = NATIVE_GEBCN ?
+    (function() {
+      var isBuggy, div = doc.createElement('div'), test = '\u53f0\u5317';
+
+      // Opera tests
+      div.appendChild(doc.createElement('span')).
+        setAttribute('class', test + 'abc ' + test);
+      div.appendChild(doc.createElement('span')).
+        setAttribute('class', 'x');
+
+      isBuggy = !div.getElementsByClassName(test)[0];
+
+      // Safari test
+      div.lastChild.className = test;
+      return isBuggy || div.getElementsByClassName(test).length != 2;
+    })() :
+    true,
+
+  // detect IE bug with dynamic attributes
+  BUGGY_GET_ATTRIBUTE = NATIVE_GET_ATTRIBUTE ?
+    (function() {
+      var input = doc.createElement('input');
+      input.setAttribute('value', 5);
+      return input.defaultValue != 5;
+    })() :
+    true,
+
+  // detect IE bug with non-standard boolean attributes
+  BUGGY_HAS_ATTRIBUTE = NATIVE_HAS_ATTRIBUTE ?
+    (function() {
+      var option = doc.createElement('option');
+      option.setAttribute('selected', 'selected');
+      return !option.hasAttribute('selected');
+    })() :
+    true,
+
+  // detect Safari bug with selected option elements
+  BUGGY_SELECTED =
+    (function() {
+      var select = doc.createElement('select');
+      select.appendChild(doc.createElement('option'));
+      return !select.firstChild.selected;
+    })(),
+
+  // initialized with the loading context
+  // and reset for each different context
+  BUGGY_QUIRKS_GEBCN,
+  BUGGY_QUIRKS_QSAPI,
+
+  QUIRKS_MODE,
+  XML_DOCUMENT,
+
+  // detect Opera browser
+  OPERA = /opera/i.test(string.call(global.opera)),
+
+  // skip simpe selector optimizations for Opera >= 11
+  OPERA_QSAPI = OPERA && parseFloat(opera.version()) >= 11,
+
+  // check Seletor API implementations
+  RE_BUGGY_QSAPI = NATIVE_QSAPI ?
+    (function() {
+      var pattern = [ ], div = doc.createElement('div'), element,
+
+      expect = function(selector, context, element, n) {
+        var result = false;
+        context.appendChild(element);
+        try { result = context.querySelectorAll(selector).length == n; } catch(e) { }
+        while (context.firstChild) { context.removeChild(context.firstChild); }
+        return result;
+      };
+
+      // ^= $= *= operators bugs whith empty values (Opera 10 / IE8)
+      element = doc.createElement('p');
+      element.setAttribute('class', '');
+      expect('[class^=""]', div, element, 1) &&
+        pattern.push('[*^$]=[\\x20\\t\\n\\r\\f]*(?:""|' + "'')");
+
+      // :checked bug with option elements (Firefox 3.6.x)
+      // it wrongly includes 'selected' options elements
+      // HTML5 rules says selected options also match
+      element = doc.createElement('option');
+      element.setAttribute('selected', 'selected');
+      expect(':checked', div, element, 0) &&
+        pattern.push(':checked');
+
+      // :enabled :disabled bugs with hidden fields (Firefox 3.5)
+      // http://www.w3.org/TR/html5/links.html#selector-enabled
+      // http://www.w3.org/TR/css3-selectors/#enableddisabled
+      // not supported by IE8 Query Selector
+      element = doc.createElement('input');
+      element.setAttribute('type', 'hidden');
+      expect(':enabled', div, element, 0) &&
+        pattern.push(':enabled', ':disabled');
+
+      // :link bugs with hyperlinks matching (Firefox/Safari)
+      element = doc.createElement('link');
+      element.setAttribute('href', 'x');
+      expect(':link', div, element, 1) ||
+        pattern.push(':link');
+
+      // avoid attribute selectors for IE QSA
+      if (BUGGY_HAS_ATTRIBUTE) {
+        // IE fails in reading:
+        // - original values for input/textarea
+        // - original boolean values for controls
+        pattern.push('\\[[\\x20\\t\\n\\r\\f]*(?:checked|disabled|ismap|multiple|readonly|selected|value)');
+      }
+
+      return pattern.length ?
+        new RegExp(pattern.join('|')) :
+        { 'test': function() { return false; } };
+
+    })() :
+    true,
+
+  // matches class selectors
+  RE_CLASS = new RegExp('(?:\\[[\\x20\\t\\n\\r\\f]*class\\b|\\.' + identifier + ')'),
+
+  // matches simple id, tag & class selectors
+  RE_SIMPLE_SELECTOR = new RegExp(
+    !(BUGGY_GEBTN && BUGGY_GEBCN) ? !OPERA ?
+      '^(?:\\*|[.#]?-?[_a-zA-Z]{1}' + encoding + '*)$' :
+      '^(?:\\*|#-?[_a-zA-Z]{1}' + encoding + '*)$' :
+      '^#?-?[_a-zA-Z]{1}' + encoding + '*$'),
+
+  /*----------------------------- LOOKUP OBJECTS -----------------------------*/
+
+  LINK_NODES = { 'a': 1, 'A': 1, 'area': 1, 'AREA': 1, 'link': 1, 'LINK': 1 },
+
+  // boolean attributes should return attribute name instead of true/false
+  ATTR_BOOLEAN = {
+    'checked': 1, 'disabled': 1, 'ismap': 1,
+    'multiple': 1, 'readonly': 1, 'selected': 1
+  },
+
+  // dynamic attributes that needs to be checked against original HTML value
+  ATTR_DEFAULT = {
+    'value': 'defaultValue',
+    'checked': 'defaultChecked',
+    'selected': 'defaultSelected'
+  },
+
+  // attributes referencing URI data values need special treatment in IE
+  ATTR_URIDATA = {
+    'action': 2, 'cite': 2, 'codebase': 2, 'data': 2, 'href': 2,
+    'longdesc': 2, 'lowsrc': 2, 'src': 2, 'usemap': 2
+  },
+
+  // HTML 5 draft specifications
+  // http://www.whatwg.org/specs/web-apps/current-work/#selectors
+  HTML_TABLE = {
+    // class attribute must be treated case-insensitive in HTML quirks mode
+    // initialized by default to Standard Mode (case-sensitive),
+    // set dynamically by the attribute resolver
+    'class': 0,
+    'accept': 1, 'accept-charset': 1, 'align': 1, 'alink': 1, 'axis': 1,
+    'bgcolor': 1, 'charset': 1, 'checked': 1, 'clear': 1, 'codetype': 1, 'color': 1,
+    'compact': 1, 'declare': 1, 'defer': 1, 'dir': 1, 'direction': 1, 'disabled': 1,
+    'enctype': 1, 'face': 1, 'frame': 1, 'hreflang': 1, 'http-equiv': 1, 'lang': 1,
+    'language': 1, 'link': 1, 'media': 1, 'method': 1, 'multiple': 1, 'nohref': 1,
+    'noresize': 1, 'noshade': 1, 'nowrap': 1, 'readonly': 1, 'rel': 1, 'rev': 1,
+    'rules': 1, 'scope': 1, 'scrolling': 1, 'selected': 1, 'shape': 1, 'target': 1,
+    'text': 1, 'type': 1, 'valign': 1, 'valuetype': 1, 'vlink': 1
+  },
+
+  // the following attributes must be treated case-insensitive in XHTML mode
+  // Niels Leenheer http://rakaz.nl/item/css_selector_bugs_case_sensitivity
+  XHTML_TABLE = {
+    'accept': 1, 'accept-charset': 1, 'alink': 1, 'axis': 1,
+    'bgcolor': 1, 'charset': 1, 'codetype': 1, 'color': 1,
+    'enctype': 1, 'face': 1, 'hreflang': 1, 'http-equiv': 1,
+    'lang': 1, 'language': 1, 'link': 1, 'media': 1, 'rel': 1,
+    'rev': 1, 'target': 1, 'text': 1, 'type': 1, 'vlink': 1
+  },
+
+  /*-------------------------- REGULAR EXPRESSIONS ---------------------------*/
+
+  // placeholder to add functionalities
+  Selectors = {
+    // as a simple example this will check
+    // for chars not in standard ascii table
+    //
+    // 'mySpecialSelector': {
+    //  'Expression': /\u0080-\uffff/,
+    //  'Callback': mySelectorCallback
+    // }
+    //
+    // 'mySelectorCallback' will be invoked
+    // only after passing all other standard
+    // checks and only if none of them worked
+  },
+
+  // attribute operators
+  Operators = {
+     '=': "n=='%m'",
+    '^=': "n.indexOf('%m')==0",
+    '*=': "n.indexOf('%m')>-1",
+    '|=': "(n+'-').indexOf('%m-')==0",
+    '~=': "(' '+n+' ').indexOf(' %m ')>-1",
+    '$=': "n.substr(n.length-'%m'.length)=='%m'"
+  },
+
+  // optimization expressions
+  Optimize = {
+    ID: new RegExp('^\\*?#(' + encoding + '+)|' + skipgroup),
+    TAG: new RegExp('^(' + encoding + '+)|' + skipgroup),
+    CLASS: new RegExp('^\\*?\\.(' + encoding + '+$)|' + skipgroup)
+  },
+
+  // precompiled Regular Expressions
+  Patterns = {
+    // structural pseudo-classes and child selectors
+    spseudos: /^\:(root|empty|(?:first|last|only)(?:-child|-of-type)|nth(?:-last)?(?:-child|-of-type)\(\s*(even|odd|(?:[-+]{0,1}\d*n\s*)?[-+]{0,1}\s*\d*)\s*\))?(.*)/i,
+    // uistates + dynamic + negation pseudo-classes
+    dpseudos: /^\:(link|visited|target|active|focus|hover|checked|disabled|enabled|selected|lang\(([-\w]{2,})\)|not\(([^()]*|.*)\))?(.*)/i,
+    // element attribute matcher
+    attribute: new RegExp('^\\[' + attrmatcher + '\\](.*)'),
+    // E > F
+    children: /^[\x20\t\n\r\f]*\>[\x20\t\n\r\f]*(.*)/,
+    // E + F
+    adjacent: /^[\x20\t\n\r\f]*\+[\x20\t\n\r\f]*(.*)/,
+    // E ~ F
+    relative: /^[\x20\t\n\r\f]*\~[\x20\t\n\r\f]*(.*)/,
+    // E F
+    ancestor: /^[\x20\t\n\r\f]+(.*)/,
+    // all
+    universal: /^\*(.*)/,
+    // id
+    id: new RegExp('^#(' + encoding + '+)(.*)'),
+    // tag
+    tagName: new RegExp('^(' + encoding + '+)(.*)'),
+    // class
+    className: new RegExp('^\\.(' + encoding + '+)(.*)')
+  },
+
+  /*------------------------------ UTIL METHODS ------------------------------*/
+
+  // concat elements to data
+  concatList =
+    function(data, elements) {
+      var i = -1, element;
+      if (!data.length && Array.slice)
+        return Array.slice(elements);
+      while ((element = elements[++i]))
+        data[data.length] = element;
+      return data;
+    },
+
+  // concat elements to data and callback
+  concatCall =
+    function(data, elements, callback) {
+      var i = -1, element;
+      while ((element = elements[++i])) {
+        if (false === callback(data[data.length] = element)) { break; }
+      }
+      return data;
+    },
+
+  // change context specific variables
+  switchContext =
+    function(from, force) {
+      var div, oldDoc = doc;
+      // save passed context
+      lastContext = from;
+      // set new context document
+      doc = from.ownerDocument || from;
+      if (force || oldDoc !== doc) {
+        // set document root
+        root = doc.documentElement;
+        // set host environment flags
+        XML_DOCUMENT = doc.createElement('DiV').nodeName == 'DiV';
+
+        // In quirks mode css class names are case insensitive.
+        // In standards mode they are case sensitive. See docs:
+        // https://developer.mozilla.org/en/Mozilla_Quirks_Mode_Behavior
+        // http://www.whatwg.org/specs/web-apps/current-work/#selectors
+        QUIRKS_MODE = !XML_DOCUMENT &&
+          typeof doc.compatMode == 'string' ?
+          doc.compatMode.indexOf('CSS') < 0 :
+          (function() {
+            var style = doc.createElement('div').style;
+            return style && (style.width = 1) && style.width == '1px';
+          })();
+
+        div = doc.createElement('div');
+        div.appendChild(doc.createElement('p')).setAttribute('class', 'xXx');
+        div.appendChild(doc.createElement('p')).setAttribute('class', 'xxx');
+
+        // GEBCN buggy in quirks mode, match count is:
+        // Firefox 3.0+ [xxx = 1, xXx = 1]
+        // Opera 10.63+ [xxx = 0, xXx = 2]
+        BUGGY_QUIRKS_GEBCN =
+          !XML_DOCUMENT && NATIVE_GEBCN && QUIRKS_MODE &&
+          (div.getElementsByClassName('xxx').length != 2 ||
+          div.getElementsByClassName('xXx').length != 2);
+
+        // QSAPI buggy in quirks mode, match count is:
+        // At least Chrome 4+, Firefox 3.5+, Opera 10.x+, Safari 4+ [xxx = 1, xXx = 2]
+        // Safari 3.2 QSA doesn't work with mixedcase in quirksmode [xxx = 1, xXx = 0]
+        // https://bugs.webkit.org/show_bug.cgi?id=19047
+        // must test the attribute selector '[class~=xxx]'
+        // before '.xXx' or the bug may not present itself
+        BUGGY_QUIRKS_QSAPI =
+          !XML_DOCUMENT && NATIVE_QSAPI && QUIRKS_MODE &&
+          (div.querySelectorAll('[class~=xxx]').length != 2 ||
+          div.querySelectorAll('.xXx').length != 2);
+
+        Config.CACHING && Dom.setCache(true, doc);
+      }
+    },
+
+  /*------------------------------ DOM METHODS -------------------------------*/
+
+  // element by id (raw)
+  // @return reference or null
+  byIdRaw =
+    function(id, elements) {
+      var i = -1, element = null;
+      while ((element = elements[++i])) {
+        if (element.getAttribute('id') == id) {
+          break;
+        }
+      }
+      return element;
+    },
+
+  // element by id
+  // @return reference or null
+  _byId = !BUGGY_GEBID ?
+    function(id, from) {
+      id = id.replace(/\\([^\\]{1})/g, '$1');
+      return from.getElementById && from.getElementById(id) ||
+        byIdRaw(id, from.getElementsByTagName('*'));
+    } :
+    function(id, from) {
+      var element = null;
+      id = id.replace(/\\([^\\]{1})/g, '$1');
+      if (XML_DOCUMENT || from.nodeType != 9) {
+        return byIdRaw(id, from.getElementsByTagName('*'));
+      }
+      if ((element = from.getElementById(id)) &&
+        element.name == id && from.getElementsByName) {
+        return byIdRaw(id, from.getElementsByName(id));
+      }
+      return element;
+    },
+
+  // publicly exposed byId
+  // @return reference or null
+  byId =
+    function(id, from) {
+      from || (from = doc);
+      if (lastContext !== from) { switchContext(from); }
+      return _byId(id, from);
+    },
+
+  // elements by tag (raw)
+  // @return array
+  byTagRaw =
+    function(tag, from) {
+      var any = tag == '*', element = from, elements = [ ], next = element.firstChild;
+      any || (tag = tag.toUpperCase());
+      while ((element = next)) {
+        if (element.tagName > '@' && (any || element.tagName.toUpperCase() == tag)) {
+          elements[elements.length] = element;
+        }
+        if ((next = element.firstChild || element.nextSibling)) continue;
+        while (!next && (element = element.parentNode) && element !== from) {
+          next = element.nextSibling;
+        }
+      }
+      return elements;
+    },
+
+  // elements by tag
+  // @return array
+  _byTag = !BUGGY_GEBTN && NATIVE_SLICE_PROTO ?
+    function(tag, from) {
+      return XML_DOCUMENT || from.nodeType == 11 ? byTagRaw(tag, from) :
+        slice.call(from.getElementsByTagName(tag), 0);
+    } :
+    function(tag, from) {
+      var i = -1, j = i, data = [ ],
+        element, elements = from.getElementsByTagName(tag);
+      if (tag == '*') {
+        while ((element = elements[++i])) {
+          if (element.nodeName > '@')
+            data[++j] = element;
+        }
+      } else {
+        while ((element = elements[++i])) {
+          data[i] = element;
+        }
+      }
+      return data;
+    },
+
+  // publicly exposed byTag
+  // @return array
+  byTag =
+    function(tag, from) {
+      from || (from = doc);
+      if (lastContext !== from) { switchContext(from); }
+      return _byTag(tag, from);
+    },
+
+  // publicly exposed byName
+  // @return array
+  byName =
+    function(name, from) {
+      return select('[name="' + name.replace(/\\([^\\]{1})/g, '$1') + '"]', from);
+    },
+
+  // elements by class (raw)
+  // @return array
+  byClassRaw =
+    function(name, from) {
+      var i = -1, j = i, data = [ ], element, elements = _byTag('*', from), n;
+      name = ' ' + (QUIRKS_MODE ? name.toLowerCase() : name).replace(/\\([^\\]{1})/g, '$1') + ' ';
+      while ((element = elements[++i])) {
+        n = XML_DOCUMENT ? element.getAttribute('class') : element.className;
+        if (n && n.length && (' ' + (QUIRKS_MODE ? n.toLowerCase() : n).
+          replace(reWhiteSpace, ' ') + ' ').indexOf(name) > -1) {
+          data[++j] = element;
+        }
+      }
+      return data;
+    },
+
+  // elements by class
+  // @return array
+  _byClass =
+    function(name, from) {
+      return (BUGGY_GEBCN || BUGGY_QUIRKS_GEBCN || XML_DOCUMENT || !from.getElementsByClassName) ?
+        byClassRaw(name, from) : slice.call(from.getElementsByClassName(name.replace(/\\([^\\]{1})/g, '$1')), 0);
+    },
+
+  // publicly exposed byClass
+  // @return array
+  byClass =
+    function(name, from) {
+      from || (from = doc);
+      if (lastContext !== from) { switchContext(from); }
+      return _byClass(name, from);
+    },
+
+  // check element is descendant of container
+  // @return boolean
+  contains = 'compareDocumentPosition' in root ?
+    function(container, element) {
+      return (container.compareDocumentPosition(element) & 16) == 16;
+    } : 'contains' in root ?
+    function(container, element) {
+      return container !== element && container.contains(element);
+    } :
+    function(container, element) {
+      while ((element = element.parentNode)) {
+        if (element === container) return true;
+      }
+      return false;
+    },
+
+  // attribute value
+  // @return string
+  getAttribute = !BUGGY_GET_ATTRIBUTE ?
+    function(node, attribute) {
+      return node.getAttribute(attribute) || '';
+    } :
+    function(node, attribute) {
+      attribute = attribute.toLowerCase();
+      if (typeof node[attribute] == 'object') {
+        return node.attributes[attribute] &&
+          node.attributes[attribute].value || '';
+      }
+      return (
+        // 'type' can only be read by using native getAttribute
+        attribute == 'type' ? node.getAttribute(attribute) || '' :
+        // specific URI data attributes (parameter 2 to fix IE bug)
+        ATTR_URIDATA[attribute] ? node.getAttribute(attribute, 2) || '' :
+        // boolean attributes should return name instead of true/false
+        ATTR_BOOLEAN[attribute] ? node.getAttribute(attribute) ? attribute : 'false' :
+          ((node = node.getAttributeNode(attribute)) && node.value) || '');
+    },
+
+  // attribute presence
+  // @return boolean
+  hasAttribute = !BUGGY_HAS_ATTRIBUTE ?
+    function(node, attribute) {
+      return XML_DOCUMENT ?
+        !!node.getAttribute(attribute) :
+        node.hasAttribute(attribute);
+    } :
+    function(node, attribute) {
+      attribute = attribute.toLowerCase();
+      if (ATTR_DEFAULT[attribute]) {
+        return !!node[ATTR_DEFAULT[attribute]];
+      }
+      // read the attribute node
+      node = node.getAttributeNode(attribute);
+      return !!(node && node.specified);
+    },
+
+  // check node emptyness
+  // @return boolean
+  isEmpty =
+    function(node) {
+      node = node.firstChild;
+      while (node) {
+        if (node.nodeType == 3 || node.nodeName > '@') return false;
+        node = node.nextSibling;
+      }
+      return true;
+    },
+
+  // check if element matches the :link pseudo
+  // @return boolean
+  isLink =
+    function(element) {
+      return hasAttribute(element,'href') && LINK_NODES[element.nodeName];
+    },
+
+  // child position by nodeType
+  // @return number
+  nthElement =
+    function(element, last) {
+      var count = 1, succ = last ? 'nextSibling' : 'previousSibling';
+      while ((element = element[succ])) {
+        if (element.nodeName > '@') ++count;
+      }
+      return count;
+    },
+
+  // child position by nodeName
+  // @return number
+  nthOfType =
+    function(element, last) {
+      var count = 1, succ = last ? 'nextSibling' : 'previousSibling', type = element.nodeName;
+      while ((element = element[succ])) {
+        if (element.nodeName == type) ++count;
+      }
+      return count;
+    },
+
+  /*------------------------------- DEBUGGING --------------------------------*/
+
+  // get/set (string/object) working modes
+  configure =
+    function(option) {
+      if (typeof option == 'string') { return Config[option]; }
+      if (typeof option != 'object') { return false; }
+      for (var i in option) {
+        Config[i] = !!option[i];
+        if (i == 'SIMPLENOT') {
+          matchContexts = { };
+          matchResolvers = { };
+          selectContexts = { };
+          selectResolvers = { };
+          Config['USE_QSAPI'] = false;
+        } else if (i == 'USE_QSAPI') {
+          Config[i] = !!option[i] && NATIVE_QSAPI;
+        }
+      }
+      reValidator = new RegExp(Config.SIMPLENOT ?
+        standardValidator : extendedValidator, 'g');
+      return true;
+    },
+
+  // control user notifications
+  emit =
+    function(message) {
+      if (Config.VERBOSITY) { throw new Error(message); }
+      if (global.console && global.console.log) {
+        global.console.log(message);
+      }
+    },
+
+  Config = {
+
+    // used to enable/disable caching of result sets
+    CACHING: false,
+
+    // by default do not add missing left/right context
+    // to selector string shortcuts like "+div" or "ul>"
+    // callable Dom.shortcuts method has to be available
+    SHORTCUTS: false,
+
+    // by default disable complex selectors nested in
+    // ':not()' pseudo-classes, as for specifications
+    SIMPLENOT: true,
+
+    // strict QSA match all non-unique IDs (false)
+    // speed & libs compat match unique ID (true)
+    UNIQUE_ID: true,
+
+    // HTML5 handling for the ":checked" pseudo-class
+    USE_HTML5: true,
+
+    // controls enabling the Query Selector API branch
+    USE_QSAPI: NATIVE_QSAPI,
+
+    // controls the engine error/warning notifications
+    VERBOSITY: true
+
+  },
+
+  /*---------------------------- COMPILER METHODS ----------------------------*/
+
+  // code string reused to build compiled functions
+  ACCEPT_NODE = 'r[r.length]=c[k];if(f&&false===f(c[k]))break main;else continue main;',
+
+  // compile a comma separated group of selector
+  // @mode boolean true for select, false for match
+  // return a compiled function
+  compile =
+    function(selector, source, mode) {
+
+      var parts = typeof selector == 'string' ? selector.match(reSplitGroup) : selector;
+
+      // ensures that source is a string
+      typeof source == 'string' || (source = '');
+
+      if (parts.length == 1) {
+        source += compileSelector(parts[0], mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode);
+      } else {
+        // for each selector in the group
+        var i = -1, seen = { }, token;
+        while ((token = parts[++i])) {
+          token = token.replace(reTrimSpaces, '');
+          // avoid repeating the same token
+          // in comma separated group (p, p)
+          if (!seen[token] && (seen[token] = true)) {
+            source += compileSelector(token, mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode);
+          }
+        }
+      }
+
+      if (mode) {
+        // for select method
+        return new Function('c,s,r,d,h,g,f,v',
+          'var N,n,x=0,k=-1,e;main:while((e=c[++k])){' + source + '}return r;');
+      } else {
+        // for match method
+        return new Function('e,s,r,d,h,g,f,v',
+          'var N,n,x=0,k=e;' + source + 'return false;');
+      }
+    },
+
+  // allows to cache already visited nodes
+  FILTER =
+    'var z=v[@]||(v[@]=[]),l=z.length-1;' +
+    'while(l>=0&&z[l]!==e)--l;' +
+    'if(l!==-1){break;}' +
+    'z[z.length]=e;',
+
+  // compile a CSS3 string selector into ad-hoc javascript matching function
+  // @return string (to be compiled)
+  compileSelector =
+    function(selector, source, mode) {
+
+      var a, b, n, k = 0, expr, match, result, status, test, type;
+
+      while (selector) {
+
+        k++;
+
+        // *** Universal selector
+        // * match all (empty block, do not remove)
+        if ((match = selector.match(Patterns.universal))) {
+          // do nothing, handled in the compiler where
+          // BUGGY_GEBTN return comment nodes (ex: IE)
+          expr = '';
+        }
+
+        // *** ID selector
+        // #Foo Id case sensitive
+        else if ((match = selector.match(Patterns.id))) {
+          // document can contain conflicting elements (id/name)
+          // prototype selector unit need this method to recover bad HTML forms
+          source = 'if(' + (XML_DOCUMENT ?
+            's.getAttribute(e,"id")' :
+            '(e.submit?s.getAttribute(e,"id"):e.id)') +
+            '=="' + match[1] + '"' +
+            '){' + source + '}';
+        }
+
+        // *** Type selector
+        // Foo Tag (case insensitive)
+        else if ((match = selector.match(Patterns.tagName))) {
+          // both tagName and nodeName properties may be upper/lower case
+          // depending on their creation NAMESPACE in createElementNS()
+          source = 'if(e.nodeName' + (XML_DOCUMENT ?
+            '=="' + match[1] + '"' : '.toUpperCase()' +
+            '=="' + match[1].toUpperCase() + '"') +
+            '){' + source + '}';
+        }
+
+        // *** Class selector
+        // .Foo Class (case sensitive)
+        else if ((match = selector.match(Patterns.className))) {
+          // W3C CSS3 specs: element whose "class" attribute has been assigned a
+          // list of whitespace-separated values, see section 6.4 Class selectors
+          // and notes at the bottom; explicitly non-normative in this specification.
+          source = 'if((n=' + (XML_DOCUMENT ?
+            's.getAttribute(e,"class")' : 'e.className') +
+            ')&&n.length&&(" "+' + (QUIRKS_MODE ? 'n.toLowerCase()' : 'n') +
+            '.replace(' + reWhiteSpace + '," ")+" ").indexOf(" ' +
+            (QUIRKS_MODE ? match[1].toLowerCase() : match[1]) + ' ")>-1' +
+            '){' + source + '}';
+        }
+
+        // *** Attribute selector
+        // [attr] [attr=value] [attr="value"] [attr='value'] and !=, *=, ~=, |=, ^=, $=
+        // case sensitivity is treated differently depending on the document type (see map)
+        else if ((match = selector.match(Patterns.attribute))) {
+
+          // xml namespaced attribute ?
+          expr = match[1].split(':');
+          expr = expr.length == 2 ? expr[1] : expr[0] + '';
+
+          if (match[2] && !Operators[match[2]]) {
+            emit('Unsupported operator in attribute selectors "' + selector + '"');
+            return '';
+          }
+
+          test = false;
+          type = 'false';
+
+          // replace Operators parameter if needed
+          if (match[2] && match[4] && (type = Operators[match[2]])) {
+            // case treatment depends on document
+            HTML_TABLE['class'] = QUIRKS_MODE ? 1 : 0;
+            // replace escaped values and HTML entities
+            match[4] = match[4].replace(/(\x22|\x27)/g, '\\$1');
+            match[4] = match[4].replace(/\\([0-9a-f]{2,2})/g, '\\x$1');
+            test = (XML_DOCUMENT ? XHTML_TABLE : HTML_TABLE)[expr.toLowerCase()];
+            type = type.replace(/\%m/g, test ? match[4].toLowerCase() : match[4]);
+          } else if (match[2] == '!=' || match[2] == '=') {
+            match[4] = match[4].replace(/(\x22|\x27)/g, '\\$1');
+            type = 'n' + match[2] + '="' + match[4] + '"';
+          }
+
+          // build expression for has/getAttribute
+          expr = 'n=s.' + (match[2] ? 'get' : 'has') +
+            'Attribute(e,"' + match[1] + '")' +
+            (test ? '.toLowerCase();' : ';');
+
+          source = expr + 'if(' + (match[2] ? type : 'n') + '){' + source + '}';
+        }
+
+        // *** Adjacent sibling combinator
+        // E + F (F adiacent sibling of E)
+        else if ((match = selector.match(Patterns.adjacent))) {
+          source = (mode ? '' : FILTER.replace(/@/g, k)) + source;
+          source = NATIVE_TRAVERSAL_API ?
+            'var N' + k + '=e;while(e&&(e=e.previousElementSibling)){' + source + 'break;}e=N' + k + ';' :
+            'var N' + k + '=e;while(e&&(e=e.previousSibling)){if(e.nodeName>"@"){' + source + 'break;}}e=N' + k + ';';
+        }
+
+        // *** General sibling combinator
+        // E ~ F (F relative sibling of E)
+        else if ((match = selector.match(Patterns.relative))) {
+          source = (mode ? '' : FILTER.replace(/@/g, k)) + source;
+          source = NATIVE_TRAVERSAL_API ?
+            ('var N' + k + '=e;e=e.parentNode.firstElementChild;' +
+            'while(e&&e!==N' + k + '){' + source + 'e=e.nextElementSibling;}e=N' + k + ';') :
+            ('var N' + k + '=e;e=e.parentNode.firstChild;' +
+            'while(e&&e!==N' + k + '){if(e.nodeName>"@"){' + source + '}e=e.nextSibling;}e=N' + k + ';');
+        }
+
+        // *** Child combinator
+        // E > F (F children of E)
+        else if ((match = selector.match(Patterns.children))) {
+          source = (mode ? '' : FILTER.replace(/@/g, k)) + source;
+          source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + 'break;}e=N' + k + ';';
+        }
+
+        // *** Descendant combinator
+        // E F (E ancestor of F)
+        else if ((match = selector.match(Patterns.ancestor))) {
+          source = (mode ? '' : FILTER.replace(/@/g, k)) + source;
+          source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + '}e=N' + k + ';';
+        }
+
+        // *** Structural pseudo-classes
+        // :root, :empty,
+        // :first-child, :last-child, :only-child,
+        // :first-of-type, :last-of-type, :only-of-type,
+        // :nth-child(), :nth-last-child(), :nth-of-type(), :nth-last-of-type()
+        else if ((match = selector.match(Patterns.spseudos)) && match[1]) {
+
+          switch (match[1]) {
+            case 'root':
+              // element root of the document
+              if (match[3]) {
+                source = 'if(e===h||s.contains(h,e)){' + source + '}';
+              } else {
+                source = 'if(e===h){' + source + '}';
+              }
+              break;
+
+            case 'empty':
+              // element that has no children
+              source = 'if(s.isEmpty(e)){' + source + '}';
+              break;
+
+            default:
+              if (match[1] && match[2]) {
+                if (match[2] == 'n') {
+                  source = 'if(e!==h){' + source + '}';
+                  break;
+                } else if (match[2] == 'even') {
+                  a = 2;
+                  b = 0;
+                } else if (match[2] == 'odd') {
+                  a = 2;
+                  b = 1;
+                } else {
+                  // assumes correct "an+b" format, "b" before "a" to keep "n" values
+                  b = ((n = match[2].match(/(-?\d+)$/)) ? parseInt(n[1], 10) : 0);
+                  a = ((n = match[2].match(/(-?\d*)n/i)) ? parseInt(n[1], 10) : 0);
+                  if (n && n[1] == '-') a = -1;
+                }
+
+                // build test expression out of structural pseudo (an+b) parameters
+                // see here: http://www.w3.org/TR/css3-selectors/#nth-child-pseudo
+                test = a > 1 ?
+                  (/last/i.test(match[1])) ? '(n-(' + b + '))%' + a + '==0' :
+                  'n>=' + b + '&&(n-(' + b + '))%' + a + '==0' : a < -1 ?
+                  (/last/i.test(match[1])) ? '(n-(' + b + '))%' + a + '==0' :
+                  'n<=' + b + '&&(n-(' + b + '))%' + a + '==0' : a=== 0 ?
+                  'n==' + b :
+                  (/last/i.test(match[1])) ?
+                    a == -1 ? 'n>=' + b : 'n<=' + b :
+                    a == -1 ? 'n<=' + b : 'n>=' + b;
+
+                // 4 cases: 1 (nth) x 4 (child, of-type, last-child, last-of-type)
+                source =
+                  'if(e!==h){' +
+                    'n=s[' + (/-of-type/i.test(match[1]) ? '"nthOfType"' : '"nthElement"') + ']' +
+                      '(e,' + (/last/i.test(match[1]) ? 'true' : 'false') + ');' +
+                    'if(' + test + '){' + source + '}' +
+                  '}';
+
+              } else {
+                // 6 cases: 3 (first, last, only) x 1 (child) x 2 (-of-type)
+                a = /first/i.test(match[1]) ? 'previous' : 'next';
+                n = /only/i.test(match[1]) ? 'previous' : 'next';
+                b = /first|last/i.test(match[1]);
+
+                type = /-of-type/i.test(match[1]) ? '&&n.nodeName!=e.nodeName' : '&&n.nodeName<"@"';
+
+                source = 'if(e!==h){' +
+                  ( 'n=e;while((n=n.' + a + 'Sibling)' + type + ');if(!n){' + (b ? source :
+                    'n=e;while((n=n.' + n + 'Sibling)' + type + ');if(!n){' + source + '}') + '}' ) + '}';
+              }
+              break;
+          }
+
+        }
+
+        // *** negation, user action and target pseudo-classes
+        // *** UI element states and dynamic pseudo-classes
+        // CSS3 :not, :checked, :enabled, :disabled, :target
+        // CSS3 :active, :hover, :focus
+        // CSS3 :link, :visited
+        else if ((match = selector.match(Patterns.dpseudos)) && match[1]) {
+
+          switch (match[1].match(/^\w+/)[0]) {
+            // CSS3 negation pseudo-class
+            case 'not':
+              // compile nested selectors, DO NOT pass the callback parameter
+              // SIMPLENOT allow disabling complex selectors nested
+              // in ':not()' pseudo-classes, breaks some test units
+              expr = match[3].replace(reTrimSpaces, '');
+
+              if (Config.SIMPLENOT && !reSimpleNot.test(expr)) {
+                // see above, log error but continue execution
+                emit('Negation pseudo-class only accepts simple selectors "' + selector + '"');
+                return '';
+              } else {
+                if ('compatMode' in doc) {
+                  source = 'if(!' + compile(expr, '', false) + '(e,s,r,d,h,g)){' + source + '}';
+                } else {
+                  source = 'if(!s.match(e, "' + expr.replace(/\x22/g, '\\"') + '",g)){' + source +'}';
+                }
+              }
+              break;
+
+            // CSS3 UI element states
+            case 'checked':
+              // for radio buttons checkboxes (HTML4) and options (HTML5)
+              source = 'if((typeof e.form!=="undefined"&&(/^(?:radio|checkbox)$/i).test(e.type)&&e.checked)' +
+                (Config.USE_HTML5 ? '||(/^option$/i.test(e.nodeName)&&(e.selected||e.checked))' : '') +
+                '){' + source + '}';
+              break;
+            case 'disabled':
+              // does not consider hidden input fields
+              source = 'if(((typeof e.form!=="undefined"' +
+                (Config.USE_HTML5 ? '' : '&&!(/^hidden$/i).test(e.type)') +
+                ')||s.isLink(e))&&e.disabled===true){' + source + '}';
+              break;
+            case 'enabled':
+              // does not consider hidden input fields
+              source = 'if(((typeof e.form!=="undefined"' +
+                (Config.USE_HTML5 ? '' : '&&!(/^hidden$/i).test(e.type)') +
+                ')||s.isLink(e))&&e.disabled===false){' + source + '}';
+              break;
+
+            // CSS3 lang pseudo-class
+            case 'lang':
+              test = '';
+              if (match[2]) test = match[2].substr(0, 2) + '-';
+              source = 'do{(n=e.lang||"").toLowerCase();' +
+                'if((n==""&&h.lang=="' + match[2].toLowerCase() + '")||' +
+                '(n&&(n=="' + match[2].toLowerCase() +
+                '"||n.substr(0,3)=="' + test.toLowerCase() + '")))' +
+                '{' + source + 'break;}}while((e=e.parentNode)&&e!==g);';
+              break;
+
+            // CSS3 target pseudo-class
+            case 'target':
+              n = doc.location ? doc.location.hash : '';
+              if (n) {
+                source = 'if(e.id=="' + n.slice(1) + '"){' + source + '}';
+              }
+              break;
+
+            // CSS3 dynamic pseudo-classes
+            case 'link':
+              source = 'if(s.isLink(e)&&!e.visited){' + source + '}';
+              break;
+            case 'visited':
+              source = 'if(s.isLink(e)&&e.visited){' + source + '}';
+              break;
+
+            // CSS3 user action pseudo-classes IE & FF3 have native support
+            // these capabilities may be emulated by some event managers
+            case 'active':
+              if (XML_DOCUMENT) break;
+              source = 'if(e===d.activeElement){' + source + '}';
+              break;
+            case 'hover':
+              if (XML_DOCUMENT) break;
+              source = 'if(e===d.hoverElement){' + source + '}';
+              break;
+            case 'focus':
+              if (XML_DOCUMENT) break;
+              source = NATIVE_FOCUS ?
+                'if(e===d.activeElement&&d.hasFocus()&&(e.type||e.href||!isNaN(e.tabIndex))){' + source + '}' :
+                'if(e===d.activeElement&&(e.type||e.href)){' + source + '}';
+              break;
+
+            // CSS2 selected pseudo-classes, not part of current CSS3 drafts
+            // the 'selected' property is only available for option elements
+            case 'selected':
+              // fix Safari selectedIndex property bug
+              expr = BUGGY_SELECTED ? '||(n=e.parentNode)&&n.options[n.selectedIndex]===e' : '';
+              source = 'if(/^option$/i.test(e.nodeName)&&(e.selected||e.checked' + expr + ')){' + source + '}';
+              break;
+
+            default:
+              break;
+          }
+
+        }
+
+        else {
+
+          // this is where external extensions are
+          // invoked if expressions match selectors
+          expr = false;
+          status = false;
+          for (expr in Selectors) {
+            if ((match = selector.match(Selectors[expr].Expression)) && match[1]) {
+              result = Selectors[expr].Callback(match, source);
+              source = result.source;
+              status = result.status;
+              if (status) { break; }
+            }
+          }
+
+          // if an extension fails to parse the selector
+          // it must return a false boolean in "status"
+          if (!status) {
+            // log error but continue execution, don't throw real exceptions
+            // because blocking following processes maybe is not a good idea
+            emit('Unknown pseudo-class selector "' + selector + '"');
+            return '';
+          }
+
+          if (!expr) {
+            // see above, log error but continue execution
+            emit('Unknown token in selector "' + selector + '"');
+            return '';
+          }
+
+        }
+
+        // error if no matches found by the pattern scan
+        if (!match) {
+          emit('Invalid syntax in selector "' + selector + '"');
+          return '';
+        }
+
+        // ensure "match" is not null or empty since
+        // we do not throw real DOMExceptions above
+        selector = match && match[match.length - 1];
+      }
+
+      return source;
+    },
+
+  /*----------------------------- QUERY METHODS ------------------------------*/
+
+  // match element with selector
+  // @return boolean
+  match =
+    function(element, selector, from, callback) {
+
+      var parts;
+
+      if (!(element && element.nodeName > '@')) {
+        emit('Invalid element argument');
+        return false;
+      } else if (typeof selector != 'string') {
+        emit('Invalid selector argument');
+        return false;
+      } else if (from && from.nodeType == 1 && !contains(from, element)) {
+        return false;
+      } else if (lastContext !== from) {
+        // reset context data when it changes
+        // and ensure context is set to a default
+        switchContext(from || (from = element.ownerDocument));
+      }
+
+      selector = selector.replace(reTrimSpaces, '');
+
+      Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, element, from));
+
+      if (lastMatcher != selector) {
+        // process valid selector strings
+        if ((parts = selector.match(reValidator)) && parts[0] == selector) {
+          isSingleMatch = (parts = selector.match(reSplitGroup)).length < 2;
+          // save passed selector
+          lastMatcher = selector;
+          lastPartsMatch = parts;
+        } else {
+          emit('The string "' + selector + '", is not a valid CSS selector');
+          return false;
+        }
+      } else parts = lastPartsMatch;
+
+      // compile matcher resolvers if necessary
+      if (!matchResolvers[selector] || matchContexts[selector] !== from) {
+        matchResolvers[selector] = compile(isSingleMatch ? [selector] : parts, '', false);
+        matchContexts[selector] = from;
+      }
+
+      return matchResolvers[selector](element, Snapshot, [ ], doc, root, from, callback, { });
+    },
+
+  // select only the first element
+  // matching selector (document ordered)
+  first =
+    function(selector, from) {
+      return select(selector, from, function() { return false; })[0] || null;
+    },
+
+  // select elements matching selector
+  // using new Query Selector API
+  // or cross-browser client API
+  // @return array
+  select =
+    function(selector, from, callback) {
+
+      var i, changed, element, elements, parts, token, original = selector;
+
+      if (arguments.length === 0) {
+        emit('Not enough arguments');
+        return [ ];
+      } else if (typeof selector != 'string') {
+        return [ ];
+      } else if (from && !(/1|9|11/).test(from.nodeType)) {
+        emit('Invalid or illegal context element');
+        return [ ];
+      } else if (lastContext !== from) {
+        // reset context data when it changes
+        // and ensure context is set to a default
+        switchContext(from || (from = doc));
+      }
+
+      if (Config.CACHING && (elements = Dom.loadResults(original, from, doc, root))) {
+        return callback ? concatCall([ ], elements, callback) : elements;
+      }
+
+      if (!OPERA_QSAPI && RE_SIMPLE_SELECTOR.test(selector)) {
+        switch (selector.charAt(0)) {
+          case '#':
+            if (Config.UNIQUE_ID) {
+              if (element = _byId(selector.slice(1), from)) {
+                elements = [ element ];
+              } else elements = [ ];
+            }
+            break;
+          case '.':
+            elements = _byClass(selector.slice(1), from);
+            break;
+          default:
+            elements = _byTag(selector, from);
+            break;
+        }
+      }
+
+      else if (!XML_DOCUMENT && Config.USE_QSAPI &&
+        !(BUGGY_QUIRKS_QSAPI && RE_CLASS.test(selector)) &&
+        !RE_BUGGY_QSAPI.test(selector)) {
+        try {
+          elements = from.querySelectorAll(selector);
+        } catch(e) { }
+      }
+
+      if (elements) {
+        elements = callback ? concatCall([ ], elements, callback) :
+          NATIVE_SLICE_PROTO ? slice.call(elements) : concatList([ ], elements);
+        Config.CACHING && Dom.saveResults(original, from, doc, elements);
+        return elements;
+      }
+
+      selector = selector.replace(reTrimSpaces, '');
+
+      Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, from));
+
+      if ((changed = lastSelector != selector)) {
+        // process valid selector strings
+        if ((parts = selector.match(reValidator)) && parts[0] == selector) {
+          isSingleSelect = (parts = selector.match(reSplitGroup)).length < 2;
+          // save passed selector
+          lastSelector = selector;
+          lastPartsSelect = parts;
+        } else {
+          emit('The string "' + selector + '", is not a valid CSS selector');
+          return [ ];
+        }
+      } else parts = lastPartsSelect;
+
+      // commas separators are treated sequentially to maintain order
+      if (from.nodeType == 11) {
+
+        elements = from.childNodes;
+
+      } else if (!XML_DOCUMENT && isSingleSelect) {
+
+        if (changed) {
+          // get right most selector token
+          parts = selector.match(reSplitToken);
+          token = parts[parts.length - 1];
+
+          // only last slice before :not rules
+          lastSlice = token.split(':not')[0];
+
+          // position where token was found
+          lastPosition = selector.length - token.length;
+        }
+
+        // ID optimization RTL, to reduce number of elements to visit
+        if (Config.UNIQUE_ID && (parts = lastSlice.match(Optimize.ID)) && (token = parts[1])) {
+          if ((element = _byId(token, from))) {
+            if (match(element, selector)) {
+              callback && callback(element);
+              elements = [ element ];
+            } else elements = [ ];
+          }
+        }
+
+        // ID optimization LTR, to reduce selection context searches
+        else if (Config.UNIQUE_ID && (parts = selector.match(Optimize.ID)) && (token = parts[1])) {
+          if ((element = _byId(token, doc))) {
+            if ('#' + token == selector) {
+              callback && callback(element);
+              elements = [ element ];
+            } else if (/[>+~]/.test(selector)) {
+              from = element.parentNode;
+            } else {
+              from = element;
+            }
+          } else elements = [ ];
+        }
+
+        if (elements) {
+          Config.CACHING && Dom.saveResults(original, from, doc, elements);
+          return elements;
+        }
+
+        if (!NATIVE_GEBCN && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) {
+          if ((elements = _byTag(token, from)).length === 0) { return [ ]; }
+          selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*');
+        }
+
+        else if ((parts = lastSlice.match(Optimize.CLASS)) && (token = parts[1])) {
+          if ((elements = _byClass(token, from)).length === 0) { return [ ]; }
+          if (reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1))) {
+            selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, '');
+          } else {
+            selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, '*');
+          }
+        }
+
+        else if ((parts = selector.match(Optimize.CLASS)) && (token = parts[1])) {
+          if ((elements = _byClass(token, from)).length === 0) { return [ ]; }
+          for (i = 0, els = [ ]; elements.length > i; ++i) {
+            els = concatList(els, elements[i].getElementsByTagName('*'));
+          }
+          elements = els;
+          if (reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1))) {
+            selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, '');
+          } else {
+            selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, '*');
+          }
+        }
+
+        else if (NATIVE_GEBCN && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) {
+          if ((elements = _byTag(token, from)).length === 0) { return [ ]; }
+          selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*');
+        }
+
+      }
+
+      if (!elements) {
+        elements = /^(?:applet|object)$/i.test(from.nodeName) ? from.childNodes : _byTag('*', from);
+      }
+      // end of prefiltering pass
+
+      // compile selector resolver if necessary
+      if (!selectResolvers[selector] || selectContexts[selector] !== from) {
+        selectResolvers[selector] = compile(isSingleSelect ? [selector] : parts, '', true);
+        selectContexts[selector] = from;
+      }
+
+      elements = selectResolvers[selector](elements, Snapshot, [ ], doc, root, from, callback, { });
+
+      Config.CACHING && Dom.saveResults(original, from, doc, elements);
+
+      return elements;
+    },
+
+  /*-------------------------------- STORAGE ---------------------------------*/
+
+  // empty function handler
+  FN = function(x) { return x; },
+
+  // compiled match functions returning booleans
+  matchContexts = { },
+  matchResolvers = { },
+
+  // compiled select functions returning collections
+  selectContexts = { },
+  selectResolvers = { },
+
+  // used to pass methods to compiled functions
+  Snapshot = {
+
+    // element indexing methods
+    nthElement: nthElement,
+    nthOfType: nthOfType,
+
+    // element inspection methods
+    getAttribute: getAttribute,
+    hasAttribute: hasAttribute,
+
+    // element selection methods
+    byClass: _byClass,
+    byName: byName,
+    byTag: _byTag,
+    byId: _byId,
+
+    // helper/check methods
+    contains: contains,
+    isEmpty: isEmpty,
+    isLink: isLink,
+
+    // selection/matching
+    select: select,
+    match: match
+  },
+
+  Tokens = {
+    prefixes: prefixes,
+    encoding: encoding,
+    operators: operators,
+    whitespace: whitespace,
+    identifier: identifier,
+    attributes: attributes,
+    combinators: combinators,
+    pseudoclass: pseudoclass,
+    pseudoparms: pseudoparms,
+    quotedvalue: quotedvalue
+  };
+
+  /*------------------------------- PUBLIC API -------------------------------*/
+
+  // code referenced by extensions
+  Dom.ACCEPT_NODE = ACCEPT_NODE;
+
+  // log resolvers errors/warnings
+  Dom.emit = emit;
+
+  // retrieve element by id attr
+  Dom.byId = byId;
+
+  // retrieve elements by tag name
+  Dom.byTag = byTag;
+
+  // retrieve elements by name attr
+  Dom.byName = byName;
+
+  // retrieve elements by class name
+  Dom.byClass = byClass;
+
+  // read the value of the attribute
+  // as was in the original HTML code
+  Dom.getAttribute = getAttribute;
+
+  // check for the attribute presence
+  // as was in the original HTML code
+  Dom.hasAttribute = hasAttribute;
+
+  // element match selector, return boolean true/false
+  Dom.match = match;
+
+  // first element match only, return element or null
+  Dom.first = first;
+
+  // elements matching selector, starting from element
+  Dom.select = select;
+
+  // compile selector into ad-hoc javascript resolver
+  Dom.compile = compile;
+
+  // check that two elements are ancestor/descendant
+  Dom.contains = contains;
+
+  // handle selector engine configuration settings
+  Dom.configure = configure;
+
+  // initialize caching for each document
+  Dom.setCache = FN;
+
+  // load previously collected result set
+  Dom.loadResults = FN;
+
+  // save previously collected result set
+  Dom.saveResults = FN;
+
+  // handle missing context in selector strings
+  Dom.shortcuts = FN;
+
+  // options enabing specific engine functionality
+  Dom.Config = Config;
+
+  // pass methods references to compiled resolvers
+  Dom.Snapshot = Snapshot;
+
+  // operators descriptor
+  // for attribute operators extensions
+  Dom.Operators = Operators;
+
+  // selectors descriptor
+  // for pseudo-class selectors extensions
+  Dom.Selectors = Selectors;
+
+  // export string patterns
+  Dom.Tokens = Tokens;
+
+  // add or overwrite user defined operators
+  Dom.registerOperator =
+    function(symbol, resolver) {
+      Operators[symbol] || (Operators[symbol] = resolver);
+    };
+
+  // add selector patterns for user defined callbacks
+  Dom.registerSelector =
+    function(name, rexp, func) {
+      Selectors[name] || (Selectors[name] = {
+        Expression: rexp,
+        Callback: func
+      });
+    };
+
+  /*---------------------------------- INIT ----------------------------------*/
+
+  // init context specific variables
+  switchContext(doc, true);
+
+});
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/LICENSE b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/LICENSE
new file mode 100644
index 0000000..1c63271
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/LICENSE
@@ -0,0 +1,22 @@
+ Copyright (c) 2010 passive.ly LLC
+
+ 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/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/README.md b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/README.md
new file mode 100644
index 0000000..b989434
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/README.md
@@ -0,0 +1,57 @@
+# node-XMLHttpRequest #
+
+node-XMLHttpRequest is a wrapper for the built-in http client to emulate the
+browser XMLHttpRequest object.
+
+This can be used with JS designed for browsers to improve reuse of code and
+allow the use of existing libraries.
+
+Note: This library currently conforms to [XMLHttpRequest 1](http://www.w3.org/TR/XMLHttpRequest/). Version 2.0 will target [XMLHttpRequest Level 2](http://www.w3.org/TR/XMLHttpRequest2/).
+
+## Usage ##
+
+Here's how to include the module in your project and use as the browser-based
+XHR object.
+
+	var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
+	var xhr = new XMLHttpRequest();
+
+Note: use the lowercase string "xmlhttprequest" in your require(). On
+case-sensitive systems (eg Linux) using uppercase letters won't work.
+
+## Versions ##
+
+Prior to 1.4.0 version numbers were arbitrary. From 1.4.0 on they conform to
+the standard major.minor.bugfix. 1.x shouldn't necessarily be considered
+stable just because it's above 0.x.
+
+Since the XMLHttpRequest API is stable this library's API is stable as
+well. Major version numbers indicate significant core code changes.
+Minor versions indicate minor core code changes or better conformity to
+the W3C spec.
+
+## License ##
+
+MIT license. See LICENSE for full details.
+
+## Supports ##
+
+* Async and synchronous requests
+* GET, POST, PUT, and DELETE requests
+* All spec methods (open, send, abort, getRequestHeader,
+  getAllRequestHeaders, event methods)
+* Requests to all domains
+
+## Known Issues / Missing Features ##
+
+For a list of open issues or to report your own visit the [github issues
+page](https://github.com/driverdan/node-XMLHttpRequest/issues).
+
+* Local file access may have unexpected results for non-UTF8 files
+* Synchronous requests don't set headers properly
+* Synchronous requests freeze node while waiting for response (But that's what you want, right? Stick with async!).
+* Some events are missing, such as abort
+* getRequestHeader is case-sensitive
+* Cookies aren't persisted between requests
+* Missing XML support
+* Missing basic auth
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/autotest.watchr b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/autotest.watchr
new file mode 100644
index 0000000..5324db6
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/autotest.watchr
@@ -0,0 +1,8 @@
+def run_all_tests
+    puts `clear`
+    puts `node tests/test-constants.js`
+    puts `node tests/test-headers.js`
+    puts `node tests/test-request.js`
+end
+watch('.*.js') { run_all_tests }
+run_all_tests
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/example/demo.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/example/demo.js
new file mode 100644
index 0000000..4f333de
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/example/demo.js
@@ -0,0 +1,16 @@
+var sys = require('util');
+var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
+
+var xhr = new XMLHttpRequest();
+
+xhr.onreadystatechange = function() {
+	sys.puts("State: " + this.readyState);
+	
+	if (this.readyState == 4) {
+		sys.puts("Complete.\nBody length: " + this.responseText.length);
+		sys.puts("Body:\n" + this.responseText);
+	}
+};
+
+xhr.open("GET", "http://driverdan.com");
+xhr.send();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/lib/XMLHttpRequest.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/lib/XMLHttpRequest.js
new file mode 100644
index 0000000..5c99b24
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/lib/XMLHttpRequest.js
@@ -0,0 +1,599 @@
+/**
+ * Wrapper for built-in http.js to emulate the browser XMLHttpRequest object.
+ *
+ * This can be used with JS designed for browsers to improve reuse of code and
+ * allow the use of existing libraries.
+ *
+ * Usage: include("XMLHttpRequest.js") and use XMLHttpRequest per W3C specs.
+ *
+ * @author Dan DeFelippi <dan at driverdan.com>
+ * @contributor David Ellis <d.f.ellis at ieee.org>
+ * @license MIT
+ */
+
+var Url = require("url")
+  , spawn = require("child_process").spawn
+  , fs = require('fs');
+
+exports.XMLHttpRequest = function() {
+  /**
+   * Private variables
+   */
+  var self = this;
+  var http = require('http');
+  var https = require('https');
+
+  // Holds http.js objects
+  var request;
+  var response;
+
+  // Request settings
+  var settings = {};
+
+  // Disable header blacklist.
+  // Not part of XHR specs.
+  var disableHeaderCheck = false;
+
+  // Set some default headers
+  var defaultHeaders = {
+    "User-Agent": "node-XMLHttpRequest",
+    "Accept": "*/*",
+  };
+
+  var headers = defaultHeaders;
+
+  // These headers are not user setable.
+  // The following are allowed but banned in the spec:
+  // * user-agent
+  var forbiddenRequestHeaders = [
+    "accept-charset",
+    "accept-encoding",
+    "access-control-request-headers",
+    "access-control-request-method",
+    "connection",
+    "content-length",
+    "content-transfer-encoding",
+    "cookie",
+    "cookie2",
+    "date",
+    "expect",
+    "host",
+    "keep-alive",
+    "origin",
+    "referer",
+    "te",
+    "trailer",
+    "transfer-encoding",
+    "upgrade",
+    "via"
+  ];
+
+  // These request methods are not allowed
+  var forbiddenRequestMethods = [
+    "TRACE",
+    "TRACK",
+    "CONNECT"
+  ];
+
+  // Send flag
+  var sendFlag = false;
+  // Error flag, used when errors occur or abort is called
+  var errorFlag = false;
+
+  // Event listeners
+  var listeners = {};
+
+  /**
+   * Constants
+   */
+
+  this.UNSENT = 0;
+  this.OPENED = 1;
+  this.HEADERS_RECEIVED = 2;
+  this.LOADING = 3;
+  this.DONE = 4;
+
+  /**
+   * Public vars
+   */
+
+  // Current state
+  this.readyState = this.UNSENT;
+
+  // default ready state change handler in case one is not set or is set late
+  this.onreadystatechange = null;
+
+  // Result & response
+  this.responseText = "";
+  this.responseXML = "";
+  this.status = null;
+  this.statusText = null;
+
+  /**
+   * Private methods
+   */
+
+  /**
+   * Check if the specified header is allowed.
+   *
+   * @param string header Header to validate
+   * @return boolean False if not allowed, otherwise true
+   */
+  var isAllowedHttpHeader = function(header) {
+    return disableHeaderCheck || (header && forbiddenRequestHeaders.indexOf(header.toLowerCase()) === -1);
+  };
+
+  /**
+   * Check if the specified method is allowed.
+   *
+   * @param string method Request method to validate
+   * @return boolean False if not allowed, otherwise true
+   */
+  var isAllowedHttpMethod = function(method) {
+    return (method && forbiddenRequestMethods.indexOf(method) === -1);
+  };
+
+  /**
+   * Public methods
+   */
+
+  /**
+   * Open the connection. Currently supports local server requests.
+   *
+   * @param string method Connection method (eg GET, POST)
+   * @param string url URL for the connection.
+   * @param boolean async Asynchronous connection. Default is true.
+   * @param string user Username for basic authentication (optional)
+   * @param string password Password for basic authentication (optional)
+   */
+  this.open = function(method, url, async, user, password) {
+    this.abort();
+    errorFlag = false;
+
+    // Check for valid request method
+    if (!isAllowedHttpMethod(method)) {
+      throw "SecurityError: Request method not allowed";
+    }
+
+    settings = {
+      "method": method,
+      "url": url.toString(),
+      "async": (typeof async !== "boolean" ? true : async),
+      "user": user || null,
+      "password": password || null
+    };
+
+    setState(this.OPENED);
+  };
+
+  /**
+   * Disables or enables isAllowedHttpHeader() check the request. Enabled by default.
+   * This does not conform to the W3C spec.
+   *
+   * @param boolean state Enable or disable header checking.
+   */
+  this.setDisableHeaderCheck = function(state) {
+    disableHeaderCheck = state;
+  };
+
+  /**
+   * Sets a header for the request.
+   *
+   * @param string header Header name
+   * @param string value Header value
+   */
+  this.setRequestHeader = function(header, value) {
+    if (this.readyState != this.OPENED) {
+      throw "INVALID_STATE_ERR: setRequestHeader can only be called when state is OPEN";
+    }
+    if (!isAllowedHttpHeader(header)) {
+      console.warn('Refused to set unsafe header "' + header + '"');
+      return;
+    }
+    if (sendFlag) {
+      throw "INVALID_STATE_ERR: send flag is true";
+    }
+    headers[header] = value;
+  };
+
+  /**
+   * Gets a header from the server response.
+   *
+   * @param string header Name of header to get.
+   * @return string Text of the header or null if it doesn't exist.
+   */
+  this.getResponseHeader = function(header) {
+    if (typeof header === "string"
+      && this.readyState > this.OPENED
+      && response.headers[header.toLowerCase()]
+      && !errorFlag
+    ) {
+      return response.headers[header.toLowerCase()];
+    }
+
+    return null;
+  };
+
+  /**
+   * Gets all the response headers.
+   *
+   * @return string A string with all response headers separated by CR+LF
+   */
+  this.getAllResponseHeaders = function() {
+    if (this.readyState < this.HEADERS_RECEIVED || errorFlag) {
+      return "";
+    }
+    var result = "";
+
+    for (var i in response.headers) {
+      // Cookie headers are excluded
+      if (i !== "set-cookie" && i !== "set-cookie2") {
+        result += i + ": " + response.headers[i] + "\r\n";
+      }
+    }
+    return result.substr(0, result.length - 2);
+  };
+
+  /**
+   * Gets a request header
+   *
+   * @param string name Name of header to get
+   * @return string Returns the request header or empty string if not set
+   */
+  this.getRequestHeader = function(name) {
+    // @TODO Make this case insensitive
+    if (typeof name === "string" && headers[name]) {
+      return headers[name];
+    }
+
+    return "";
+  };
+
+  /**
+   * Sends the request to the server.
+   *
+   * @param string data Optional data to send as request body.
+   */
+  this.send = function(data) {
+    if (this.readyState != this.OPENED) {
+      throw "INVALID_STATE_ERR: connection must be opened before send() is called";
+    }
+
+    if (sendFlag) {
+      throw "INVALID_STATE_ERR: send has already been called";
+    }
+
+    var ssl = false, local = false;
+    var url = Url.parse(settings.url);
+    var host;
+    // Determine the server
+    switch (url.protocol) {
+      case 'https:':
+        ssl = true;
+        // SSL & non-SSL both need host, no break here.
+      case 'http:':
+        host = url.hostname;
+        break;
+
+      case 'file:':
+        local = true;
+        break;
+
+      case undefined:
+      case '':
+        host = "localhost";
+        break;
+
+      default:
+        throw "Protocol not supported.";
+    }
+
+    // Load files off the local filesystem (file://)
+    if (local) {
+      if (settings.method !== "GET") {
+        throw "XMLHttpRequest: Only GET method is supported";
+      }
+
+      if (settings.async) {
+        fs.readFile(url.pathname, 'utf8', function(error, data) {
+          if (error) {
+            self.handleError(error);
+          } else {
+            self.status = 200;
+            self.responseText = data;
+            setState(self.DONE);
+          }
+        });
+      } else {
+        try {
+          this.responseText = fs.readFileSync(url.pathname, 'utf8');
+          this.status = 200;
+          setState(self.DONE);
+        } catch(e) {
+          this.handleError(e);
+        }
+      }
+
+      return;
+    }
+
+    // Default to port 80. If accessing localhost on another port be sure
+    // to use http://localhost:port/path
+    var port = url.port || (ssl ? 443 : 80);
+    // Add query string if one is used
+    var uri = url.pathname + (url.search ? url.search : '');
+
+    // Set the Host header or the server may reject the request
+    headers["Host"] = host;
+    if (!((ssl && port === 443) || port === 80)) {
+      headers["Host"] += ':' + url.port;
+    }
+
+    // Set Basic Auth if necessary
+    if (settings.user) {
+      if (typeof settings.password == "undefined") {
+        settings.password = "";
+      }
+      var authBuf = new Buffer(settings.user + ":" + settings.password);
+      headers["Authorization"] = "Basic " + authBuf.toString("base64");
+    }
+
+    // Set content length header
+    if (settings.method === "GET" || settings.method === "HEAD") {
+      data = null;
+    } else if (data) {
+      headers["Content-Length"] = Buffer.isBuffer(data) ? data.length : Buffer.byteLength(data);
+
+      if (!headers["Content-Type"]) {
+        headers["Content-Type"] = "text/plain;charset=UTF-8";
+      }
+    } else if (settings.method === "POST") {
+      // For a post with no data set Content-Length: 0.
+      // This is required by buggy servers that don't meet the specs.
+      headers["Content-Length"] = 0;
+    }
+
+    var options = {
+      host: host,
+      port: port,
+      path: uri,
+      method: settings.method,
+      headers: headers,
+      agent: false
+    };
+
+    // Reset error flag
+    errorFlag = false;
+
+    // Handle async requests
+    if (settings.async) {
+      // Use the proper protocol
+      var doRequest = ssl ? https.request : http.request;
+
+      // Request is being sent, set send flag
+      sendFlag = true;
+
+      // As per spec, this is called here for historical reasons.
+      self.dispatchEvent("readystatechange");
+
+      // Handler for the response
+      function responseHandler(resp) {
+        // Set response var to the response we got back
+        // This is so it remains accessable outside this scope
+        response = resp;
+        // Check for redirect
+        // @TODO Prevent looped redirects
+        if (response.statusCode === 302 || response.statusCode === 303 || response.statusCode === 307) {
+          // Change URL to the redirect location
+          settings.url = response.headers.location;
+          var url = Url.parse(settings.url);
+          // Set host var in case it's used later
+          host = url.hostname;
+          // Options for the new request
+          var newOptions = {
+            hostname: url.hostname,
+            port: url.port,
+            path: url.path,
+            method: response.statusCode === 303 ? 'GET' : settings.method,
+            headers: headers
+          };
+
+          // Issue the new request
+          request = doRequest(newOptions, responseHandler).on('error', errorHandler);
+          request.end();
+          // @TODO Check if an XHR event needs to be fired here
+          return;
+        }
+
+        response.setEncoding("utf8");
+
+        setState(self.HEADERS_RECEIVED);
+        self.status = response.statusCode;
+
+        response.on('data', function(chunk) {
+          // Make sure there's some data
+          if (chunk) {
+            self.responseText += chunk;
+          }
+          // Don't emit state changes if the connection has been aborted.
+          if (sendFlag) {
+            setState(self.LOADING);
+          }
+        });
+
+        response.on('end', function() {
+          if (sendFlag) {
+            // Discard the 'end' event if the connection has been aborted
+            setState(self.DONE);
+            sendFlag = false;
+          }
+        });
+
+        response.on('error', function(error) {
+          self.handleError(error);
+        });
+      }
+
+      // Error handler for the request
+      function errorHandler(error) {
+        self.handleError(error);
+      }
+
+      // Create the request
+      request = doRequest(options, responseHandler).on('error', errorHandler);
+
+      // Node 0.4 and later won't accept empty data. Make sure it's needed.
+      if (data) {
+        request.write(data);
+      }
+
+      request.end();
+
+      self.dispatchEvent("loadstart");
+    } else { // Synchronous
+      // Create a temporary file for communication with the other Node process
+      var contentFile = ".node-xmlhttprequest-content-" + process.pid;
+      var syncFile = ".node-xmlhttprequest-sync-" + process.pid;
+      fs.writeFileSync(syncFile, "", "utf8");
+      // The async request the other Node process executes
+      var execString = "var http = require('http'), https = require('https'), fs = require('fs');"
+        + "var doRequest = http" + (ssl ? "s" : "") + ".request;"
+        + "var options = " + JSON.stringify(options) + ";"
+        + "var responseText = '';"
+        + "var req = doRequest(options, function(response) {"
+        + "response.setEncoding('utf8');"
+        + "response.on('data', function(chunk) {"
+        + "  responseText += chunk;"
+        + "});"
+        + "response.on('end', function() {"
+        + "fs.writeFileSync('" + contentFile + "', 'NODE-XMLHTTPREQUEST-STATUS:' + response.statusCode + ',' + responseText, 'utf8');"
+        + "fs.unlinkSync('" + syncFile + "');"
+        + "});"
+        + "response.on('error', function(error) {"
+        + "fs.writeFileSync('" + contentFile + "', 'NODE-XMLHTTPREQUEST-ERROR:' + JSON.stringify(error), 'utf8');"
+        + "fs.unlinkSync('" + syncFile + "');"
+        + "});"
+        + "}).on('error', function(error) {"
+        + "fs.writeFileSync('" + contentFile + "', 'NODE-XMLHTTPREQUEST-ERROR:' + JSON.stringify(error), 'utf8');"
+        + "fs.unlinkSync('" + syncFile + "');"
+        + "});"
+        + (data ? "req.write('" + data.replace(/'/g, "\\'") + "');":"")
+        + "req.end();";
+      // Start the other Node Process, executing this string
+      var syncProc = spawn(process.argv[0], ["-e", execString]);
+      var statusText;
+      while(fs.existsSync(syncFile)) {
+        // Wait while the sync file is empty
+      }
+      self.responseText = fs.readFileSync(contentFile, 'utf8');
+      // Kill the child process once the file has data
+      syncProc.stdin.end();
+      // Remove the temporary file
+      fs.unlinkSync(contentFile);
+      if (self.responseText.match(/^NODE-XMLHTTPREQUEST-ERROR:/)) {
+        // If the file returned an error, handle it
+        var errorObj = self.responseText.replace(/^NODE-XMLHTTPREQUEST-ERROR:/, "");
+        self.handleError(errorObj);
+      } else {
+        // If the file returned okay, parse its data and move to the DONE state
+        self.status = self.responseText.replace(/^NODE-XMLHTTPREQUEST-STATUS:([0-9]*),.*/, "$1");
+        self.responseText = self.responseText.replace(/^NODE-XMLHTTPREQUEST-STATUS:[0-9]*,(.*)/, "$1");
+        setState(self.DONE);
+      }
+    }
+  };
+
+  /**
+   * Called when an error is encountered to deal with it.
+   */
+  this.handleError = function(error) {
+    this.status = 503;
+    this.statusText = error;
+    this.responseText = error.stack;
+    errorFlag = true;
+    setState(this.DONE);
+  };
+
+  /**
+   * Aborts a request.
+   */
+  this.abort = function() {
+    if (request) {
+      request.abort();
+      request = null;
+    }
+
+    headers = defaultHeaders;
+    this.responseText = "";
+    this.responseXML = "";
+
+    errorFlag = true;
+
+    if (this.readyState !== this.UNSENT
+        && (this.readyState !== this.OPENED || sendFlag)
+        && this.readyState !== this.DONE) {
+      sendFlag = false;
+      setState(this.DONE);
+    }
+    this.readyState = this.UNSENT;
+  };
+
+  /**
+   * Adds an event listener. Preferred method of binding to events.
+   */
+  this.addEventListener = function(event, callback) {
+    if (!(event in listeners)) {
+      listeners[event] = [];
+    }
+    // Currently allows duplicate callbacks. Should it?
+    listeners[event].push(callback);
+  };
+
+  /**
+   * Remove an event callback that has already been bound.
+   * Only works on the matching funciton, cannot be a copy.
+   */
+  this.removeEventListener = function(event, callback) {
+    if (event in listeners) {
+      // Filter will return a new array with the callback removed
+      listeners[event] = listeners[event].filter(function(ev) {
+        return ev !== callback;
+      });
+    }
+  };
+
+  /**
+   * Dispatch any events, including both "on" methods and events attached using addEventListener.
+   */
+  this.dispatchEvent = function(event) {
+    if (typeof self["on" + event] === "function") {
+      self["on" + event]();
+    }
+    if (event in listeners) {
+      for (var i = 0, len = listeners[event].length; i < len; i++) {
+        listeners[event][i].call(self);
+      }
+    }
+  };
+
+  /**
+   * Changes readyState and calls onreadystatechange.
+   *
+   * @param int state New state
+   */
+  var setState = function(state) {
+    if (self.readyState !== state) {
+      self.readyState = state;
+
+      if (settings.async || self.readyState < self.OPENED || self.readyState === self.DONE) {
+        self.dispatchEvent("readystatechange");
+      }
+
+      if (self.readyState === self.DONE && !errorFlag) {
+        self.dispatchEvent("load");
+        // @TODO figure out InspectorInstrumentation::didLoadXHR(cookie)
+        self.dispatchEvent("loadend");
+      }
+    }
+  };
+};
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/package.json b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/package.json
new file mode 100644
index 0000000..82307d6
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/package.json
@@ -0,0 +1,38 @@
+{
+  "name": "xmlhttprequest",
+  "description": "XMLHttpRequest for Node",
+  "version": "1.6.0",
+  "author": {
+    "name": "Dan DeFelippi",
+    "url": "http://driverdan.com"
+  },
+  "keywords": [
+    "xhr",
+    "ajax"
+  ],
+  "licenses": [
+    {
+      "type": "MIT",
+      "url": "http://creativecommons.org/licenses/MIT/"
+    }
+  ],
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/driverdan/node-XMLHttpRequest.git"
+  },
+  "bugs": {
+    "url": "http://github.com/driverdan/node-XMLHttpRequest/issues"
+  },
+  "engines": {
+    "node": ">=0.4.0"
+  },
+  "directories": {
+    "lib": "./lib",
+    "example": "./example"
+  },
+  "main": "./lib/XMLHttpRequest.js",
+  "readme": "# node-XMLHttpRequest #\n\nnode-XMLHttpRequest is a wrapper for the built-in http client to emulate the\nbrowser XMLHttpRequest object.\n\nThis can be used with JS designed for browsers to improve reuse of code and\nallow the use of existing libraries.\n\nNote: This library currently conforms to [XMLHttpRequest 1](http://www.w3.org/TR/XMLHttpRequest/). Version 2.0 will target [XMLHttpRequest Level 2](http://www.w3.org/TR/XMLHttpRequest2/).\n\n## Usage ##\n\nHere's how to inc [...]
+  "readmeFilename": "README.md",
+  "_id": "xmlhttprequest at 1.6.0",
+  "_from": "xmlhttprequest@>=1.5.0"
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-constants.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-constants.js
new file mode 100644
index 0000000..372e46c
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-constants.js
@@ -0,0 +1,13 @@
+var sys = require("util")
+  , assert = require("assert")
+  , XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
+  , xhr = new XMLHttpRequest();
+
+// Test constant values
+assert.equal(0, xhr.UNSENT);
+assert.equal(1, xhr.OPENED);
+assert.equal(2, xhr.HEADERS_RECEIVED);
+assert.equal(3, xhr.LOADING);
+assert.equal(4, xhr.DONE);
+
+sys.puts("done");
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-events.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-events.js
new file mode 100644
index 0000000..c72f001
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-events.js
@@ -0,0 +1,50 @@
+var sys = require("util")
+  , assert = require("assert")
+  , http = require("http")
+  , XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
+  , xhr;
+
+// Test server
+var server = http.createServer(function (req, res) {
+  var body = (req.method != "HEAD" ? "Hello World" : "");
+
+  res.writeHead(200, {
+    "Content-Type": "text/plain",
+    "Content-Length": Buffer.byteLength(body)
+  });
+  // HEAD has no body
+  if (req.method != "HEAD") {
+    res.write(body);
+  }
+  res.end();
+  assert.equal(onreadystatechange, true);
+  assert.equal(readystatechange, true);
+  assert.equal(removed, true);
+  sys.puts("done");
+  this.close();
+}).listen(8000);
+
+xhr = new XMLHttpRequest();
+
+// Track event calls
+var onreadystatechange = false;
+var readystatechange = false;
+var removed = true;
+var removedEvent = function() {
+  removed = false;
+};
+
+xhr.onreadystatechange = function() {
+  onreadystatechange = true;
+};
+
+xhr.addEventListener("readystatechange", function() {
+  readystatechange = true;
+});
+
+// This isn't perfect, won't guarantee it was added in the first place
+xhr.addEventListener("readystatechange", removedEvent);
+xhr.removeEventListener("readystatechange", removedEvent);
+
+xhr.open("GET", "http://localhost:8000");
+xhr.send();
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-exceptions.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-exceptions.js
new file mode 100644
index 0000000..f1edd71
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-exceptions.js
@@ -0,0 +1,62 @@
+var sys = require("util")
+  , assert = require("assert")
+  , XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
+  , xhr = new XMLHttpRequest();
+
+// Test request methods that aren't allowed
+try {
+  xhr.open("TRACK", "http://localhost:8000/");
+  console.log("ERROR: TRACK should have thrown exception");
+} catch(e) {}
+try {
+  xhr.open("TRACE", "http://localhost:8000/");
+  console.log("ERROR: TRACE should have thrown exception");
+} catch(e) {}
+try {
+  xhr.open("CONNECT", "http://localhost:8000/");
+  console.log("ERROR: CONNECT should have thrown exception");
+} catch(e) {}
+// Test valid request method
+try {
+  xhr.open("GET", "http://localhost:8000/");
+} catch(e) {
+  console.log("ERROR: Invalid exception for GET", e);
+}
+
+// Test forbidden headers
+var forbiddenRequestHeaders = [
+  "accept-charset",
+  "accept-encoding",
+  "access-control-request-headers",
+  "access-control-request-method",
+  "connection",
+  "content-length",
+  "content-transfer-encoding",
+  "cookie",
+  "cookie2",
+  "date",
+  "expect",
+  "host",
+  "keep-alive",
+  "origin",
+  "referer",
+  "te",
+  "trailer",
+  "transfer-encoding",
+  "upgrade",
+  "user-agent",
+  "via"
+];
+
+for (var i in forbiddenRequestHeaders) {
+  try {
+    xhr.setRequestHeader(forbiddenRequestHeaders[i], "Test");
+    console.log("ERROR: " + forbiddenRequestHeaders[i] + " should have thrown exception");
+  } catch(e) {
+  }
+}
+
+// Try valid header
+xhr.setRequestHeader("X-Foobar", "Test");
+
+console.log("Done");
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-headers.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-headers.js
new file mode 100644
index 0000000..76454f1
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-headers.js
@@ -0,0 +1,76 @@
+var sys = require("util")
+  , assert = require("assert")
+  , XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
+  , xhr = new XMLHttpRequest()
+  , http = require("http");
+
+// Test server
+var server = http.createServer(function (req, res) {
+  // Test setRequestHeader
+  assert.equal("Foobar", req.headers["x-test"]);
+  // Test non-conforming allowed header
+  assert.equal("node-XMLHttpRequest-test", req.headers["user-agent"]);
+  // Test header set with blacklist disabled
+  assert.equal("http://github.com", req.headers["referer"]);
+
+  var body = "Hello World";
+  res.writeHead(200, {
+    "Content-Type": "text/plain",
+    "Content-Length": Buffer.byteLength(body),
+    // Set cookie headers to see if they're correctly suppressed
+    // Actual values don't matter
+    "Set-Cookie": "foo=bar",
+    "Set-Cookie2": "bar=baz",
+    "Date": "Thu, 30 Aug 2012 18:17:53 GMT",
+    "Connection": "close"
+  });
+  res.write("Hello World");
+  res.end();
+
+  this.close();
+}).listen(8000);
+
+xhr.onreadystatechange = function() {
+  if (this.readyState == 4) {
+    // Test getAllResponseHeaders()
+    var headers = "content-type: text/plain\r\ncontent-length: 11\r\ndate: Thu, 30 Aug 2012 18:17:53 GMT\r\nconnection: close";
+    assert.equal(headers, this.getAllResponseHeaders());
+
+    // Test case insensitivity
+    assert.equal('text/plain', this.getResponseHeader('Content-Type'));
+    assert.equal('text/plain', this.getResponseHeader('Content-type'));
+    assert.equal('text/plain', this.getResponseHeader('content-Type'));
+    assert.equal('text/plain', this.getResponseHeader('content-type'));
+
+    // Test aborted getAllResponseHeaders
+    this.abort();
+    assert.equal("", this.getAllResponseHeaders());
+    assert.equal(null, this.getResponseHeader("Connection"));
+
+    sys.puts("done");
+  }
+};
+
+assert.equal(null, xhr.getResponseHeader("Content-Type"));
+try {
+  xhr.open("GET", "http://localhost:8000/");
+  // Valid header
+  xhr.setRequestHeader("X-Test", "Foobar");
+  // Invalid header
+  xhr.setRequestHeader("Content-Length", 0);
+  // Allowed header outside of specs
+  xhr.setRequestHeader("user-agent", "node-XMLHttpRequest-test");
+  // Test getRequestHeader
+  assert.equal("Foobar", xhr.getRequestHeader("X-Test"));
+  // Test invalid header
+  assert.equal("", xhr.getRequestHeader("Content-Length"));
+
+  // Test allowing all headers
+  xhr.setDisableHeaderCheck(true);
+  xhr.setRequestHeader("Referer", "http://github.com");
+  assert.equal("http://github.com", xhr.getRequestHeader("Referer"));
+
+  xhr.send();
+} catch(e) {
+  console.log("ERROR: Exception raised", e);
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-redirect-302.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-redirect-302.js
new file mode 100644
index 0000000..d884f78
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-redirect-302.js
@@ -0,0 +1,41 @@
+var sys = require("util")
+  , assert = require("assert")
+  , XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
+  , xhr = new XMLHttpRequest()
+  , http = require("http");
+
+// Test server
+var server = http.createServer(function (req, res) {
+  if (req.url === '/redirectingResource') {
+    res.writeHead(302, {'Location': 'http://localhost:8000/'});
+    res.end();
+    return;
+  }
+
+  var body = "Hello World";
+  res.writeHead(200, {
+    "Content-Type": "text/plain",
+    "Content-Length": Buffer.byteLength(body),
+    "Date": "Thu, 30 Aug 2012 18:17:53 GMT",
+    "Connection": "close"
+  });
+  res.write("Hello World");
+  res.end();
+
+  this.close();
+}).listen(8000);
+
+xhr.onreadystatechange = function() {
+  if (this.readyState == 4) {
+    assert.equal(xhr.getRequestHeader('Location'), '');
+    assert.equal(xhr.responseText, "Hello World");
+    sys.puts("done");
+  }
+};
+
+try {
+  xhr.open("GET", "http://localhost:8000/redirectingResource");
+  xhr.send();
+} catch(e) {
+  console.log("ERROR: Exception raised", e);
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-redirect-303.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-redirect-303.js
new file mode 100644
index 0000000..60d9343
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-redirect-303.js
@@ -0,0 +1,41 @@
+var sys = require("util")
+  , assert = require("assert")
+  , XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
+  , xhr = new XMLHttpRequest()
+  , http = require("http");
+
+// Test server
+var server = http.createServer(function (req, res) {
+  if (req.url === '/redirectingResource') {
+    res.writeHead(303, {'Location': 'http://localhost:8000/'});
+    res.end();
+    return;
+  }
+
+  var body = "Hello World";
+  res.writeHead(200, {
+    "Content-Type": "text/plain",
+    "Content-Length": Buffer.byteLength(body),
+    "Date": "Thu, 30 Aug 2012 18:17:53 GMT",
+    "Connection": "close"
+  });
+  res.write("Hello World");
+  res.end();
+
+  this.close();
+}).listen(8000);
+
+xhr.onreadystatechange = function() {
+  if (this.readyState == 4) {
+    assert.equal(xhr.getRequestHeader('Location'), '');
+    assert.equal(xhr.responseText, "Hello World");
+    sys.puts("done");
+  }
+};
+
+try {
+  xhr.open("POST", "http://localhost:8000/redirectingResource");
+  xhr.send();
+} catch(e) {
+  console.log("ERROR: Exception raised", e);
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-redirect-307.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-redirect-307.js
new file mode 100644
index 0000000..3abc906
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-redirect-307.js
@@ -0,0 +1,43 @@
+var sys = require("util")
+  , assert = require("assert")
+  , XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
+  , xhr = new XMLHttpRequest()
+  , http = require("http");
+
+// Test server
+var server = http.createServer(function (req, res) {
+  if (req.url === '/redirectingResource') {
+    res.writeHead(307, {'Location': 'http://localhost:8000/'});
+    res.end();
+    return;
+  }
+
+  assert.equal(req.method, 'POST');
+
+  var body = "Hello World";
+  res.writeHead(200, {
+    "Content-Type": "text/plain",
+    "Content-Length": Buffer.byteLength(body),
+    "Date": "Thu, 30 Aug 2012 18:17:53 GMT",
+    "Connection": "close"
+  });
+  res.write("Hello World");
+  res.end();
+
+  this.close();
+}).listen(8000);
+
+xhr.onreadystatechange = function() {
+  if (this.readyState == 4) {
+    assert.equal(xhr.getRequestHeader('Location'), '');
+    assert.equal(xhr.responseText, "Hello World");
+    sys.puts("done");
+  }
+};
+
+try {
+  xhr.open("POST", "http://localhost:8000/redirectingResource");
+  xhr.send();
+} catch(e) {
+  console.log("ERROR: Exception raised", e);
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-request-methods.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-request-methods.js
new file mode 100644
index 0000000..fa1b1be
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-request-methods.js
@@ -0,0 +1,62 @@
+var sys = require("util")
+  , assert = require("assert")
+  , XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
+  , http = require("http")
+  , xhr;
+
+// Test server
+var server = http.createServer(function (req, res) {
+  // Check request method and URL
+  assert.equal(methods[curMethod], req.method);
+  assert.equal("/" + methods[curMethod], req.url);
+
+  var body = (req.method != "HEAD" ? "Hello World" : "");
+
+  res.writeHead(200, {
+    "Content-Type": "text/plain",
+    "Content-Length": Buffer.byteLength(body)
+  });
+  // HEAD has no body
+  if (req.method != "HEAD") {
+    res.write(body);
+  }
+  res.end();
+
+  if (curMethod == methods.length - 1) {
+    this.close();
+    sys.puts("done");
+  }
+}).listen(8000);
+
+// Test standard methods
+var methods = ["GET", "POST", "HEAD", "PUT", "DELETE"];
+var curMethod = 0;
+
+function start(method) {
+  // Reset each time
+  xhr = new XMLHttpRequest();
+
+  xhr.onreadystatechange = function() {
+    if (this.readyState == 4) {
+      if (method == "HEAD") {
+        assert.equal("", this.responseText);
+      } else {
+        assert.equal("Hello World", this.responseText);
+      }
+
+      curMethod++;
+
+      if (curMethod < methods.length) {
+        sys.puts("Testing " + methods[curMethod]);
+        start(methods[curMethod]);
+      }
+    }
+  };
+
+  var url = "http://localhost:8000/" + method;
+  xhr.open(method, url);
+  xhr.send();
+}
+
+sys.puts("Testing " + methods[curMethod]);
+start(methods[curMethod]);
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-request-protocols.js b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-request-protocols.js
new file mode 100644
index 0000000..cd4e174
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/test-request-protocols.js
@@ -0,0 +1,34 @@
+var sys = require("util")
+  , assert = require("assert")
+  , XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
+  , xhr;
+
+xhr = new XMLHttpRequest();
+
+xhr.onreadystatechange = function() {
+  if (this.readyState == 4) {
+    assert.equal("Hello World", this.responseText);
+    this.close();
+    runSync();
+  }
+};
+
+// Async
+var url = "file://" + __dirname + "/testdata.txt";
+xhr.open("GET", url);
+xhr.send();
+
+// Sync
+var runSync = function() {
+  xhr = new XMLHttpRequest();
+
+  xhr.onreadystatechange = function() {
+    if (this.readyState == 4) {
+      assert.equal("Hello World", this.responseText);
+      this.close();
+      sys.puts("done");
+    }
+  };
+  xhr.open("GET", url, false);
+  xhr.send();
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/testdata.txt b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/testdata.txt
new file mode 100644
index 0000000..557db03
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/node_modules/xmlhttprequest/tests/testdata.txt
@@ -0,0 +1 @@
+Hello World
diff --git a/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/package.json b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/package.json
new file mode 100644
index 0000000..b65e919
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/node_modules/jsdom/package.json
@@ -0,0 +1,210 @@
+{
+  "name": "jsdom",
+  "version": "0.8.8",
+  "description": "A JavaScript implementation of the W3C DOM",
+  "keywords": [
+    "dom",
+    "w3c",
+    "html"
+  ],
+  "maintainers": [
+    {
+      "name": "Elijah Insua",
+      "email": "tmpvar at gmail.com",
+      "url": "http://tmpvar.com"
+    },
+    {
+      "name": "Domenic Denicola",
+      "url": "http://domenicdenicola.com"
+    }
+  ],
+  "contributors": [
+    {
+      "name": "Vincent Greene",
+      "email": "ulteriorlife at gmail.com"
+    },
+    {
+      "name": "Dav Glass",
+      "email": "davglass at gmail.com"
+    },
+    {
+      "name": "Felix Gnass",
+      "email": "fgnass at gmail.com"
+    },
+    {
+      "name": "Charlie Robbins",
+      "email": "charlie.robbins at gmail.com"
+    },
+    {
+      "name": "Aria Stewart",
+      "email": "aredridel at nbtsc.org"
+    },
+    {
+      "name": "Matthew",
+      "email": "N.A.",
+      "url": "http://github.com/matthewpflueger/"
+    },
+    {
+      "name": "Olivier El Mekki",
+      "email": "unknown",
+      "url": "http://blog.olivier-elmekki.com/"
+    },
+    {
+      "name": "Shimon Dookdin",
+      "email": "helpmepro1 at gmail.com"
+    },
+    {
+      "name": "Daniel Cassidy",
+      "email": "mail at danielcassidy.me.uk",
+      "url": "http://www.danielcassidy.me.uk/"
+    },
+    {
+      "name": "Sam Ruby",
+      "url": "http://intertwingly.net/blog/"
+    },
+    {
+      "name": "hij1nx",
+      "url": "http://github.com/hij1nx"
+    },
+    {
+      "name": "Yonathan Randolph",
+      "url": "http://github.com/yonran"
+    },
+    {
+      "name": "Martin Davis",
+      "url": "http://github.com/waslogic"
+    },
+    {
+      "name": "Andreas Lind Petersen",
+      "email": "andreas at one.com"
+    },
+    {
+      "name": "d-ash",
+      "url": "http://github.com/d-ash"
+    },
+    {
+      "name": "Robin Zhong",
+      "email": "fbzhong at gmail.com"
+    },
+    {
+      "name": "Alexander Flatter",
+      "email": "flatter at gmail.com"
+    },
+    {
+      "name": "Heng Liu",
+      "email": "liucougar at gmail.com"
+    },
+    {
+      "name": "Brian McDaniel",
+      "url": "http://github.com/brianmcd"
+    },
+    {
+      "name": "John Hurliman",
+      "email": "jhurliman at jhurliman.org"
+    },
+    {
+      "name": "Jimmy Mabey"
+    },
+    {
+      "name": "Gregory Tomlinson"
+    },
+    {
+      "name": "Jason Davies",
+      "url": "http://www.jasondavies.com/"
+    },
+    {
+      "name": "Josh Marshall",
+      "url": "http://www.ponderingtheobvious.com/"
+    },
+    {
+      "name": "Jason Priestley",
+      "url": "https://github.com/jhp"
+    },
+    {
+      "name": "Derek Lindahl",
+      "url": "https://github.com/dlindahl"
+    },
+    {
+      "name": "Chris Roebuck",
+      "email": "chris at quillu.com",
+      "url": "http://www.quillu.com"
+    },
+    {
+      "name": "Avi Deitcher",
+      "url": "https://github.com/deitch"
+    },
+    {
+      "name": "Nao Iizuka",
+      "email": "iizuka at kyu-mu.net",
+      "url": "https://github.com/iizukanao"
+    },
+    {
+      "name": "Peter Perenyi",
+      "url": "https://github.com/sinegar"
+    },
+    {
+      "name": "Tiago Rodrigues",
+      "email": "tmcrodrigues at gmail.com",
+      "url": "http://trodrigues.net"
+    },
+    {
+      "name": "Samori Gorse",
+      "email": "samorigorse at gmail.com",
+      "url": "http://github.com/shinuza"
+    },
+    {
+      "name": "John Roberts",
+      "email": "jroberts at logitech.com"
+    },
+    {
+      "name": "Chad Walker",
+      "email": "chad at chad-cat-lore-eddie.com",
+      "url": "https://github.com/chad3814"
+    },
+    {
+      "name": "Zach Smith",
+      "email": "x.coder.zach at gmail.com",
+      "url": "https://github.com/xcoderzach"
+    }
+  ],
+  "bugs": {
+    "url": "http://github.com/tmpvar/jsdom/issues",
+    "email": "tmpvar at gmail.com"
+  },
+  "license": {
+    "type": "MIT",
+    "url": "http://github.com/tmpvar/jsdom/blob/master/LICENSE.txt"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/tmpvar/jsdom.git"
+  },
+  "implements": [
+    "http://www.w3.org/TR/REC-DOM-Level-1"
+  ],
+  "dependencies": {
+    "htmlparser2": ">= 3.1.5 <4",
+    "nwmatcher": "~1.3.1",
+    "request": "2.x",
+    "xmlhttprequest": ">=1.5.0",
+    "cssom": "~0.2.5",
+    "cssstyle": "~0.2.3",
+    "contextify": "~0.1.5"
+  },
+  "devDependencies": {
+    "nodeunit": "~0.8.0",
+    "optimist": "*",
+    "urlmaster": ">=0.2.15"
+  },
+  "directories": {
+    "lib": "./lib/jsdom"
+  },
+  "scripts": {
+    "test": "node ./test/runner"
+  },
+  "main": "./lib/jsdom",
+  "readme": "# jsdom\n\nA JavaScript implementation of the W3C DOM.\n\n## Install\n\n```bash\n$ npm install jsdom\n```\n\nIf this gives you trouble with errors about installing Contextify, especially on Windows, see [below](#contextify).\n\n## Human contact\n\nsee: [mailing list](http://groups.google.com/group/jsdom)\n\n## Easymode\n\nBootstrapping a DOM is generally a difficult process involving many error prone steps. We didn't want jsdom to fall into the same trap and that is why a ne [...]
+  "readmeFilename": "README.md",
+  "_id": "jsdom at 0.8.8",
+  "_from": "jsdom@>=0.2.0"
+}
diff --git a/debian/node_modules/bones/node_modules/jquery/package.json b/debian/node_modules/bones/node_modules/jquery/package.json
new file mode 100644
index 0000000..dcc9ad2
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/jquery/package.json
@@ -0,0 +1,25 @@
+{
+  "name": "jquery",
+  "description": "jQuery: The Write Less, Do More, JavaScript Library (packaged for Node.JS)",
+  "url": "http://jquery.com",
+  "keywords": [
+    "util",
+    "dom",
+    "jquery"
+  ],
+  "author": {
+    "name": "John Resig",
+    "email": "jeresig at gmail.com"
+  },
+  "contributors": [],
+  "dependencies": {
+    "jsdom": ">=0.2.0",
+    "htmlparser": ">= 1.7.3"
+  },
+  "lib": ".",
+  "main": "./node-jquery.js",
+  "version": "1.6.3",
+  "readme": "ERROR: No README data found!",
+  "_id": "jquery at 1.6.3",
+  "_from": "jquery@~1.6.3"
+}
diff --git a/debian/node_modules/bones/node_modules/mirror/LICENSE.md b/debian/node_modules/bones/node_modules/mirror/LICENSE.md
new file mode 100644
index 0000000..6f2785b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/mirror/LICENSE.md
@@ -0,0 +1,25 @@
+Copyright (c), Development Seed  
+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 "Development Seed" 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 HOLDER 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.
diff --git a/debian/node_modules/bones/node_modules/mirror/README.md b/debian/node_modules/bones/node_modules/mirror/README.md
new file mode 100644
index 0000000..80682a0
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/mirror/README.md
@@ -0,0 +1,54 @@
+# Mirror
+
+Aggregates JavaScript, CSS and any other text files for serving them to browsers with [express](http://expressjs.com/). Supports wrapping and postprocessing outputs. A *mirror* can contain files, plain source code or other mirrors.
+
+### Usage
+
+```javascript
+var mirror = require('mirror');
+
+// Mirror guesses the MIME type based on the first file's extension.
+var styles = new mirror([
+    __dirname + '/assets/main.css',
+    __dirname + '/assets/layout.css'
+]);
+
+// Proving direct source input requires specifying the MIME type manually.
+var configuration = new mirror([
+    // Mirror automatically inserts line breaks and semicolons before/after
+    // each item in a "js" type mirror.
+    mirror('var basepath = "/"'),
+    mirror('var config = ' + JSON.stringify(config)),
+
+    // You can add functions to the mirror. They will be called on each request.
+    mirror(function(callback, req, res) {
+        callback(null, 'var url = ' + JSON.stringify(req.url));
+    })
+], {
+    type: 'js',
+    maxAge: 60  // Only cache configuration file for 60 seconds.
+});
+
+// Store the array of files and remove or add files on-the-fly.
+var files = [
+    require.resolve('underscore'),
+    require.resolve('backbone'),
+    require.resolve('mymodule/client.js'),
+
+    // Add other mirrors
+    configuration
+];
+
+// Add the mirrors to your express server.
+app.get('/assets/style.css', styles);
+app.get('/assets/configuration.json', configuration);
+app.get('/assets/scripts.js', new mirror(files, { minify: true }));
+```
+
+**NOTE:** Mirror loads the requested files from disk for every request. It is meant to run behind a reverse proxy that caches. You can control the cache time with `maxAge` (in seconds) in the options hash.
+
+### Authors
+
+- [Young Hahn](https://github.com/yhahn)
+- [Konstantin Käfer](https://github.com/kkaefer)
+
diff --git a/debian/node_modules/bones/node_modules/mirror/mirror.js b/debian/node_modules/bones/node_modules/mirror/mirror.js
new file mode 100644
index 0000000..d35d3b8
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/mirror/mirror.js
@@ -0,0 +1,165 @@
+var env = process.env.NODE_ENV || 'development';
+
+var fs = require('fs');
+var path = require('path');
+var uglify = require('uglify-js');
+
+module.exports = exports = Mirror;
+function Mirror(assets, options) {
+    if (!Array.isArray(assets)) {
+        if (this instanceof Mirror) {
+            throw new Error('First parameter must be an array.');
+        } else return {
+            content: assets,
+            filename: options || null
+        };
+    }
+
+    // Make `instanceof Mirror` work and allow recursive embedding.
+    assets.__proto__ = this;
+
+    if (!options) options = {};
+
+    // Content-Type
+    if (!options.type) {
+        if (assets.length && !assets[0].join) {
+            options.type = path.extname(assets[0]).toLowerCase();
+        } else {
+            options.type = '.txt';
+        }
+    } else if (options.type[0] !== '.') {
+        options.type = '.' + options.type.toLowerCase();
+    }
+
+    // Cache-Control
+    if (!('maxAge' in options)) options.maxAge = Mirror.defaults.maxAge; // 2 weeks
+
+    // Separator
+    if (!('separator' in options)) options.separator = Mirror.defaults.separator;
+
+    // Minify
+    if (!('minify' in options)) options.minify = Mirror.defaults.minify;
+
+    // Setup header fields
+    if (!options.headers) options.headers = {};
+    if (!('Content-Type' in options.headers)) {
+        options.headers['Content-Type'] = Mirror.headers[options.type] || 'text/plain';
+    }
+    if (!('Cache-Control' in options.headers)) {
+        options.headers['Cache-Control'] = 'max-age=' + options.maxAge;
+    }
+
+    this.assets = assets;
+    this.options = options;
+    this.handler = this.handler.bind(this);
+    this.content = this.content.bind(this);
+
+    return assets;
+};
+
+// Make `instanceof Array` work on return values.
+Mirror.prototype.__proto__ = Array.prototype;
+
+Mirror.defaults = {
+    maxAge: env === 'production' ? 1209600 : 0,
+    separator: '\n',
+    minify: env === 'production'
+};
+
+Mirror.headers = {
+    '.js': 'application/javascript',
+    '.json': 'application/json',
+    '.css': 'text/css'
+};
+
+Mirror.wrappers = {
+    '.js': function(content, filename, options) {
+        return '\n;' + content + '\n;';
+    }
+};
+
+Mirror.processors = {
+    '.js': function(content, options) {
+        if (options.minify) {
+            var ast = uglify.parser.parse(content);
+            ast = uglify.uglify.ast_mangle(ast);
+            ast = uglify.uglify.ast_squeeze(ast);
+            return uglify.uglify.gen_code(ast);
+        } else {
+            return content;
+        }
+    }
+};
+
+// Allow adding the files "array" as a express callback directly. This is a
+// shortcut that only works with express because it calls files.call().
+// In new code, use files.handler instead.
+Mirror.prototype.call = function(_, req, res, next) {
+    return this.handler(req, res, next);
+};
+
+Mirror.prototype.handler = function(req, res, next) {
+    this.content(function(err, data) {
+        if (err) return next(err);
+
+        if (Mirror.processors[this.options.type]) {
+            data = Mirror.processors[this.options.type](data, this.options);
+        }
+
+        res.send(data, this.options.headers);
+    }.bind(this), req, res);
+};
+
+function filename(obj) {
+    return typeof obj === 'string' ? obj : obj.filename || null;
+}
+
+Mirror.prototype.content = function(callback, req, res) {
+    if (this.options.sort) this.options.sort(this.assets);
+    if (!this.assets.length) return callback(null, '');
+
+    var result = [];
+    var pending = this.assets.length;
+    var cancelled = false;
+
+    var done = function() {
+        cancelled = true;
+        if (this.options.wrapper) for (var i = 0; i < result.length; i++) {
+            result[i] = this.options.wrapper(result[i],
+                    filename(this.assets[i]), this.options);
+        }
+        if (Mirror.wrappers[this.options.type]) for (var i = 0; i < result.length; i++) {
+            result[i] = Mirror.wrappers[this.options.type](result[i],
+                    filename(this.assets[i]), this.options);
+        }
+        callback(null, result.join(this.options.separator));
+    }.bind(this);
+
+    this.assets.forEach(function(asset, i) {
+        if (typeof asset.content === 'function') {
+            asset.content(loaded, req, res);
+        } else if (typeof asset.content !== 'undefined') {
+            loaded(null, '' + asset.content);
+        } else {
+            fs.readFile(asset, 'utf8', loaded);
+        }
+
+        function loaded(err, data) {
+            if (cancelled) { return; }
+            if (err) { cancelled = true; return callback(err); }
+            result[i] = data;
+            if (!--pending) done();
+        }
+    });
+};
+
+// Compatibility to 0.2
+Mirror.assets = function(assets, options) {
+    if (!Array.isArray(assets)) assets = [ assets ];
+    return new Mirror(assets, options);
+};
+
+Mirror.source = function(sources, options) {
+    if (!Array.isArray(sources)) sources = [ sources ];
+    return new Mirror(sources, options);
+};
diff --git a/debian/node_modules/bones/node_modules/mirror/node_modules/.bin/uglifyjs b/debian/node_modules/bones/node_modules/mirror/node_modules/.bin/uglifyjs
new file mode 120000
index 0000000..1039860
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/mirror/node_modules/.bin/uglifyjs
@@ -0,0 +1 @@
+tilemill-0.10.1/../uglify-js/bin/uglifyjs
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/.npmignore b/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/.npmignore
new file mode 100644
index 0000000..d97eaa0
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/.npmignore
@@ -0,0 +1,4 @@
+.DS_Store
+.tmp*~
+*.local.*
+.pinf-*
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/README.html b/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/README.html
new file mode 100644
index 0000000..c6cfc27
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/README.html
@@ -0,0 +1,825 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+               "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+lang="en" xml:lang="en">
+<head>
+<title>UglifyJS -- a JavaScript parser/compressor/beautifier</title>
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+<meta name="generator" content="Org-mode"/>
+<meta name="generated" content="2011-04-04 00:07:13 EEST"/>
+<meta name="author" content="Mihai Bazon"/>
+<meta name="description" content="a JavaScript parser/compressor/beautifier in JavaScript"/>
+<meta name="keywords" content="javascript, js, parser, compiler, compressor, mangle, minify, minifier"/>
+<style type="text/css">
+ <!--/*--><![CDATA[/*><!--*/
+  html { font-family: Times, serif; font-size: 12pt; }
+  .title  { text-align: center; }
+  .todo   { color: red; }
+  .done   { color: green; }
+  .tag    { background-color: #add8e6; font-weight:normal }
+  .target { }
+  .timestamp { color: #bebebe; }
+  .timestamp-kwd { color: #5f9ea0; }
+  p.verse { margin-left: 3% }
+  pre {
+	border: 1pt solid #AEBDCC;
+	background-color: #F3F5F7;
+	padding: 5pt;
+	font-family: courier, monospace;
+        font-size: 90%;
+        overflow:auto;
+  }
+  table { border-collapse: collapse; }
+  td, th { vertical-align: top; }
+  dt { font-weight: bold; }
+  div.figure { padding: 0.5em; }
+  div.figure p { text-align: center; }
+  textarea { overflow-x: auto; }
+  .linenr { font-size:smaller }
+  .code-highlighted {background-color:#ffff00;}
+  .org-info-js_info-navigation { border-style:none; }
+  #org-info-js_console-label { font-size:10px; font-weight:bold;
+                               white-space:nowrap; }
+  .org-info-js_search-highlight {background-color:#ffff00; color:#000000;
+                                 font-weight:bold; }
+  /*]]>*/-->
+</style>
+<link rel="stylesheet" type="text/css" href="docstyle.css" />
+<script type="text/javascript">
+<!--/*--><![CDATA[/*><!--*/
+ function CodeHighlightOn(elem, id)
+ {
+   var target = document.getElementById(id);
+   if(null != target) {
+     elem.cacheClassElem = elem.className;
+     elem.cacheClassTarget = target.className;
+     target.className = "code-highlighted";
+     elem.className   = "code-highlighted";
+   }
+ }
+ function CodeHighlightOff(elem, id)
+ {
+   var target = document.getElementById(id);
+   if(elem.cacheClassElem)
+     elem.className = elem.cacheClassElem;
+   if(elem.cacheClassTarget)
+     target.className = elem.cacheClassTarget;
+ }
+/*]]>*///-->
+</script>
+
+</head>
+<body>
+<div id="content">
+
+<h1 class="title">UglifyJS – a JavaScript parser/compressor/beautifier</h1>
+
+
+<div id="table-of-contents">
+<h2>Table of Contents</h2>
+<div id="text-table-of-contents">
+<ul>
+<li><a href="#sec-1">1 UglifyJS — a JavaScript parser/compressor/beautifier </a>
+<ul>
+<li><a href="#sec-1_1">1.1 Unsafe transformations </a>
+<ul>
+<li><a href="#sec-1_1_1">1.1.1 Calls involving the global Array constructor </a></li>
+</ul>
+</li>
+<li><a href="#sec-1_2">1.2 Install (NPM) </a></li>
+<li><a href="#sec-1_3">1.3 Install latest code from GitHub </a></li>
+<li><a href="#sec-1_4">1.4 Usage </a>
+<ul>
+<li><a href="#sec-1_4_1">1.4.1 API </a></li>
+<li><a href="#sec-1_4_2">1.4.2 Beautifier shortcoming – no more comments </a></li>
+</ul>
+</li>
+<li><a href="#sec-1_5">1.5 Compression – how good is it? </a></li>
+<li><a href="#sec-1_6">1.6 Bugs? </a></li>
+<li><a href="#sec-1_7">1.7 Links </a></li>
+<li><a href="#sec-1_8">1.8 License </a></li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+
+<div id="outline-container-1" class="outline-2">
+<h2 id="sec-1"><span class="section-number-2">1</span> UglifyJS — a JavaScript parser/compressor/beautifier </h2>
+<div class="outline-text-2" id="text-1">
+
+
+<p>
+This package implements a general-purpose JavaScript
+parser/compressor/beautifier toolkit.  It is developed on <a href="http://nodejs.org/">NodeJS</a>, but it
+should work on any JavaScript platform supporting the CommonJS module system
+(and if your platform of choice doesn't support CommonJS, you can easily
+implement it, or discard the <code>exports.*</code> lines from UglifyJS sources).
+</p>
+<p>
+The tokenizer/parser generates an abstract syntax tree from JS code.  You
+can then traverse the AST to learn more about the code, or do various
+manipulations on it.  This part is implemented in <a href="../lib/parse-js.js">parse-js.js</a> and it's a
+port to JavaScript of the excellent <a href="http://marijn.haverbeke.nl/parse-js/">parse-js</a> Common Lisp library from <a href="http://marijn.haverbeke.nl/">Marijn Haverbeke</a>.
+</p>
+<p>
+( See <a href="http://github.com/mishoo/cl-uglify-js">cl-uglify-js</a> if you're looking for the Common Lisp version of
+UglifyJS. )
+</p>
+<p>
+The second part of this package, implemented in <a href="../lib/process.js">process.js</a>, inspects and
+manipulates the AST generated by the parser to provide the following:
+</p>
+<ul>
+<li>
+ability to re-generate JavaScript code from the AST.  Optionally
+indented—you can use this if you want to “beautify” a program that has
+been compressed, so that you can inspect the source.  But you can also run
+our code generator to print out an AST without any whitespace, so you
+achieve compression as well.
+
+</li>
+<li>
+shorten variable names (usually to single characters).  Our mangler will
+analyze the code and generate proper variable names, depending on scope
+and usage, and is smart enough to deal with globals defined elsewhere, or
+with <code>eval()</code> calls or <code>with{}</code> statements.  In short, if <code>eval()</code> or
+<code>with{}</code> are used in some scope, then all variables in that scope and any
+variables in the parent scopes will remain unmangled, and any references
+to such variables remain unmangled as well.
+
+</li>
+<li>
+various small optimizations that may lead to faster code but certainly
+lead to smaller code.  Where possible, we do the following:
+
+<ul>
+<li>
+foo["bar"]  ==>  foo.bar
+
+</li>
+<li>
+remove block brackets <code>{}</code>
+
+</li>
+<li>
+join consecutive var declarations:
+var a = 10; var b = 20; ==> var a=10,b=20;
+
+</li>
+<li>
+resolve simple constant expressions: 1 +2 * 3 ==> 7.  We only do the
+replacement if the result occupies less bytes; for example 1/3 would
+translate to 0.333333333333, so in this case we don't replace it.
+
+</li>
+<li>
+consecutive statements in blocks are merged into a sequence; in many
+cases, this leaves blocks with a single statement, so then we can remove
+the block brackets.
+
+</li>
+<li>
+various optimizations for IF statements:
+
+<ul>
+<li>
+if (foo) bar(); else baz(); ==> foo?bar():baz();
+</li>
+<li>
+if (!foo) bar(); else baz(); ==> foo?baz():bar();
+</li>
+<li>
+if (foo) bar(); ==> foo&&bar();
+</li>
+<li>
+if (!foo) bar(); ==> foo||bar();
+</li>
+<li>
+if (foo) return bar(); else return baz(); ==> return foo?bar():baz();
+</li>
+<li>
+if (foo) return bar(); else something(); ==> {if(foo)return bar();something()}
+
+</li>
+</ul>
+</li>
+<li>
+remove some unreachable code and warn about it (code that follows a
+<code>return</code>, <code>throw</code>, <code>break</code> or <code>continue</code> statement, except
+function/variable declarations).
+</li>
+</ul>
+</li>
+</ul>
+
+
+
+</div>
+
+<div id="outline-container-1_1" class="outline-3">
+<h3 id="sec-1_1"><span class="section-number-3">1.1</span> <span class="target">Unsafe transformations</span>  </h3>
+<div class="outline-text-3" id="text-1_1">
+
+
+<p>
+UglifyJS tries its best to achieve great compression while leaving the
+semantics of the code intact.  In general, if your code logic is broken by
+UglifyJS then it's a bug in UglifyJS and you should report it and I should
+fix it. :-)
+</p>
+<p>
+However, I opted to include the following potentially unsafe transformations
+as default behavior.  Discussion is welcome, if you have ideas of how to
+handle this better, or any objections to these optimizations, please let me
+know.
+</p>
+
+</div>
+
+<div id="outline-container-1_1_1" class="outline-4">
+<h4 id="sec-1_1_1"><span class="section-number-4">1.1.1</span> Calls involving the global Array constructor </h4>
+<div class="outline-text-4" id="text-1_1_1">
+
+
+<p>
+The following transformations occur:
+</p>
+
+
+
+<pre class="src src-js"><span style="color: #a020f0;">new</span> <span style="color: #228b22;">Array</span>(1, 2, 3, 4)  => [1,2,3,4]
+Array(a, b, c)         => [a,b,c]
+<span style="color: #a020f0;">new</span> <span style="color: #228b22;">Array</span>(5)           => Array(5)
+<span style="color: #a020f0;">new</span> <span style="color: #228b22;">Array</span>(a)           => Array(a)
+</pre>
+
+
+
+<p>
+These are all safe if the Array name isn't redefined.  JavaScript does allow
+one to globally redefine Array (and pretty much everything, in fact) but I
+personally don't see why would anyone do that.
+</p>
+<p>
+UglifyJS does handle the case where Array is redefined locally, or even
+globally but with a <code>function</code> or <code>var</code> declaration.  Therefore, in the
+following cases UglifyJS <b>doesn't touch</b> calls or instantiations of Array:
+</p>
+
+
+
+<pre class="src src-js"><span style="color: #b22222;">// </span><span style="color: #b22222;">case 1.  globally declared variable
+</span>  <span style="color: #a020f0;">var</span> <span style="color: #b8860b;">Array</span>;
+  <span style="color: #a020f0;">new</span> <span style="color: #228b22;">Array</span>(1, 2, 3);
+  Array(a, b);
+
+  <span style="color: #b22222;">// </span><span style="color: #b22222;">or (can be declared later)
+</span>  <span style="color: #a020f0;">new</span> <span style="color: #228b22;">Array</span>(1, 2, 3);
+  <span style="color: #a020f0;">var</span> <span style="color: #b8860b;">Array</span>;
+
+  <span style="color: #b22222;">// </span><span style="color: #b22222;">or (can be a function)
+</span>  <span style="color: #a020f0;">new</span> <span style="color: #228b22;">Array</span>(1, 2, 3);
+  <span style="color: #a020f0;">function</span> <span style="color: #0000ff;">Array</span>() { ... }
+
+<span style="color: #b22222;">// </span><span style="color: #b22222;">case 2.  declared in a function
+</span>  (<span style="color: #a020f0;">function</span>(){
+    a = <span style="color: #a020f0;">new</span> <span style="color: #228b22;">Array</span>(1, 2, 3);
+    b = Array(5, 6);
+    <span style="color: #a020f0;">var</span> <span style="color: #b8860b;">Array</span>;
+  })();
+
+  <span style="color: #b22222;">// </span><span style="color: #b22222;">or
+</span>  (<span style="color: #a020f0;">function</span>(<span style="color: #b8860b;">Array</span>){
+    <span style="color: #a020f0;">return</span> Array(5, 6, 7);
+  })();
+
+  <span style="color: #b22222;">// </span><span style="color: #b22222;">or
+</span>  (<span style="color: #a020f0;">function</span>(){
+    <span style="color: #a020f0;">return</span> <span style="color: #a020f0;">new</span> <span style="color: #228b22;">Array</span>(1, 2, 3, 4);
+    <span style="color: #a020f0;">function</span> <span style="color: #0000ff;">Array</span>() { ... }
+  })();
+
+  <span style="color: #b22222;">// </span><span style="color: #b22222;">etc.
+</span></pre>
+
+
+
+</div>
+</div>
+
+</div>
+
+<div id="outline-container-1_2" class="outline-3">
+<h3 id="sec-1_2"><span class="section-number-3">1.2</span> Install (NPM) </h3>
+<div class="outline-text-3" id="text-1_2">
+
+
+<p>
+UglifyJS is now available through NPM — <code>npm install uglify-js</code> should do
+the job.
+</p>
+</div>
+
+</div>
+
+<div id="outline-container-1_3" class="outline-3">
+<h3 id="sec-1_3"><span class="section-number-3">1.3</span> Install latest code from GitHub </h3>
+<div class="outline-text-3" id="text-1_3">
+
+
+
+
+
+<pre class="src src-sh"><span style="color: #b22222;">## </span><span style="color: #b22222;">clone the repository
+</span>mkdir -p /where/you/wanna/put/it
+<span style="color: #da70d6;">cd</span> /where/you/wanna/put/it
+git clone git://github.com/mishoo/UglifyJS.git
+
+<span style="color: #b22222;">## </span><span style="color: #b22222;">make the module available to Node
+</span>mkdir -p ~/.node_libraries/
+<span style="color: #da70d6;">cd</span> ~/.node_libraries/
+ln -s /where/you/wanna/put/it/UglifyJS/uglify-js.js
+
+<span style="color: #b22222;">## </span><span style="color: #b22222;">and if you want the CLI script too:
+</span>mkdir -p ~/bin
+<span style="color: #da70d6;">cd</span> ~/bin
+ln -s /where/you/wanna/put/it/UglifyJS/bin/uglifyjs
+  <span style="color: #b22222;"># </span><span style="color: #b22222;">(then add ~/bin to your $PATH if it's not there already)
+</span></pre>
+
+
+
+</div>
+
+</div>
+
+<div id="outline-container-1_4" class="outline-3">
+<h3 id="sec-1_4"><span class="section-number-3">1.4</span> Usage </h3>
+<div class="outline-text-3" id="text-1_4">
+
+
+<p>
+There is a command-line tool that exposes the functionality of this library
+for your shell-scripting needs:
+</p>
+
+
+
+<pre class="src src-sh">uglifyjs [ options... ] [ filename ]
+</pre>
+
+
+
+<p>
+<code>filename</code> should be the last argument and should name the file from which
+to read the JavaScript code.  If you don't specify it, it will read code
+from STDIN.
+</p>
+<p>
+Supported options:
+</p>
+<ul>
+<li>
+<code>-b</code> or <code>--beautify</code> — output indented code; when passed, additional
+options control the beautifier:
+
+<ul>
+<li>
+<code>-i N</code> or <code>--indent N</code> — indentation level (number of spaces)
+
+</li>
+<li>
+<code>-q</code> or <code>--quote-keys</code> — quote keys in literal objects (by default,
+only keys that cannot be identifier names will be quotes).
+
+</li>
+</ul>
+</li>
+<li>
+<code>--ascii</code> — pass this argument to encode non-ASCII characters as
+<code>\uXXXX</code> sequences.  By default UglifyJS won't bother to do it and will
+output Unicode characters instead.  (the output is always encoded in UTF8,
+but if you pass this option you'll only get ASCII).
+
+</li>
+<li>
+<code>-nm</code> or <code>--no-mangle</code> — don't mangle variable names
+
+</li>
+<li>
+<code>-ns</code> or <code>--no-squeeze</code> — don't call <code>ast_squeeze()</code> (which does various
+optimizations that result in smaller, less readable code).
+
+</li>
+<li>
+<code>-mt</code> or <code>--mangle-toplevel</code> — mangle names in the toplevel scope too
+(by default we don't do this).
+
+</li>
+<li>
+<code>--no-seqs</code> — when <code>ast_squeeze()</code> is called (thus, unless you pass
+<code>--no-squeeze</code>) it will reduce consecutive statements in blocks into a
+sequence.  For example, "a = 10; b = 20; foo();" will be written as
+"a=10,b=20,foo();".  In various occasions, this allows us to discard the
+block brackets (since the block becomes a single statement).  This is ON
+by default because it seems safe and saves a few hundred bytes on some
+libs that I tested it on, but pass <code>--no-seqs</code> to disable it.
+
+</li>
+<li>
+<code>--no-dead-code</code> — by default, UglifyJS will remove code that is
+obviously unreachable (code that follows a <code>return</code>, <code>throw</code>, <code>break</code> or
+<code>continue</code> statement and is not a function/variable declaration).  Pass
+this option to disable this optimization.
+
+</li>
+<li>
+<code>-nc</code> or <code>--no-copyright</code> — by default, <code>uglifyjs</code> will keep the initial
+comment tokens in the generated code (assumed to be copyright information
+etc.).  If you pass this it will discard it.
+
+</li>
+<li>
+<code>-o filename</code> or <code>--output filename</code> — put the result in <code>filename</code>.  If
+this isn't given, the result goes to standard output (or see next one).
+
+</li>
+<li>
+<code>--overwrite</code> — if the code is read from a file (not from STDIN) and you
+pass <code>--overwrite</code> then the output will be written in the same file.
+
+</li>
+<li>
+<code>--ast</code> — pass this if you want to get the Abstract Syntax Tree instead
+of JavaScript as output.  Useful for debugging or learning more about the
+internals.
+
+</li>
+<li>
+<code>-v</code> or <code>--verbose</code> — output some notes on STDERR (for now just how long
+each operation takes).
+
+</li>
+<li>
+<code>--extra</code> — enable additional optimizations that have not yet been
+extensively tested.  These might, or might not, break your code.  If you
+find a bug using this option, please report a test case.
+
+</li>
+<li>
+<code>--unsafe</code> — enable other additional optimizations that are known to be
+unsafe in some contrived situations, but could still be generally useful.
+For now only this:
+
+<ul>
+<li>
+foo.toString()  ==>  foo+""
+
+</li>
+</ul>
+</li>
+<li>
+<code>--max-line-len</code> (default 32K characters) — add a newline after around
+32K characters.  I've seen both FF and Chrome croak when all the code was
+on a single line of around 670K.  Pass –max-line-len 0 to disable this
+safety feature.
+
+</li>
+<li>
+<code>--reserved-names</code> — some libraries rely on certain names to be used, as
+pointed out in issue #92 and #81, so this option allow you to exclude such
+names from the mangler.  For example, to keep names <code>require</code> and <code>$super</code>
+intact you'd specify –reserved-names "require,$super".
+</li>
+</ul>
+
+
+
+</div>
+
+<div id="outline-container-1_4_1" class="outline-4">
+<h4 id="sec-1_4_1"><span class="section-number-4">1.4.1</span> API </h4>
+<div class="outline-text-4" id="text-1_4_1">
+
+
+<p>
+To use the library from JavaScript, you'd do the following (example for
+NodeJS):
+</p>
+
+
+
+<pre class="src src-js"><span style="color: #a020f0;">var</span> <span style="color: #b8860b;">jsp</span> = require(<span style="color: #bc8f8f;">"uglify-js"</span>).parser;
+<span style="color: #a020f0;">var</span> <span style="color: #b8860b;">pro</span> = require(<span style="color: #bc8f8f;">"uglify-js"</span>).uglify;
+
+<span style="color: #a020f0;">var</span> <span style="color: #b8860b;">orig_code</span> = <span style="color: #bc8f8f;">"... JS code here"</span>;
+<span style="color: #a020f0;">var</span> <span style="color: #b8860b;">ast</span> = jsp.parse(orig_code); <span style="color: #b22222;">// </span><span style="color: #b22222;">parse code and get the initial AST
+</span>ast = pro.ast_mangle(ast); <span style="color: #b22222;">// </span><span style="color: #b22222;">get a new AST with mangled names
+</span>ast = pro.ast_squeeze(ast); <span style="color: #b22222;">// </span><span style="color: #b22222;">get an AST with compression optimizations
+</span><span style="color: #a020f0;">var</span> <span style="color: #b8860b;">final_code</span> = pro.gen_code(ast); <span style="color: #b22222;">// </span><span style="color: #b22222;">compressed code here
+</span></pre>
+
+
+
+<p>
+The above performs the full compression that is possible right now.  As you
+can see, there are a sequence of steps which you can apply.  For example if
+you want compressed output but for some reason you don't want to mangle
+variable names, you would simply skip the line that calls
+<code>pro.ast_mangle(ast)</code>.
+</p>
+<p>
+Some of these functions take optional arguments.  Here's a description:
+</p>
+<ul>
+<li>
+<code>jsp.parse(code, strict_semicolons)</code> – parses JS code and returns an AST.
+<code>strict_semicolons</code> is optional and defaults to <code>false</code>.  If you pass
+<code>true</code> then the parser will throw an error when it expects a semicolon and
+it doesn't find it.  For most JS code you don't want that, but it's useful
+if you want to strictly sanitize your code.
+
+</li>
+<li>
+<code>pro.ast_mangle(ast, options)</code> – generates a new AST containing mangled
+(compressed) variable and function names.  It supports the following
+options:
+
+<ul>
+<li>
+<code>toplevel</code> – mangle toplevel names (by default we don't touch them).
+</li>
+<li>
+<code>except</code> – an array of names to exclude from compression.
+
+</li>
+</ul>
+</li>
+<li>
+<code>pro.ast_squeeze(ast, options)</code> – employs further optimizations designed
+to reduce the size of the code that <code>gen_code</code> would generate from the
+AST.  Returns a new AST.  <code>options</code> can be a hash; the supported options
+are:
+
+<ul>
+<li>
+<code>make_seqs</code> (default true) which will cause consecutive statements in a
+block to be merged using the "sequence" (comma) operator
+
+</li>
+<li>
+<code>dead_code</code> (default true) which will remove unreachable code.
+
+</li>
+</ul>
+</li>
+<li>
+<code>pro.gen_code(ast, options)</code> – generates JS code from the AST.  By
+default it's minified, but using the <code>options</code> argument you can get nicely
+formatted output.  <code>options</code> is, well, optional :-) and if you pass it it
+must be an object and supports the following properties (below you can see
+the default values):
+
+<ul>
+<li>
+<code>beautify: false</code> – pass <code>true</code> if you want indented output
+</li>
+<li>
+<code>indent_start: 0</code> (only applies when <code>beautify</code> is <code>true</code>) – initial
+indentation in spaces
+</li>
+<li>
+<code>indent_level: 4</code> (only applies when <code>beautify</code> is <code>true</code>) --
+indentation level, in spaces (pass an even number)
+</li>
+<li>
+<code>quote_keys: false</code> – if you pass <code>true</code> it will quote all keys in
+literal objects
+</li>
+<li>
+<code>space_colon: false</code> (only applies when <code>beautify</code> is <code>true</code>) – wether
+to put a space before the colon in object literals
+</li>
+<li>
+<code>ascii_only: false</code> – pass <code>true</code> if you want to encode non-ASCII
+characters as <code>\uXXXX</code>.
+</li>
+</ul>
+</li>
+</ul>
+
+
+</div>
+
+</div>
+
+<div id="outline-container-1_4_2" class="outline-4">
+<h4 id="sec-1_4_2"><span class="section-number-4">1.4.2</span> Beautifier shortcoming – no more comments </h4>
+<div class="outline-text-4" id="text-1_4_2">
+
+
+<p>
+The beautifier can be used as a general purpose indentation tool.  It's
+useful when you want to make a minified file readable.  One limitation,
+though, is that it discards all comments, so you don't really want to use it
+to reformat your code, unless you don't have, or don't care about, comments.
+</p>
+<p>
+In fact it's not the beautifier who discards comments — they are dumped at
+the parsing stage, when we build the initial AST.  Comments don't really
+make sense in the AST, and while we could add nodes for them, it would be
+inconvenient because we'd have to add special rules to ignore them at all
+the processing stages.
+</p>
+</div>
+</div>
+
+</div>
+
+<div id="outline-container-1_5" class="outline-3">
+<h3 id="sec-1_5"><span class="section-number-3">1.5</span> Compression – how good is it? </h3>
+<div class="outline-text-3" id="text-1_5">
+
+
+<p>
+(XXX: this is somewhat outdated.  On the jQuery source code we beat Closure
+by 168 bytes (560 after gzip) and by many seconds.)
+</p>
+<p>
+There are a few popular JS minifiers nowadays – the two most well known
+being the GoogleClosure (GCL) compiler and the YUI compressor.  For some
+reason they are both written in Java.  I didn't really hope to beat any of
+them, but finally I did – UglifyJS compresses better than the YUI
+compressor, and safer than GoogleClosure.
+</p>
+<p>
+I tested it on two big libraries.  <a href="http://www.dynarchlib.com/">DynarchLIB</a> is my own, and it's big enough
+to contain probably all the JavaScript tricks known to mankind.  <a href="http://jquery.com/">jQuery</a> is
+definitely the most popular JavaScript library (to some people, it's a
+synonym to JavaScript itself).
+</p>
+<p>
+I cannot swear that there are no bugs in the generated codes, but they
+appear to work fine.
+</p>
+<p>
+Compression results:
+</p>
+<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+<caption></caption>
+<colgroup><col align="left" /><col align="right" /><col align="right" /><col align="left" /><col align="left" />
+</colgroup>
+<thead>
+<tr><th scope="col">Library</th><th scope="col">Orig. size</th><th scope="col">UglifyJS</th><th scope="col">YUI</th><th scope="col">GCL</th></tr>
+</thead>
+<tbody>
+<tr><td>DynarchLIB</td><td>636896</td><td>241441</td><td>246452 (+5011)</td><td>240439 (-1002) (buggy)</td></tr>
+<tr><td>jQuery</td><td>163855</td><td>72006</td><td>79702  (+7696)</td><td>71858   (-148)</td></tr>
+</tbody>
+</table>
+
+
+<p>
+UglifyJS is the fastest to run.  On my laptop UglifyJS takes 1.35s for
+DynarchLIB, while YUI takes 2.7s and GCL takes 6.5s.
+</p>
+<p>
+GoogleClosure does a lot of smart ass optimizations.  I had to strive really
+hard to get close to it.  It should be possible to even beat it, but then
+again, GCL has a gazillion lines of code and runs terribly slow, so I'm not
+sure it worths spending the effort to save a few bytes.  Also, GCL doesn't
+cope with <code>eval()</code> or <code>with{}</code> – it just dumps a warning and proceeds to
+mangle names anyway; my DynarchLIB compiled with it is buggy because of
+this.
+</p>
+<p>
+UglifyJS consists of ~1100 lines of code for the tokenizer/parser, and ~1100
+lines for the compressor and code generator.  That should make it very
+maintainable and easily extensible, so I would say it has a good place in
+this field and it's bound to become the de-facto standard JS minifier.  And
+I shall rule the world. :-) Use it, and <b>spread the word</b>!
+</p>
+</div>
+
+</div>
+
+<div id="outline-container-1_6" class="outline-3">
+<h3 id="sec-1_6"><span class="section-number-3">1.6</span> Bugs? </h3>
+<div class="outline-text-3" id="text-1_6">
+
+
+<p>
+Unfortunately, for the time being there is no automated test suite.  But I
+ran the compressor manually on non-trivial code, and then I tested that the
+generated code works as expected.  A few hundred times.
+</p>
+<p>
+DynarchLIB was started in times when there was no good JS minifier.
+Therefore I was quite religious about trying to write short code manually,
+and as such DL contains a lot of syntactic hacks<sup><a class="footref" name="fnr.1" href="#fn.1">1</a></sup> such as “foo == bar ?  a
+= 10 : b = 20”, though the more readable version would clearly be to use
+“if/else”.
+</p>
+<p>
+Since the parser/compressor runs fine on DL and jQuery, I'm quite confident
+that it's solid enough for production use.  If you can identify any bugs,
+I'd love to hear about them (<a href="http://groups.google.com/group/uglifyjs">use the Google Group</a> or email me directly).
+</p>
+</div>
+
+</div>
+
+<div id="outline-container-1_7" class="outline-3">
+<h3 id="sec-1_7"><span class="section-number-3">1.7</span> Links </h3>
+<div class="outline-text-3" id="text-1_7">
+
+
+<ul>
+<li>
+Project at GitHub: <a href="http://github.com/mishoo/UglifyJS">http://github.com/mishoo/UglifyJS</a>
+</li>
+<li>
+Google Group: <a href="http://groups.google.com/group/uglifyjs">http://groups.google.com/group/uglifyjs</a>
+</li>
+<li>
+Common Lisp JS parser: <a href="http://marijn.haverbeke.nl/parse-js/">http://marijn.haverbeke.nl/parse-js/</a>
+</li>
+<li>
+JS-to-Lisp compiler: <a href="http://github.com/marijnh/js">http://github.com/marijnh/js</a>
+</li>
+<li>
+Common Lisp JS uglifier: <a href="http://github.com/mishoo/cl-uglify-js">http://github.com/mishoo/cl-uglify-js</a>
+</li>
+</ul>
+
+
+</div>
+
+</div>
+
+<div id="outline-container-1_8" class="outline-3">
+<h3 id="sec-1_8"><span class="section-number-3">1.8</span> License </h3>
+<div class="outline-text-3" id="text-1_8">
+
+
+<p>
+UglifyJS is released under the BSD license:
+</p>
+
+
+
+<pre class="example">Copyright 2010 (c) Mihai Bazon <mihai.bazon at gmail.com>
+Based on parse-js (http://marijn.haverbeke.nl/parse-js/).
+
+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.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “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 HOLDER 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.
+</pre>
+
+
+
+
+</div>
+</div>
+</div>
+<div id="footnotes">
+<h2 class="footnotes">Footnotes: </h2>
+<div id="text-footnotes">
+<p class="footnote"><sup><a class="footnum" name="fn.1" href="#fnr.1">1</a></sup> I even reported a few bugs and suggested some fixes in the original
+<a href="http://marijn.haverbeke.nl/parse-js/">parse-js</a> library, and Marijn pushed fixes literally in minutes.
+</p>
+</div>
+</div>
+<div id="postamble">
+<p class="author"> Author: Mihai Bazon
+</p>
+<p class="date"> Date: 2011-04-04 00:07:13 EEST</p>
+<p class="creator">HTML generated by org-mode 7.01trans in emacs 23</p>
+</div>
+</div>
+</body>
+</html>
diff --git a/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/README.org b/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/README.org
new file mode 100644
index 0000000..7215bd9
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/README.org
@@ -0,0 +1,431 @@
+#+TITLE: UglifyJS -- a JavaScript parser/compressor/beautifier
+#+KEYWORDS: javascript, js, parser, compiler, compressor, mangle, minify, minifier
+#+DESCRIPTION: a JavaScript parser/compressor/beautifier in JavaScript
+#+STYLE: <link rel="stylesheet" type="text/css" href="docstyle.css" />
+#+AUTHOR: Mihai Bazon
+#+EMAIL: mihai.bazon at gmail.com
+
+* UglifyJS --- a JavaScript parser/compressor/beautifier
+
+This package implements a general-purpose JavaScript
+parser/compressor/beautifier toolkit.  It is developed on [[http://nodejs.org/][NodeJS]], but it
+should work on any JavaScript platform supporting the CommonJS module system
+(and if your platform of choice doesn't support CommonJS, you can easily
+implement it, or discard the =exports.*= lines from UglifyJS sources).
+
+The tokenizer/parser generates an abstract syntax tree from JS code.  You
+can then traverse the AST to learn more about the code, or do various
+manipulations on it.  This part is implemented in [[../lib/parse-js.js][parse-js.js]] and it's a
+port to JavaScript of the excellent [[http://marijn.haverbeke.nl/parse-js/][parse-js]] Common Lisp library from [[http://marijn.haverbeke.nl/][Marijn
+Haverbeke]].
+
+( See [[http://github.com/mishoo/cl-uglify-js][cl-uglify-js]] if you're looking for the Common Lisp version of
+UglifyJS. )
+
+The second part of this package, implemented in [[../lib/process.js][process.js]], inspects and
+manipulates the AST generated by the parser to provide the following:
+
+- ability to re-generate JavaScript code from the AST.  Optionally
+  indented---you can use this if you want to “beautify” a program that has
+  been compressed, so that you can inspect the source.  But you can also run
+  our code generator to print out an AST without any whitespace, so you
+  achieve compression as well.
+
+- shorten variable names (usually to single characters).  Our mangler will
+  analyze the code and generate proper variable names, depending on scope
+  and usage, and is smart enough to deal with globals defined elsewhere, or
+  with =eval()= calls or =with{}= statements.  In short, if =eval()= or
+  =with{}= are used in some scope, then all variables in that scope and any
+  variables in the parent scopes will remain unmangled, and any references
+  to such variables remain unmangled as well.
+
+- various small optimizations that may lead to faster code but certainly
+  lead to smaller code.  Where possible, we do the following:
+
+  - foo["bar"]  ==>  foo.bar
+
+  - remove block brackets ={}=
+
+  - join consecutive var declarations:
+    var a = 10; var b = 20; ==> var a=10,b=20;
+
+  - resolve simple constant expressions: 1 +2 * 3 ==> 7.  We only do the
+    replacement if the result occupies less bytes; for example 1/3 would
+    translate to 0.333333333333, so in this case we don't replace it.
+
+  - consecutive statements in blocks are merged into a sequence; in many
+    cases, this leaves blocks with a single statement, so then we can remove
+    the block brackets.
+
+  - various optimizations for IF statements:
+
+    - if (foo) bar(); else baz(); ==> foo?bar():baz();
+    - if (!foo) bar(); else baz(); ==> foo?baz():bar();
+    - if (foo) bar(); ==> foo&&bar();
+    - if (!foo) bar(); ==> foo||bar();
+    - if (foo) return bar(); else return baz(); ==> return foo?bar():baz();
+    - if (foo) return bar(); else something(); ==> {if(foo)return bar();something()}
+
+  - remove some unreachable code and warn about it (code that follows a
+    =return=, =throw=, =break= or =continue= statement, except
+    function/variable declarations).
+
+** <<Unsafe transformations>>
+
+UglifyJS tries its best to achieve great compression while leaving the
+semantics of the code intact.  In general, if your code logic is broken by
+UglifyJS then it's a bug in UglifyJS and you should report it and I should
+fix it. :-)
+
+However, I opted to include the following potentially unsafe transformations
+as default behavior.  Discussion is welcome, if you have ideas of how to
+handle this better, or any objections to these optimizations, please let me
+know.
+
+*** Calls involving the global Array constructor
+
+The following transformations occur:
+
+#+BEGIN_SRC js
+new Array(1, 2, 3, 4)  => [1,2,3,4]
+Array(a, b, c)         => [a,b,c]
+new Array(5)           => Array(5)
+new Array(a)           => Array(a)
+#+END_SRC
+
+These are all safe if the Array name isn't redefined.  JavaScript does allow
+one to globally redefine Array (and pretty much everything, in fact) but I
+personally don't see why would anyone do that.
+
+UglifyJS does handle the case where Array is redefined locally, or even
+globally but with a =function= or =var= declaration.  Therefore, in the
+following cases UglifyJS *doesn't touch* calls or instantiations of Array:
+
+#+BEGIN_SRC js
+// case 1.  globally declared variable
+  var Array;
+  new Array(1, 2, 3);
+  Array(a, b);
+
+  // or (can be declared later)
+  new Array(1, 2, 3);
+  var Array;
+
+  // or (can be a function)
+  new Array(1, 2, 3);
+  function Array() { ... }
+
+// case 2.  declared in a function
+  (function(){
+    a = new Array(1, 2, 3);
+    b = Array(5, 6);
+    var Array;
+  })();
+
+  // or
+  (function(Array){
+    return Array(5, 6, 7);
+  })();
+
+  // or
+  (function(){
+    return new Array(1, 2, 3, 4);
+    function Array() { ... }
+  })();
+
+  // etc.
+#+END_SRC
+
+** Install (NPM)
+
+UglifyJS is now available through NPM --- =npm install uglify-js= should do
+the job.
+
+** Install latest code from GitHub
+
+#+BEGIN_SRC sh
+## clone the repository
+mkdir -p /where/you/wanna/put/it
+cd /where/you/wanna/put/it
+git clone git://github.com/mishoo/UglifyJS.git
+
+## make the module available to Node
+mkdir -p ~/.node_libraries/
+cd ~/.node_libraries/
+ln -s /where/you/wanna/put/it/UglifyJS/uglify-js.js
+
+## and if you want the CLI script too:
+mkdir -p ~/bin
+cd ~/bin
+ln -s /where/you/wanna/put/it/UglifyJS/bin/uglifyjs
+  # (then add ~/bin to your $PATH if it's not there already)
+#+END_SRC
+
+** Usage
+
+There is a command-line tool that exposes the functionality of this library
+for your shell-scripting needs:
+
+#+BEGIN_SRC sh
+uglifyjs [ options... ] [ filename ]
+#+END_SRC
+
+=filename= should be the last argument and should name the file from which
+to read the JavaScript code.  If you don't specify it, it will read code
+from STDIN.
+
+Supported options:
+
+- =-b= or =--beautify= --- output indented code; when passed, additional
+  options control the beautifier:
+
+  - =-i N= or =--indent N= --- indentation level (number of spaces)
+
+  - =-q= or =--quote-keys= --- quote keys in literal objects (by default,
+    only keys that cannot be identifier names will be quotes).
+
+- =--ascii= --- pass this argument to encode non-ASCII characters as
+  =\uXXXX= sequences.  By default UglifyJS won't bother to do it and will
+  output Unicode characters instead.  (the output is always encoded in UTF8,
+  but if you pass this option you'll only get ASCII).
+
+- =-nm= or =--no-mangle= --- don't mangle variable names
+
+- =-ns= or =--no-squeeze= --- don't call =ast_squeeze()= (which does various
+  optimizations that result in smaller, less readable code).
+
+- =-mt= or =--mangle-toplevel= --- mangle names in the toplevel scope too
+  (by default we don't do this).
+
+- =--no-seqs= --- when =ast_squeeze()= is called (thus, unless you pass
+  =--no-squeeze=) it will reduce consecutive statements in blocks into a
+  sequence.  For example, "a = 10; b = 20; foo();" will be written as
+  "a=10,b=20,foo();".  In various occasions, this allows us to discard the
+  block brackets (since the block becomes a single statement).  This is ON
+  by default because it seems safe and saves a few hundred bytes on some
+  libs that I tested it on, but pass =--no-seqs= to disable it.
+
+- =--no-dead-code= --- by default, UglifyJS will remove code that is
+  obviously unreachable (code that follows a =return=, =throw=, =break= or
+  =continue= statement and is not a function/variable declaration).  Pass
+  this option to disable this optimization.
+
+- =-nc= or =--no-copyright= --- by default, =uglifyjs= will keep the initial
+  comment tokens in the generated code (assumed to be copyright information
+  etc.).  If you pass this it will discard it.
+
+- =-o filename= or =--output filename= --- put the result in =filename=.  If
+  this isn't given, the result goes to standard output (or see next one).
+
+- =--overwrite= --- if the code is read from a file (not from STDIN) and you
+  pass =--overwrite= then the output will be written in the same file.
+
+- =--ast= --- pass this if you want to get the Abstract Syntax Tree instead
+  of JavaScript as output.  Useful for debugging or learning more about the
+  internals.
+
+- =-v= or =--verbose= --- output some notes on STDERR (for now just how long
+  each operation takes).
+
+- =--extra= --- enable additional optimizations that have not yet been
+  extensively tested.  These might, or might not, break your code.  If you
+  find a bug using this option, please report a test case.
+
+- =--unsafe= --- enable other additional optimizations that are known to be
+  unsafe in some contrived situations, but could still be generally useful.
+  For now only this:
+
+  - foo.toString()  ==>  foo+""
+
+- =--max-line-len= (default 32K characters) --- add a newline after around
+  32K characters.  I've seen both FF and Chrome croak when all the code was
+  on a single line of around 670K.  Pass --max-line-len 0 to disable this
+  safety feature.
+
+- =--reserved-names= --- some libraries rely on certain names to be used, as
+  pointed out in issue #92 and #81, so this option allow you to exclude such
+  names from the mangler.  For example, to keep names =require= and =$super=
+  intact you'd specify --reserved-names "require,$super".
+
+*** API
+
+To use the library from JavaScript, you'd do the following (example for
+NodeJS):
+
+#+BEGIN_SRC js
+var jsp = require("uglify-js").parser;
+var pro = require("uglify-js").uglify;
+
+var orig_code = "... JS code here";
+var ast = jsp.parse(orig_code); // parse code and get the initial AST
+ast = pro.ast_mangle(ast); // get a new AST with mangled names
+ast = pro.ast_squeeze(ast); // get an AST with compression optimizations
+var final_code = pro.gen_code(ast); // compressed code here
+#+END_SRC
+
+The above performs the full compression that is possible right now.  As you
+can see, there are a sequence of steps which you can apply.  For example if
+you want compressed output but for some reason you don't want to mangle
+variable names, you would simply skip the line that calls
+=pro.ast_mangle(ast)=.
+
+Some of these functions take optional arguments.  Here's a description:
+
+- =jsp.parse(code, strict_semicolons)= -- parses JS code and returns an AST.
+  =strict_semicolons= is optional and defaults to =false=.  If you pass
+  =true= then the parser will throw an error when it expects a semicolon and
+  it doesn't find it.  For most JS code you don't want that, but it's useful
+  if you want to strictly sanitize your code.
+
+- =pro.ast_mangle(ast, options)= -- generates a new AST containing mangled
+  (compressed) variable and function names.  It supports the following
+  options:
+
+  - =toplevel= -- mangle toplevel names (by default we don't touch them).
+  - =except= -- an array of names to exclude from compression.
+
+- =pro.ast_squeeze(ast, options)= -- employs further optimizations designed
+  to reduce the size of the code that =gen_code= would generate from the
+  AST.  Returns a new AST.  =options= can be a hash; the supported options
+  are:
+
+  - =make_seqs= (default true) which will cause consecutive statements in a
+    block to be merged using the "sequence" (comma) operator
+
+  - =dead_code= (default true) which will remove unreachable code.
+
+- =pro.gen_code(ast, options)= -- generates JS code from the AST.  By
+  default it's minified, but using the =options= argument you can get nicely
+  formatted output.  =options= is, well, optional :-) and if you pass it it
+  must be an object and supports the following properties (below you can see
+  the default values):
+
+  - =beautify: false= -- pass =true= if you want indented output
+  - =indent_start: 0= (only applies when =beautify= is =true=) -- initial
+    indentation in spaces
+  - =indent_level: 4= (only applies when =beautify= is =true=) --
+    indentation level, in spaces (pass an even number)
+  - =quote_keys: false= -- if you pass =true= it will quote all keys in
+    literal objects
+  - =space_colon: false= (only applies when =beautify= is =true=) -- wether
+    to put a space before the colon in object literals
+  - =ascii_only: false= -- pass =true= if you want to encode non-ASCII
+    characters as =\uXXXX=.
+
+*** Beautifier shortcoming -- no more comments
+
+The beautifier can be used as a general purpose indentation tool.  It's
+useful when you want to make a minified file readable.  One limitation,
+though, is that it discards all comments, so you don't really want to use it
+to reformat your code, unless you don't have, or don't care about, comments.
+
+In fact it's not the beautifier who discards comments --- they are dumped at
+the parsing stage, when we build the initial AST.  Comments don't really
+make sense in the AST, and while we could add nodes for them, it would be
+inconvenient because we'd have to add special rules to ignore them at all
+the processing stages.
+
+** Compression -- how good is it?
+
+(XXX: this is somewhat outdated.  On the jQuery source code we beat Closure
+by 168 bytes (560 after gzip) and by many seconds.)
+
+There are a few popular JS minifiers nowadays -- the two most well known
+being the GoogleClosure (GCL) compiler and the YUI compressor.  For some
+reason they are both written in Java.  I didn't really hope to beat any of
+them, but finally I did -- UglifyJS compresses better than the YUI
+compressor, and safer than GoogleClosure.
+
+I tested it on two big libraries.  [[http://www.dynarchlib.com/][DynarchLIB]] is my own, and it's big enough
+to contain probably all the JavaScript tricks known to mankind.  [[http://jquery.com/][jQuery]] is
+definitely the most popular JavaScript library (to some people, it's a
+synonym to JavaScript itself).
+
+I cannot swear that there are no bugs in the generated codes, but they
+appear to work fine.
+
+Compression results:
+
+| Library    | Orig. size | UglifyJS | YUI            | GCL                    |
+|------------+------------+----------+----------------+------------------------|
+| DynarchLIB |     636896 |   241441 | 246452 (+5011) | 240439 (-1002) (buggy) |
+| jQuery     |     163855 |    72006 | 79702  (+7696) | 71858   (-148)         |
+
+UglifyJS is the fastest to run.  On my laptop UglifyJS takes 1.35s for
+DynarchLIB, while YUI takes 2.7s and GCL takes 6.5s.
+
+GoogleClosure does a lot of smart ass optimizations.  I had to strive really
+hard to get close to it.  It should be possible to even beat it, but then
+again, GCL has a gazillion lines of code and runs terribly slow, so I'm not
+sure it worths spending the effort to save a few bytes.  Also, GCL doesn't
+cope with =eval()= or =with{}= -- it just dumps a warning and proceeds to
+mangle names anyway; my DynarchLIB compiled with it is buggy because of
+this.
+
+UglifyJS consists of ~1100 lines of code for the tokenizer/parser, and ~1100
+lines for the compressor and code generator.  That should make it very
+maintainable and easily extensible, so I would say it has a good place in
+this field and it's bound to become the de-facto standard JS minifier.  And
+I shall rule the world. :-) Use it, and *spread the word*!
+
+** Bugs?
+
+Unfortunately, for the time being there is no automated test suite.  But I
+ran the compressor manually on non-trivial code, and then I tested that the
+generated code works as expected.  A few hundred times.
+
+DynarchLIB was started in times when there was no good JS minifier.
+Therefore I was quite religious about trying to write short code manually,
+and as such DL contains a lot of syntactic hacks[1] such as “foo == bar ?  a
+= 10 : b = 20”, though the more readable version would clearly be to use
+“if/else”.
+
+Since the parser/compressor runs fine on DL and jQuery, I'm quite confident
+that it's solid enough for production use.  If you can identify any bugs,
+I'd love to hear about them ([[http://groups.google.com/group/uglifyjs][use the Google Group]] or email me directly).
+
+[1] I even reported a few bugs and suggested some fixes in the original
+    [[http://marijn.haverbeke.nl/parse-js/][parse-js]] library, and Marijn pushed fixes literally in minutes.
+
+** Links
+
+- Project at GitHub: [[http://github.com/mishoo/UglifyJS][http://github.com/mishoo/UglifyJS]]
+- Google Group: [[http://groups.google.com/group/uglifyjs][http://groups.google.com/group/uglifyjs]]
+- Common Lisp JS parser: [[http://marijn.haverbeke.nl/parse-js/][http://marijn.haverbeke.nl/parse-js/]]
+- JS-to-Lisp compiler: [[http://github.com/marijnh/js][http://github.com/marijnh/js]]
+- Common Lisp JS uglifier: [[http://github.com/mishoo/cl-uglify-js][http://github.com/mishoo/cl-uglify-js]]
+
+** License
+
+UglifyJS is released under the BSD license:
+
+#+BEGIN_EXAMPLE
+Copyright 2010 (c) Mihai Bazon <mihai.bazon at gmail.com>
+Based on parse-js (http://marijn.haverbeke.nl/parse-js/).
+
+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.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “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 HOLDER 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.
+#+END_EXAMPLE
diff --git a/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/bin/uglifyjs b/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/bin/uglifyjs
new file mode 100755
index 0000000..85a10a7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/bin/uglifyjs
@@ -0,0 +1,305 @@
+#! /usr/bin/env node
+// -*- js -*-
+
+global.sys = require(/^v0\.[012]/.test(process.version) ? "sys" : "util");
+var fs = require("fs");
+var uglify = require("uglify-js"), // symlink ~/.node_libraries/uglify-js.js to ../uglify-js.js
+    jsp = uglify.parser,
+    pro = uglify.uglify;
+
+var options = {
+        ast: false,
+        mangle: true,
+        mangle_toplevel: false,
+        squeeze: true,
+        make_seqs: true,
+        dead_code: true,
+        verbose: false,
+        show_copyright: true,
+        out_same_file: false,
+        max_line_length: 32 * 1024,
+        unsafe: false,
+        reserved_names: null,
+        defines: { },
+        codegen_options: {
+                ascii_only: false,
+                beautify: false,
+                indent_level: 4,
+                indent_start: 0,
+                quote_keys: false,
+                space_colon: false
+        },
+        make: false,
+        output: true            // stdout
+};
+
+var args = jsp.slice(process.argv, 2);
+var filename;
+
+out: while (args.length > 0) {
+        var v = args.shift();
+        switch (v) {
+            case "-b":
+            case "--beautify":
+                options.codegen_options.beautify = true;
+                break;
+            case "-i":
+            case "--indent":
+                options.codegen_options.indent_level = args.shift();
+                break;
+            case "-q":
+            case "--quote-keys":
+                options.codegen_options.quote_keys = true;
+                break;
+            case "-mt":
+            case "--mangle-toplevel":
+                options.mangle_toplevel = true;
+                break;
+            case "--no-mangle":
+            case "-nm":
+                options.mangle = false;
+                break;
+            case "--no-squeeze":
+            case "-ns":
+                options.squeeze = false;
+                break;
+            case "--no-seqs":
+                options.make_seqs = false;
+                break;
+            case "--no-dead-code":
+                options.dead_code = false;
+                break;
+            case "--no-copyright":
+            case "-nc":
+                options.show_copyright = false;
+                break;
+            case "-o":
+            case "--output":
+                options.output = args.shift();
+                break;
+            case "--overwrite":
+                options.out_same_file = true;
+                break;
+            case "-v":
+            case "--verbose":
+                options.verbose = true;
+                break;
+            case "--ast":
+                options.ast = true;
+                break;
+            case "--unsafe":
+                options.unsafe = true;
+                break;
+            case "--max-line-len":
+                options.max_line_length = parseInt(args.shift(), 10);
+                break;
+            case "--reserved-names":
+                options.reserved_names = args.shift().split(",");
+                break;
+            case "-d":
+            case "--define":
+                 var defarg = args.shift();
+                 try {
+                     var defsym = function(sym) {
+                             // KEYWORDS_ATOM doesn't include NaN or Infinity - should we check
+                             // for them too ?? We don't check reserved words and the like as the
+                             // define values are only substituted AFTER parsing
+                             if (jsp.KEYWORDS_ATOM.hasOwnProperty(sym)) {
+                                 throw "Don't define values for inbuilt constant '"+sym+"'";
+                             }
+                             return sym;
+                         },
+                         defval = function(v) {
+                             if (v.match(/^"(.*)"$/) || v.match(/^'(.*)'$/)) {
+                                 return [ "string", RegExp.$1 ];
+                             }
+                             else if (!isNaN(parseFloat(v))) {
+                                 return [ "num", parseFloat(v) ];
+                             }
+                             else if (v.match(/^[a-z\$_][a-z\$_0-9]*$/i)) {
+                                 return [ "name", v ];
+                             }
+                             else if (!v.match(/"/)) {
+                                 return [ "string", v ];
+                             }
+                             else if (!v.match(/'/)) {
+                                 return [ "string", v ];
+                             }
+                             throw "Can't understand the specified value: "+v;
+                         };
+                     if (defarg.match(/^([a-z_\$][a-z_\$0-9]*)(=(.*))?$/i)) {
+                         var sym = defsym(RegExp.$1),
+                             val = RegExp.$2 ? defval(RegExp.$2.substr(1)) : [ 'name', 'true' ];
+                         options.defines[sym] = val;
+                     }
+                     else {
+                         throw "The --define option expects SYMBOL[=value]";
+                     }
+                 } catch(ex) {
+                     sys.print("ERROR: In option --define "+defarg+"\n"+ex+"\n");
+                     process.exit(1);
+                 }
+                 break;
+            case "--define-from-module":
+                var defmodarg = args.shift(),
+                    defmodule = require(defmodarg),
+                    sym,
+                    val;
+                for (sym in defmodule) {
+                    if (defmodule.hasOwnProperty(sym)) {
+                        options.defines[sym] = function(val) {
+                            if (typeof val == "string")
+                                return [ "string", val ];
+                            if (typeof val == "number")
+                                return [ "num", val ];
+                            if (val === true)
+                                return [ 'name', 'true' ];
+                            if (val === false)
+                                return [ 'name', 'false' ];
+                            if (val === null)
+                                return [ 'name', 'null' ];
+                            if (val === undefined)
+                                return [ 'name', 'undefined' ];
+                            sys.print("ERROR: In option --define-from-module "+defmodarg+"\n");
+                            sys.print("ERROR: Unknown object type for: "+sym+"="+val+"\n");
+                            process.exit(1);
+                            return null;
+                        }(defmodule[sym]);
+                    }
+                }
+                break;
+            case "--ascii":
+                options.codegen_options.ascii_only = true;
+                break;
+            case "--make":
+                options.make = true;
+                break;
+            default:
+                filename = v;
+                break out;
+        }
+}
+
+if (options.verbose) {
+        pro.set_logger(function(msg){
+                sys.debug(msg);
+        });
+}
+
+jsp.set_logger(function(msg){
+        sys.debug(msg);
+});
+
+if (options.make) {
+        options.out_same_file = false; // doesn't make sense in this case
+        var makefile = JSON.parse(fs.readFileSync(filename || "Makefile.uglify.js").toString());
+        output(makefile.files.map(function(file){
+                var code = fs.readFileSync(file.name);
+                if (file.module) {
+                        code = "(function(){return this}())." + file.module + " = (function(exports, global){" + code + "\n;return exports;})({}, (function(){return this}()));";
+                }
+                else if (file.hide) {
+                        code = "(function(){" + code + "}());";
+                }
+                return squeeze_it(code);
+        }).join("\n"));
+}
+else if (filename) {
+        fs.readFile(filename, "utf8", function(err, text){
+                if (err) throw err;
+                output(squeeze_it(text));
+        });
+}
+else {
+        var stdin = process.openStdin();
+        stdin.setEncoding("utf8");
+        var text = "";
+        stdin.on("data", function(chunk){
+                text += chunk;
+        });
+        stdin.on("end", function() {
+                output(squeeze_it(text));
+        });
+}
+
+function output(text) {
+        var out;
+        if (options.out_same_file && filename)
+                options.output = filename;
+        if (options.output === true) {
+                out = process.stdout;
+        } else {
+                out = fs.createWriteStream(options.output, {
+                        flags: "w",
+                        encoding: "utf8",
+                        mode: 0644
+                });
+        }
+        out.write(text);
+        if (options.output !== true) {
+                out.end();
+        }
+};
+
+// --------- main ends here.
+
+function show_copyright(comments) {
+        var ret = "";
+        for (var i = 0; i < comments.length; ++i) {
+                var c = comments[i];
+                if (c.type == "comment1") {
+                        ret += "//" + c.value + "\n";
+                } else {
+                        ret += "/*" + c.value + "*/";
+                }
+        }
+        return ret;
+};
+
+function squeeze_it(code) {
+        var result = "";
+        if (options.show_copyright) {
+                var tok = jsp.tokenizer(code), c;
+                c = tok();
+                result += show_copyright(c.comments_before);
+        }
+        try {
+                var ast = time_it("parse", function(){ return jsp.parse(code); });
+                if (options.mangle) ast = time_it("mangle", function(){
+                        return pro.ast_mangle(ast, {
+                                toplevel: options.mangle_toplevel,
+                                defines: options.defines,
+                                except: options.reserved_names
+                        });
+                });
+                if (options.squeeze) ast = time_it("squeeze", function(){
+                        ast = pro.ast_squeeze(ast, {
+                                make_seqs  : options.make_seqs,
+                                dead_code  : options.dead_code,
+                                keep_comps : !options.unsafe
+                        });
+                        if (options.unsafe)
+                                ast = pro.ast_squeeze_more(ast);
+                        return ast;
+                });
+                if (options.ast)
+                        return sys.inspect(ast, null, null);
+                result += time_it("generate", function(){ return pro.gen_code(ast, options.codegen_options) });
+                if (!options.codegen_options.beautify && options.max_line_length) {
+                        result = time_it("split", function(){ return pro.split_lines(result, options.max_line_length) });
+                }
+                return result;
+        } catch(ex) {
+                sys.debug(ex.stack);
+                sys.debug(sys.inspect(ex));
+                sys.debug(JSON.stringify(ex));
+        }
+};
+
+function time_it(name, cont) {
+        if (!options.verbose)
+                return cont();
+        var t1 = new Date().getTime();
+        try { return cont(); }
+        finally { sys.debug("// " + name + ": " + ((new Date().getTime() - t1) / 1000).toFixed(3) + " sec."); }
+};
diff --git a/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/docstyle.css b/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/docstyle.css
new file mode 100644
index 0000000..412481f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/docstyle.css
@@ -0,0 +1,75 @@
+html { font-family: "Lucida Grande","Trebuchet MS",sans-serif; font-size: 12pt; }
+body { max-width: 60em; }
+.title  { text-align: center; }
+.todo   { color: red; }
+.done   { color: green; }
+.tag    { background-color:lightblue; font-weight:normal }
+.target { }
+.timestamp { color: grey }
+.timestamp-kwd { color: CadetBlue }
+p.verse { margin-left: 3% }
+pre {
+  border: 1pt solid #AEBDCC;
+  background-color: #F3F5F7;
+  padding: 5pt;
+  font-family: monospace;
+  font-size: 90%;
+  overflow:auto;
+}
+pre.src {
+  background-color: #eee; color: #112; border: 1px solid #000;
+}
+table { border-collapse: collapse; }
+td, th { vertical-align: top; }
+dt { font-weight: bold; }
+div.figure { padding: 0.5em; }
+div.figure p { text-align: center; }
+.linenr { font-size:smaller }
+.code-highlighted {background-color:#ffff00;}
+.org-info-js_info-navigation { border-style:none; }
+#org-info-js_console-label { font-size:10px; font-weight:bold;
+  white-space:nowrap; }
+.org-info-js_search-highlight {background-color:#ffff00; color:#000000;
+  font-weight:bold; }
+
+sup {
+  vertical-align: baseline;
+  position: relative;
+  top: -0.5em;
+  font-size: 80%;
+}
+
+sup a:link, sup a:visited {
+  text-decoration: none;
+  color: #c00;
+}
+
+sup a:before { content: "["; color: #999; }
+sup a:after { content: "]"; color: #999; }
+
+h1.title { border-bottom: 4px solid #000; padding-bottom: 5px; margin-bottom: 2em; }
+
+#postamble {
+  color: #777;
+  font-size: 90%;
+  padding-top: 1em; padding-bottom: 1em; border-top: 1px solid #999;
+  margin-top: 2em;
+  padding-left: 2em;
+  padding-right: 2em;
+  text-align: right;
+}
+
+#postamble p { margin: 0; }
+
+#footnotes { border-top: 1px solid #000; }
+
+h1 { font-size: 200% }
+h2 { font-size: 175% }
+h3 { font-size: 150% }
+h4 { font-size: 125% }
+
+h1, h2, h3, h4 { font-family: "Bookman",Georgia,"Times New Roman",serif; font-weight: normal; }
+
+ at media print {
+  html { font-size: 11pt; }
+}
diff --git a/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/lib/parse-js.js b/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/lib/parse-js.js
new file mode 100644
index 0000000..506e88b
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/lib/parse-js.js
@@ -0,0 +1,1315 @@
+/***********************************************************************
+
+  A JavaScript tokenizer / parser / beautifier / compressor.
+
+  This version is suitable for Node.js.  With minimal changes (the
+  exports stuff) it should work on any JS platform.
+
+  This file contains the tokenizer/parser.  It is a port to JavaScript
+  of parse-js [1], a JavaScript parser library written in Common Lisp
+  by Marijn Haverbeke.  Thank you Marijn!
+
+  [1] http://marijn.haverbeke.nl/parse-js/
+
+  Exported functions:
+
+    - tokenizer(code) -- returns a function.  Call the returned
+      function to fetch the next token.
+
+    - parse(code) -- returns an AST of the given JavaScript code.
+
+  -------------------------------- (C) ---------------------------------
+
+                           Author: Mihai Bazon
+                         <mihai.bazon at gmail.com>
+                       http://mihai.bazon.net/blog
+
+  Distributed under the BSD license:
+
+    Copyright 2010 (c) Mihai Bazon <mihai.bazon at gmail.com>
+    Based on parse-js (http://marijn.haverbeke.nl/parse-js/).
+
+    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.
+
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “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 HOLDER 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.
+
+ ***********************************************************************/
+
+/* -----[ Tokenizer (constants) ]----- */
+
+var KEYWORDS = array_to_hash([
+        "break",
+        "case",
+        "catch",
+        "const",
+        "continue",
+        "default",
+        "delete",
+        "do",
+        "else",
+        "finally",
+        "for",
+        "function",
+        "if",
+        "in",
+        "instanceof",
+        "new",
+        "return",
+        "switch",
+        "throw",
+        "try",
+        "typeof",
+        "var",
+        "void",
+        "while",
+        "with"
+]);
+
+var RESERVED_WORDS = array_to_hash([
+        "abstract",
+        "boolean",
+        "byte",
+        "char",
+        "class",
+        "debugger",
+        "double",
+        "enum",
+        "export",
+        "extends",
+        "final",
+        "float",
+        "goto",
+        "implements",
+        "import",
+        "int",
+        "interface",
+        "long",
+        "native",
+        "package",
+        "private",
+        "protected",
+        "public",
+        "short",
+        "static",
+        "super",
+        "synchronized",
+        "throws",
+        "transient",
+        "volatile"
+]);
+
+var KEYWORDS_BEFORE_EXPRESSION = array_to_hash([
+        "return",
+        "new",
+        "delete",
+        "throw",
+        "else",
+        "case"
+]);
+
+var KEYWORDS_ATOM = array_to_hash([
+        "false",
+        "null",
+        "true",
+        "undefined"
+]);
+
+var OPERATOR_CHARS = array_to_hash(characters("+-*&%=<>!?|~^"));
+
+var RE_HEX_NUMBER = /^0x[0-9a-f]+$/i;
+var RE_OCT_NUMBER = /^0[0-7]+$/;
+var RE_DEC_NUMBER = /^\d*\.?\d*(?:e[+-]?\d*(?:\d\.?|\.?\d)\d*)?$/i;
+
+var OPERATORS = array_to_hash([
+        "in",
+        "instanceof",
+        "typeof",
+        "new",
+        "void",
+        "delete",
+        "++",
+        "--",
+        "+",
+        "-",
+        "!",
+        "~",
+        "&",
+        "|",
+        "^",
+        "*",
+        "/",
+        "%",
+        ">>",
+        "<<",
+        ">>>",
+        "<",
+        ">",
+        "<=",
+        ">=",
+        "==",
+        "===",
+        "!=",
+        "!==",
+        "?",
+        "=",
+        "+=",
+        "-=",
+        "/=",
+        "*=",
+        "%=",
+        ">>=",
+        "<<=",
+        ">>>=",
+        "|=",
+        "^=",
+        "&=",
+        "&&",
+        "||"
+]);
+
+var WHITESPACE_CHARS = array_to_hash(characters(" \u00a0\n\r\t\f\v\u200b"));
+
+var PUNC_BEFORE_EXPRESSION = array_to_hash(characters("[{}(,.;:"));
+
+var PUNC_CHARS = array_to_hash(characters("[]{}(),;:"));
+
+var REGEXP_MODIFIERS = array_to_hash(characters("gmsiy"));
+
+/* -----[ Tokenizer ]----- */
+
+// regexps adapted from http://xregexp.com/plugins/#unicode
+var UNICODE = {
+        letter: new RegExp("[\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u0523\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0621-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F [...]
+        non_spacing_mark: new RegExp("[\\u0300-\\u036F\\u0483-\\u0487\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065E\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0900-\\u0902\\u093C\\u0941-\\u0948\\u094D\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09BC\\u09C1-\\u09C4\\u09CD\\u09E2\\u09E3\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42 [...]
+        space_combining_mark: new RegExp("[\\u0903\\u093E-\\u0940\\u0949-\\u094C\\u094E\\u0982\\u0983\\u09BE-\\u09C0\\u09C7\\u09C8\\u09CB\\u09CC\\u09D7\\u0A03\\u0A3E-\\u0A40\\u0A83\\u0ABE-\\u0AC0\\u0AC9\\u0ACB\\u0ACC\\u0B02\\u0B03\\u0B3E\\u0B40\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B57\\u0BBE\\u0BBF\\u0BC1\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD7\\u0C01-\\u0C03\\u0C41-\\u0C44\\u0C82\\u0C83\\u0CBE\\u0CC0-\\u0CC4\\u0CC7\\u0CC8\\u0CCA\\u0CCB\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E-\\u0D40\\u0D46-\\u [...]
+        connector_punctuation: new RegExp("[\\u005F\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F]")
+};
+
+function is_letter(ch) {
+        return UNICODE.letter.test(ch);
+};
+
+function is_digit(ch) {
+        ch = ch.charCodeAt(0);
+        return ch >= 48 && ch <= 57; //XXX: find out if "UnicodeDigit" means something else than 0..9
+};
+
+function is_alphanumeric_char(ch) {
+        return is_digit(ch) || is_letter(ch);
+};
+
+function is_unicode_combining_mark(ch) {
+        return UNICODE.non_spacing_mark.test(ch) || UNICODE.space_combining_mark.test(ch);
+};
+
+function is_unicode_connector_punctuation(ch) {
+        return UNICODE.connector_punctuation.test(ch);
+};
+
+function is_identifier_start(ch) {
+        return ch == "$" || ch == "_" || is_letter(ch);
+};
+
+function is_identifier_char(ch) {
+        return is_identifier_start(ch)
+                || is_unicode_combining_mark(ch)
+                || is_digit(ch)
+                || is_unicode_connector_punctuation(ch)
+                || ch == "\u200c" // zero-width non-joiner <ZWNJ>
+                || ch == "\u200d" // zero-width joiner <ZWJ> (in my ECMA-262 PDF, this is also 200c)
+        ;
+};
+
+function parse_js_number(num) {
+        if (RE_HEX_NUMBER.test(num)) {
+                return parseInt(num.substr(2), 16);
+        } else if (RE_OCT_NUMBER.test(num)) {
+                return parseInt(num.substr(1), 8);
+        } else if (RE_DEC_NUMBER.test(num)) {
+                return parseFloat(num);
+        }
+};
+
+function JS_Parse_Error(message, line, col, pos) {
+        this.message = message;
+        this.line = line;
+        this.col = col;
+        this.pos = pos;
+        try {
+                ({})();
+        } catch(ex) {
+                this.stack = ex.stack;
+        };
+};
+
+JS_Parse_Error.prototype.toString = function() {
+        return this.message + " (line: " + this.line + ", col: " + this.col + ", pos: " + this.pos + ")" + "\n\n" + this.stack;
+};
+
+function js_error(message, line, col, pos) {
+        throw new JS_Parse_Error(message, line, col, pos);
+};
+
+function is_token(token, type, val) {
+        return token.type == type && (val == null || token.value == val);
+};
+
+var EX_EOF = {};
+
+function tokenizer($TEXT) {
+
+        var S = {
+                text            : $TEXT.replace(/\r\n?|[\n\u2028\u2029]/g, "\n").replace(/^\uFEFF/, ''),
+                pos             : 0,
+                tokpos          : 0,
+                line            : 0,
+                tokline         : 0,
+                col             : 0,
+                tokcol          : 0,
+                newline_before  : false,
+                regex_allowed   : false,
+                comments_before : []
+        };
+
+        function peek() { return S.text.charAt(S.pos); };
+
+        function next(signal_eof) {
+                var ch = S.text.charAt(S.pos++);
+                if (signal_eof && !ch)
+                        throw EX_EOF;
+                if (ch == "\n") {
+                        S.newline_before = true;
+                        ++S.line;
+                        S.col = 0;
+                } else {
+                        ++S.col;
+                }
+                return ch;
+        };
+
+        function eof() {
+                return !S.peek();
+        };
+
+        function find(what, signal_eof) {
+                var pos = S.text.indexOf(what, S.pos);
+                if (signal_eof && pos == -1) throw EX_EOF;
+                return pos;
+        };
+
+        function start_token() {
+                S.tokline = S.line;
+                S.tokcol = S.col;
+                S.tokpos = S.pos;
+        };
+
+        function token(type, value, is_comment) {
+                S.regex_allowed = ((type == "operator" && !HOP(UNARY_POSTFIX, value)) ||
+                                   (type == "keyword" && HOP(KEYWORDS_BEFORE_EXPRESSION, value)) ||
+                                   (type == "punc" && HOP(PUNC_BEFORE_EXPRESSION, value)));
+                var ret = {
+                        type  : type,
+                        value : value,
+                        line  : S.tokline,
+                        col   : S.tokcol,
+                        pos   : S.tokpos,
+                        nlb   : S.newline_before
+                };
+                if (!is_comment) {
+                        ret.comments_before = S.comments_before;
+                        S.comments_before = [];
+                }
+                S.newline_before = false;
+                return ret;
+        };
+
+        function skip_whitespace() {
+                while (HOP(WHITESPACE_CHARS, peek()))
+                        next();
+        };
+
+        function read_while(pred) {
+                var ret = "", ch = peek(), i = 0;
+                while (ch && pred(ch, i++)) {
+                        ret += next();
+                        ch = peek();
+                }
+                return ret;
+        };
+
+        function parse_error(err) {
+                js_error(err, S.tokline, S.tokcol, S.tokpos);
+        };
+
+        function read_num(prefix) {
+                var has_e = false, after_e = false, has_x = false, has_dot = prefix == ".";
+                var num = read_while(function(ch, i){
+                        if (ch == "x" || ch == "X") {
+                                if (has_x) return false;
+                                return has_x = true;
+                        }
+                        if (!has_x && (ch == "E" || ch == "e")) {
+                                if (has_e) return false;
+                                return has_e = after_e = true;
+                        }
+                        if (ch == "-") {
+                                if (after_e || (i == 0 && !prefix)) return true;
+                                return false;
+                        }
+                        if (ch == "+") return after_e;
+                        after_e = false;
+                        if (ch == ".") {
+                                if (!has_dot && !has_x)
+                                        return has_dot = true;
+                                return false;
+                        }
+                        return is_alphanumeric_char(ch);
+                });
+                if (prefix)
+                        num = prefix + num;
+                var valid = parse_js_number(num);
+                if (!isNaN(valid)) {
+                        return token("num", valid);
+                } else {
+                        parse_error("Invalid syntax: " + num);
+                }
+        };
+
+        function read_escaped_char() {
+                var ch = next(true);
+                switch (ch) {
+                    case "n" : return "\n";
+                    case "r" : return "\r";
+                    case "t" : return "\t";
+                    case "b" : return "\b";
+                    case "v" : return "\v";
+                    case "f" : return "\f";
+                    case "0" : return "\0";
+                    case "x" : return String.fromCharCode(hex_bytes(2));
+                    case "u" : return String.fromCharCode(hex_bytes(4));
+                    default  : return ch;
+                }
+        };
+
+        function hex_bytes(n) {
+                var num = 0;
+                for (; n > 0; --n) {
+                        var digit = parseInt(next(true), 16);
+                        if (isNaN(digit))
+                                parse_error("Invalid hex-character pattern in string");
+                        num = (num << 4) | digit;
+                }
+                return num;
+        };
+
+        function read_string() {
+                return with_eof_error("Unterminated string constant", function(){
+                        var quote = next(), ret = "";
+                        for (;;) {
+                                var ch = next(true);
+                                if (ch == "\\") ch = read_escaped_char();
+                                else if (ch == quote) break;
+                                ret += ch;
+                        }
+                        return token("string", ret);
+                });
+        };
+
+        function read_line_comment() {
+                next();
+                var i = find("\n"), ret;
+                if (i == -1) {
+                        ret = S.text.substr(S.pos);
+                        S.pos = S.text.length;
+                } else {
+                        ret = S.text.substring(S.pos, i);
+                        S.pos = i;
+                }
+                return token("comment1", ret, true);
+        };
+
+        function read_multiline_comment() {
+                next();
+                return with_eof_error("Unterminated multiline comment", function(){
+                        var i = find("*/", true),
+                            text = S.text.substring(S.pos, i),
+                            tok = token("comment2", text, true);
+                        S.pos = i + 2;
+                        S.line += text.split("\n").length - 1;
+                        S.newline_before = text.indexOf("\n") >= 0;
+
+                        // https://github.com/mishoo/UglifyJS/issues/#issue/100
+                        if (/^@cc_on/i.test(text)) {
+                                warn("WARNING: at line " + S.line);
+                                warn("*** Found \"conditional comment\": " + text);
+                                warn("*** UglifyJS DISCARDS ALL COMMENTS.  This means your code might no longer work properly in Internet Explorer.");
+                        }
+
+                        return tok;
+                });
+        };
+
+        function read_name() {
+                var backslash = false, name = "", ch;
+                while ((ch = peek()) != null) {
+                        if (!backslash) {
+                                if (ch == "\\") backslash = true, next();
+                                else if (is_identifier_char(ch)) name += next();
+                                else break;
+                        }
+                        else {
+                                if (ch != "u") parse_error("Expecting UnicodeEscapeSequence -- uXXXX");
+                                ch = read_escaped_char();
+                                if (!is_identifier_char(ch)) parse_error("Unicode char: " + ch.charCodeAt(0) + " is not valid in identifier");
+                                name += ch;
+                                backslash = false;
+                        }
+                }
+                return name;
+        };
+
+        function read_regexp() {
+                return with_eof_error("Unterminated regular expression", function(){
+                        var prev_backslash = false, regexp = "", ch, in_class = false;
+                        while ((ch = next(true))) if (prev_backslash) {
+                                regexp += "\\" + ch;
+                                prev_backslash = false;
+                        } else if (ch == "[") {
+                                in_class = true;
+                                regexp += ch;
+                        } else if (ch == "]" && in_class) {
+                                in_class = false;
+                                regexp += ch;
+                        } else if (ch == "/" && !in_class) {
+                                break;
+                        } else if (ch == "\\") {
+                                prev_backslash = true;
+                        } else {
+                                regexp += ch;
+                        }
+                        var mods = read_name();
+                        return token("regexp", [ regexp, mods ]);
+                });
+        };
+
+        function read_operator(prefix) {
+                function grow(op) {
+                        if (!peek()) return op;
+                        var bigger = op + peek();
+                        if (HOP(OPERATORS, bigger)) {
+                                next();
+                                return grow(bigger);
+                        } else {
+                                return op;
+                        }
+                };
+                return token("operator", grow(prefix || next()));
+        };
+
+        function handle_slash() {
+                next();
+                var regex_allowed = S.regex_allowed;
+                switch (peek()) {
+                    case "/":
+                        S.comments_before.push(read_line_comment());
+                        S.regex_allowed = regex_allowed;
+                        return next_token();
+                    case "*":
+                        S.comments_before.push(read_multiline_comment());
+                        S.regex_allowed = regex_allowed;
+                        return next_token();
+                }
+                return S.regex_allowed ? read_regexp() : read_operator("/");
+        };
+
+        function handle_dot() {
+                next();
+                return is_digit(peek())
+                        ? read_num(".")
+                        : token("punc", ".");
+        };
+
+        function read_word() {
+                var word = read_name();
+                return !HOP(KEYWORDS, word)
+                        ? token("name", word)
+                        : HOP(OPERATORS, word)
+                        ? token("operator", word)
+                        : HOP(KEYWORDS_ATOM, word)
+                        ? token("atom", word)
+                        : token("keyword", word);
+        };
+
+        function with_eof_error(eof_error, cont) {
+                try {
+                        return cont();
+                } catch(ex) {
+                        if (ex === EX_EOF) parse_error(eof_error);
+                        else throw ex;
+                }
+        };
+
+        function next_token(force_regexp) {
+                if (force_regexp)
+                        return read_regexp();
+                skip_whitespace();
+                start_token();
+                var ch = peek();
+                if (!ch) return token("eof");
+                if (is_digit(ch)) return read_num();
+                if (ch == '"' || ch == "'") return read_string();
+                if (HOP(PUNC_CHARS, ch)) return token("punc", next());
+                if (ch == ".") return handle_dot();
+                if (ch == "/") return handle_slash();
+                if (HOP(OPERATOR_CHARS, ch)) return read_operator();
+                if (ch == "\\" || is_identifier_start(ch)) return read_word();
+                parse_error("Unexpected character '" + ch + "'");
+        };
+
+        next_token.context = function(nc) {
+                if (nc) S = nc;
+                return S;
+        };
+
+        return next_token;
+
+};
+
+/* -----[ Parser (constants) ]----- */
+
+var UNARY_PREFIX = array_to_hash([
+        "typeof",
+        "void",
+        "delete",
+        "--",
+        "++",
+        "!",
+        "~",
+        "-",
+        "+"
+]);
+
+var UNARY_POSTFIX = array_to_hash([ "--", "++" ]);
+
+var ASSIGNMENT = (function(a, ret, i){
+        while (i < a.length) {
+                ret[a[i]] = a[i].substr(0, a[i].length - 1);
+                i++;
+        }
+        return ret;
+})(
+        ["+=", "-=", "/=", "*=", "%=", ">>=", "<<=", ">>>=", "|=", "^=", "&="],
+        { "=": true },
+        0
+);
+
+var PRECEDENCE = (function(a, ret){
+        for (var i = 0, n = 1; i < a.length; ++i, ++n) {
+                var b = a[i];
+                for (var j = 0; j < b.length; ++j) {
+                        ret[b[j]] = n;
+                }
+        }
+        return ret;
+})(
+        [
+                ["||"],
+                ["&&"],
+                ["|"],
+                ["^"],
+                ["&"],
+                ["==", "===", "!=", "!=="],
+                ["<", ">", "<=", ">=", "in", "instanceof"],
+                [">>", "<<", ">>>"],
+                ["+", "-"],
+                ["*", "/", "%"]
+        ],
+        {}
+);
+
+var STATEMENTS_WITH_LABELS = array_to_hash([ "for", "do", "while", "switch" ]);
+
+var ATOMIC_START_TOKEN = array_to_hash([ "atom", "num", "string", "regexp", "name" ]);
+
+/* -----[ Parser ]----- */
+
+function NodeWithToken(str, start, end) {
+        this.name = str;
+        this.start = start;
+        this.end = end;
+};
+
+NodeWithToken.prototype.toString = function() { return this.name; };
+
+function parse($TEXT, exigent_mode, embed_tokens) {
+
+        var S = {
+                input       : typeof $TEXT == "string" ? tokenizer($TEXT, true) : $TEXT,
+                token       : null,
+                prev        : null,
+                peeked      : null,
+                in_function : 0,
+                in_loop     : 0,
+                labels      : []
+        };
+
+        S.token = next();
+
+        function is(type, value) {
+                return is_token(S.token, type, value);
+        };
+
+        function peek() { return S.peeked || (S.peeked = S.input()); };
+
+        function next() {
+                S.prev = S.token;
+                if (S.peeked) {
+                        S.token = S.peeked;
+                        S.peeked = null;
+                } else {
+                        S.token = S.input();
+                }
+                return S.token;
+        };
+
+        function prev() {
+                return S.prev;
+        };
+
+        function croak(msg, line, col, pos) {
+                var ctx = S.input.context();
+                js_error(msg,
+                         line != null ? line : ctx.tokline,
+                         col != null ? col : ctx.tokcol,
+                         pos != null ? pos : ctx.tokpos);
+        };
+
+        function token_error(token, msg) {
+                croak(msg, token.line, token.col);
+        };
+
+        function unexpected(token) {
+                if (token == null)
+                        token = S.token;
+                token_error(token, "Unexpected token: " + token.type + " (" + token.value + ")");
+        };
+
+        function expect_token(type, val) {
+                if (is(type, val)) {
+                        return next();
+                }
+                token_error(S.token, "Unexpected token " + S.token.type + ", expected " + type);
+        };
+
+        function expect(punc) { return expect_token("punc", punc); };
+
+        function can_insert_semicolon() {
+                return !exigent_mode && (
+                        S.token.nlb || is("eof") || is("punc", "}")
+                );
+        };
+
+        function semicolon() {
+                if (is("punc", ";")) next();
+                else if (!can_insert_semicolon()) unexpected();
+        };
+
+        function as() {
+                return slice(arguments);
+        };
+
+        function parenthesised() {
+                expect("(");
+                var ex = expression();
+                expect(")");
+                return ex;
+        };
+
+        function add_tokens(str, start, end) {
+                return str instanceof NodeWithToken ? str : new NodeWithToken(str, start, end);
+        };
+
+        function maybe_embed_tokens(parser) {
+                if (embed_tokens) return function() {
+                        var start = S.token;
+                        var ast = parser.apply(this, arguments);
+                        ast[0] = add_tokens(ast[0], start, prev());
+                        return ast;
+                };
+                else return parser;
+        };
+
+        var statement = maybe_embed_tokens(function() {
+                if (is("operator", "/")) {
+                        S.peeked = null;
+                        S.token = S.input(true); // force regexp
+                }
+                switch (S.token.type) {
+                    case "num":
+                    case "string":
+                    case "regexp":
+                    case "operator":
+                    case "atom":
+                        return simple_statement();
+
+                    case "name":
+                        return is_token(peek(), "punc", ":")
+                                ? labeled_statement(prog1(S.token.value, next, next))
+                                : simple_statement();
+
+                    case "punc":
+                        switch (S.token.value) {
+                            case "{":
+                                return as("block", block_());
+                            case "[":
+                            case "(":
+                                return simple_statement();
+                            case ";":
+                                next();
+                                return as("block");
+                            default:
+                                unexpected();
+                        }
+
+                    case "keyword":
+                        switch (prog1(S.token.value, next)) {
+                            case "break":
+                                return break_cont("break");
+
+                            case "continue":
+                                return break_cont("continue");
+
+                            case "debugger":
+                                semicolon();
+                                return as("debugger");
+
+                            case "do":
+                                return (function(body){
+                                        expect_token("keyword", "while");
+                                        return as("do", prog1(parenthesised, semicolon), body);
+                                })(in_loop(statement));
+
+                            case "for":
+                                return for_();
+
+                            case "function":
+                                return function_(true);
+
+                            case "if":
+                                return if_();
+
+                            case "return":
+                                if (S.in_function == 0)
+                                        croak("'return' outside of function");
+                                return as("return",
+                                          is("punc", ";")
+                                          ? (next(), null)
+                                          : can_insert_semicolon()
+                                          ? null
+                                          : prog1(expression, semicolon));
+
+                            case "switch":
+                                return as("switch", parenthesised(), switch_block_());
+
+                            case "throw":
+                                return as("throw", prog1(expression, semicolon));
+
+                            case "try":
+                                return try_();
+
+                            case "var":
+                                return prog1(var_, semicolon);
+
+                            case "const":
+                                return prog1(const_, semicolon);
+
+                            case "while":
+                                return as("while", parenthesised(), in_loop(statement));
+
+                            case "with":
+                                return as("with", parenthesised(), statement());
+
+                            default:
+                                unexpected();
+                        }
+                }
+        });
+
+        function labeled_statement(label) {
+                S.labels.push(label);
+                var start = S.token, stat = statement();
+                if (exigent_mode && !HOP(STATEMENTS_WITH_LABELS, stat[0]))
+                        unexpected(start);
+                S.labels.pop();
+                return as("label", label, stat);
+        };
+
+        function simple_statement() {
+                return as("stat", prog1(expression, semicolon));
+        };
+
+        function break_cont(type) {
+                var name = is("name") ? S.token.value : null;
+                if (name != null) {
+                        next();
+                        if (!member(name, S.labels))
+                                croak("Label " + name + " without matching loop or statement");
+                }
+                else if (S.in_loop == 0)
+                        croak(type + " not inside a loop or switch");
+                semicolon();
+                return as(type, name);
+        };
+
+        function for_() {
+                expect("(");
+                var init = null;
+                if (!is("punc", ";")) {
+                        init = is("keyword", "var")
+                                ? (next(), var_(true))
+                                : expression(true, true);
+                        if (is("operator", "in"))
+                                return for_in(init);
+                }
+                return regular_for(init);
+        };
+
+        function regular_for(init) {
+                expect(";");
+                var test = is("punc", ";") ? null : expression();
+                expect(";");
+                var step = is("punc", ")") ? null : expression();
+                expect(")");
+                return as("for", init, test, step, in_loop(statement));
+        };
+
+        function for_in(init) {
+                var lhs = init[0] == "var" ? as("name", init[1][0]) : init;
+                next();
+                var obj = expression();
+                expect(")");
+                return as("for-in", init, lhs, obj, in_loop(statement));
+        };
+
+        var function_ = maybe_embed_tokens(function(in_statement) {
+                var name = is("name") ? prog1(S.token.value, next) : null;
+                if (in_statement && !name)
+                        unexpected();
+                expect("(");
+                return as(in_statement ? "defun" : "function",
+                          name,
+                          // arguments
+                          (function(first, a){
+                                  while (!is("punc", ")")) {
+                                          if (first) first = false; else expect(",");
+                                          if (!is("name")) unexpected();
+                                          a.push(S.token.value);
+                                          next();
+                                  }
+                                  next();
+                                  return a;
+                          })(true, []),
+                          // body
+                          (function(){
+                                  ++S.in_function;
+                                  var loop = S.in_loop;
+                                  S.in_loop = 0;
+                                  var a = block_();
+                                  --S.in_function;
+                                  S.in_loop = loop;
+                                  return a;
+                          })());
+        });
+
+        function if_() {
+                var cond = parenthesised(), body = statement(), belse;
+                if (is("keyword", "else")) {
+                        next();
+                        belse = statement();
+                }
+                return as("if", cond, body, belse);
+        };
+
+        function block_() {
+                expect("{");
+                var a = [];
+                while (!is("punc", "}")) {
+                        if (is("eof")) unexpected();
+                        a.push(statement());
+                }
+                next();
+                return a;
+        };
+
+        var switch_block_ = curry(in_loop, function(){
+                expect("{");
+                var a = [], cur = null;
+                while (!is("punc", "}")) {
+                        if (is("eof")) unexpected();
+                        if (is("keyword", "case")) {
+                                next();
+                                cur = [];
+                                a.push([ expression(), cur ]);
+                                expect(":");
+                        }
+                        else if (is("keyword", "default")) {
+                                next();
+                                expect(":");
+                                cur = [];
+                                a.push([ null, cur ]);
+                        }
+                        else {
+                                if (!cur) unexpected();
+                                cur.push(statement());
+                        }
+                }
+                next();
+                return a;
+        });
+
+        function try_() {
+                var body = block_(), bcatch, bfinally;
+                if (is("keyword", "catch")) {
+                        next();
+                        expect("(");
+                        if (!is("name"))
+                                croak("Name expected");
+                        var name = S.token.value;
+                        next();
+                        expect(")");
+                        bcatch = [ name, block_() ];
+                }
+                if (is("keyword", "finally")) {
+                        next();
+                        bfinally = block_();
+                }
+                if (!bcatch && !bfinally)
+                        croak("Missing catch/finally blocks");
+                return as("try", body, bcatch, bfinally);
+        };
+
+        function vardefs(no_in) {
+                var a = [];
+                for (;;) {
+                        if (!is("name"))
+                                unexpected();
+                        var name = S.token.value;
+                        next();
+                        if (is("operator", "=")) {
+                                next();
+                                a.push([ name, expression(false, no_in) ]);
+                        } else {
+                                a.push([ name ]);
+                        }
+                        if (!is("punc", ","))
+                                break;
+                        next();
+                }
+                return a;
+        };
+
+        function var_(no_in) {
+                return as("var", vardefs(no_in));
+        };
+
+        function const_() {
+                return as("const", vardefs());
+        };
+
+        function new_() {
+                var newexp = expr_atom(false), args;
+                if (is("punc", "(")) {
+                        next();
+                        args = expr_list(")");
+                } else {
+                        args = [];
+                }
+                return subscripts(as("new", newexp, args), true);
+        };
+
+        var expr_atom = maybe_embed_tokens(function(allow_calls) {
+                if (is("operator", "new")) {
+                        next();
+                        return new_();
+                }
+                if (is("operator") && HOP(UNARY_PREFIX, S.token.value)) {
+                        return make_unary("unary-prefix",
+                                          prog1(S.token.value, next),
+                                          expr_atom(allow_calls));
+                }
+                if (is("punc")) {
+                        switch (S.token.value) {
+                            case "(":
+                                next();
+                                return subscripts(prog1(expression, curry(expect, ")")), allow_calls);
+                            case "[":
+                                next();
+                                return subscripts(array_(), allow_calls);
+                            case "{":
+                                next();
+                                return subscripts(object_(), allow_calls);
+                        }
+                        unexpected();
+                }
+                if (is("keyword", "function")) {
+                        next();
+                        return subscripts(function_(false), allow_calls);
+                }
+                if (HOP(ATOMIC_START_TOKEN, S.token.type)) {
+                        var atom = S.token.type == "regexp"
+                                ? as("regexp", S.token.value[0], S.token.value[1])
+                                : as(S.token.type, S.token.value);
+                        return subscripts(prog1(atom, next), allow_calls);
+                }
+                unexpected();
+        });
+
+        function expr_list(closing, allow_trailing_comma, allow_empty) {
+                var first = true, a = [];
+                while (!is("punc", closing)) {
+                        if (first) first = false; else expect(",");
+                        if (allow_trailing_comma && is("punc", closing)) break;
+                        if (is("punc", ",") && allow_empty) {
+                                a.push([ "atom", "undefined" ]);
+                        } else {
+                                a.push(expression(false));
+                        }
+                }
+                next();
+                return a;
+        };
+
+        function array_() {
+                return as("array", expr_list("]", !exigent_mode, true));
+        };
+
+        function object_() {
+                var first = true, a = [];
+                while (!is("punc", "}")) {
+                        if (first) first = false; else expect(",");
+                        if (!exigent_mode && is("punc", "}"))
+                                // allow trailing comma
+                                break;
+                        var type = S.token.type;
+                        var name = as_property_name();
+                        if (type == "name" && (name == "get" || name == "set") && !is("punc", ":")) {
+                                a.push([ as_name(), function_(false), name ]);
+                        } else {
+                                expect(":");
+                                a.push([ name, expression(false) ]);
+                        }
+                }
+                next();
+                return as("object", a);
+        };
+
+        function as_property_name() {
+                switch (S.token.type) {
+                    case "num":
+                    case "string":
+                        return prog1(S.token.value, next);
+                }
+                return as_name();
+        };
+
+        function as_name() {
+                switch (S.token.type) {
+                    case "name":
+                    case "operator":
+                    case "keyword":
+                    case "atom":
+                        return prog1(S.token.value, next);
+                    default:
+                        unexpected();
+                }
+        };
+
+        function subscripts(expr, allow_calls) {
+                if (is("punc", ".")) {
+                        next();
+                        return subscripts(as("dot", expr, as_name()), allow_calls);
+                }
+                if (is("punc", "[")) {
+                        next();
+                        return subscripts(as("sub", expr, prog1(expression, curry(expect, "]"))), allow_calls);
+                }
+                if (allow_calls && is("punc", "(")) {
+                        next();
+                        return subscripts(as("call", expr, expr_list(")")), true);
+                }
+                if (allow_calls && is("operator") && HOP(UNARY_POSTFIX, S.token.value)) {
+                        return prog1(curry(make_unary, "unary-postfix", S.token.value, expr),
+                                     next);
+                }
+                return expr;
+        };
+
+        function make_unary(tag, op, expr) {
+                if ((op == "++" || op == "--") && !is_assignable(expr))
+                        croak("Invalid use of " + op + " operator");
+                return as(tag, op, expr);
+        };
+
+        function expr_op(left, min_prec, no_in) {
+                var op = is("operator") ? S.token.value : null;
+                if (op && op == "in" && no_in) op = null;
+                var prec = op != null ? PRECEDENCE[op] : null;
+                if (prec != null && prec > min_prec) {
+                        next();
+                        var right = expr_op(expr_atom(true), prec, no_in);
+                        return expr_op(as("binary", op, left, right), min_prec, no_in);
+                }
+                return left;
+        };
+
+        function expr_ops(no_in) {
+                return expr_op(expr_atom(true), 0, no_in);
+        };
+
+        function maybe_conditional(no_in) {
+                var expr = expr_ops(no_in);
+                if (is("operator", "?")) {
+                        next();
+                        var yes = expression(false);
+                        expect(":");
+                        return as("conditional", expr, yes, expression(false, no_in));
+                }
+                return expr;
+        };
+
+        function is_assignable(expr) {
+                if (!exigent_mode) return true;
+                switch (expr[0]) {
+                    case "dot":
+                    case "sub":
+                    case "new":
+                    case "call":
+                        return true;
+                    case "name":
+                        return expr[1] != "this";
+                }
+        };
+
+        function maybe_assign(no_in) {
+                var left = maybe_conditional(no_in), val = S.token.value;
+                if (is("operator") && HOP(ASSIGNMENT, val)) {
+                        if (is_assignable(left)) {
+                                next();
+                                return as("assign", ASSIGNMENT[val], left, maybe_assign(no_in));
+                        }
+                        croak("Invalid assignment");
+                }
+                return left;
+        };
+
+        var expression = maybe_embed_tokens(function(commas, no_in) {
+                if (arguments.length == 0)
+                        commas = true;
+                var expr = maybe_assign(no_in);
+                if (commas && is("punc", ",")) {
+                        next();
+                        return as("seq", expr, expression(true, no_in));
+                }
+                return expr;
+        });
+
+        function in_loop(cont) {
+                try {
+                        ++S.in_loop;
+                        return cont();
+                } finally {
+                        --S.in_loop;
+                }
+        };
+
+        return as("toplevel", (function(a){
+                while (!is("eof"))
+                        a.push(statement());
+                return a;
+        })([]));
+
+};
+
+/* -----[ Utilities ]----- */
+
+function curry(f) {
+        var args = slice(arguments, 1);
+        return function() { return f.apply(this, args.concat(slice(arguments))); };
+};
+
+function prog1(ret) {
+        if (ret instanceof Function)
+                ret = ret();
+        for (var i = 1, n = arguments.length; --n > 0; ++i)
+                arguments[i]();
+        return ret;
+};
+
+function array_to_hash(a) {
+        var ret = {};
+        for (var i = 0; i < a.length; ++i)
+                ret[a[i]] = true;
+        return ret;
+};
+
+function slice(a, start) {
+        return Array.prototype.slice.call(a, start == null ? 0 : start);
+};
+
+function characters(str) {
+        return str.split("");
+};
+
+function member(name, array) {
+        for (var i = array.length; --i >= 0;)
+                if (array[i] === name)
+                        return true;
+        return false;
+};
+
+function HOP(obj, prop) {
+        return Object.prototype.hasOwnProperty.call(obj, prop);
+};
+
+var warn = function() {};
+
+/* -----[ Exports ]----- */
+
+exports.tokenizer = tokenizer;
+exports.parse = parse;
+exports.slice = slice;
+exports.curry = curry;
+exports.member = member;
+exports.array_to_hash = array_to_hash;
+exports.PRECEDENCE = PRECEDENCE;
+exports.KEYWORDS_ATOM = KEYWORDS_ATOM;
+exports.RESERVED_WORDS = RESERVED_WORDS;
+exports.KEYWORDS = KEYWORDS;
+exports.ATOMIC_START_TOKEN = ATOMIC_START_TOKEN;
+exports.OPERATORS = OPERATORS;
+exports.is_alphanumeric_char = is_alphanumeric_char;
+exports.set_logger = function(logger) {
+        warn = logger;
+};
diff --git a/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/lib/process.js b/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/lib/process.js
new file mode 100755
index 0000000..b1fcc15
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/lib/process.js
@@ -0,0 +1,1667 @@
+/***********************************************************************
+
+  A JavaScript tokenizer / parser / beautifier / compressor.
+
+  This version is suitable for Node.js.  With minimal changes (the
+  exports stuff) it should work on any JS platform.
+
+  This file implements some AST processors.  They work on data built
+  by parse-js.
+
+  Exported functions:
+
+    - ast_mangle(ast, options) -- mangles the variable/function names
+      in the AST.  Returns an AST.
+
+    - ast_squeeze(ast) -- employs various optimizations to make the
+      final generated code even smaller.  Returns an AST.
+
+    - gen_code(ast, options) -- generates JS code from the AST.  Pass
+      true (or an object, see the code for some options) as second
+      argument to get "pretty" (indented) code.
+
+  -------------------------------- (C) ---------------------------------
+
+                           Author: Mihai Bazon
+                         <mihai.bazon at gmail.com>
+                       http://mihai.bazon.net/blog
+
+  Distributed under the BSD license:
+
+    Copyright 2010 (c) Mihai Bazon <mihai.bazon at gmail.com>
+
+    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.
+
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “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 HOLDER 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.
+
+ ***********************************************************************/
+
+var jsp = require("./parse-js"),
+    slice = jsp.slice,
+    member = jsp.member,
+    PRECEDENCE = jsp.PRECEDENCE,
+    OPERATORS = jsp.OPERATORS;
+
+/* -----[ helper for AST traversal ]----- */
+
+function ast_walker(ast) {
+        function _vardefs(defs) {
+                return [ this[0], MAP(defs, function(def){
+                        var a = [ def[0] ];
+                        if (def.length > 1)
+                                a[1] = walk(def[1]);
+                        return a;
+                }) ];
+        };
+        function _block(statements) {
+                var out = [ this[0] ];
+                if (statements != null)
+                        out.push(MAP(statements, walk));
+                return out;
+        };
+        var walkers = {
+                "string": function(str) {
+                        return [ this[0], str ];
+                },
+                "num": function(num) {
+                        return [ this[0], num ];
+                },
+                "name": function(name) {
+                        return [ this[0], name ];
+                },
+                "toplevel": function(statements) {
+                        return [ this[0], MAP(statements, walk) ];
+                },
+                "block": _block,
+                "splice": _block,
+                "var": _vardefs,
+                "const": _vardefs,
+                "try": function(t, c, f) {
+                        return [
+                                this[0],
+                                MAP(t, walk),
+                                c != null ? [ c[0], MAP(c[1], walk) ] : null,
+                                f != null ? MAP(f, walk) : null
+                        ];
+                },
+                "throw": function(expr) {
+                        return [ this[0], walk(expr) ];
+                },
+                "new": function(ctor, args) {
+                        return [ this[0], walk(ctor), MAP(args, walk) ];
+                },
+                "switch": function(expr, body) {
+                        return [ this[0], walk(expr), MAP(body, function(branch){
+                                return [ branch[0] ? walk(branch[0]) : null,
+                                         MAP(branch[1], walk) ];
+                        }) ];
+                },
+                "break": function(label) {
+                        return [ this[0], label ];
+                },
+                "continue": function(label) {
+                        return [ this[0], label ];
+                },
+                "conditional": function(cond, t, e) {
+                        return [ this[0], walk(cond), walk(t), walk(e) ];
+                },
+                "assign": function(op, lvalue, rvalue) {
+                        return [ this[0], op, walk(lvalue), walk(rvalue) ];
+                },
+                "dot": function(expr) {
+                        return [ this[0], walk(expr) ].concat(slice(arguments, 1));
+                },
+                "call": function(expr, args) {
+                        return [ this[0], walk(expr), MAP(args, walk) ];
+                },
+                "function": function(name, args, body) {
+                        return [ this[0], name, args.slice(), MAP(body, walk) ];
+                },
+                "defun": function(name, args, body) {
+                        return [ this[0], name, args.slice(), MAP(body, walk) ];
+                },
+                "if": function(conditional, t, e) {
+                        return [ this[0], walk(conditional), walk(t), walk(e) ];
+                },
+                "for": function(init, cond, step, block) {
+                        return [ this[0], walk(init), walk(cond), walk(step), walk(block) ];
+                },
+                "for-in": function(vvar, key, hash, block) {
+                        return [ this[0], walk(vvar), walk(key), walk(hash), walk(block) ];
+                },
+                "while": function(cond, block) {
+                        return [ this[0], walk(cond), walk(block) ];
+                },
+                "do": function(cond, block) {
+                        return [ this[0], walk(cond), walk(block) ];
+                },
+                "return": function(expr) {
+                        return [ this[0], walk(expr) ];
+                },
+                "binary": function(op, left, right) {
+                        return [ this[0], op, walk(left), walk(right) ];
+                },
+                "unary-prefix": function(op, expr) {
+                        return [ this[0], op, walk(expr) ];
+                },
+                "unary-postfix": function(op, expr) {
+                        return [ this[0], op, walk(expr) ];
+                },
+                "sub": function(expr, subscript) {
+                        return [ this[0], walk(expr), walk(subscript) ];
+                },
+                "object": function(props) {
+                        return [ this[0], MAP(props, function(p){
+                                return p.length == 2
+                                        ? [ p[0], walk(p[1]) ]
+                                        : [ p[0], walk(p[1]), p[2] ]; // get/set-ter
+                        }) ];
+                },
+                "regexp": function(rx, mods) {
+                        return [ this[0], rx, mods ];
+                },
+                "array": function(elements) {
+                        return [ this[0], MAP(elements, walk) ];
+                },
+                "stat": function(stat) {
+                        return [ this[0], walk(stat) ];
+                },
+                "seq": function() {
+                        return [ this[0] ].concat(MAP(slice(arguments), walk));
+                },
+                "label": function(name, block) {
+                        return [ this[0], name, walk(block) ];
+                },
+                "with": function(expr, block) {
+                        return [ this[0], walk(expr), walk(block) ];
+                },
+                "atom": function(name) {
+                        return [ this[0], name ];
+                }
+        };
+
+        var user = {};
+        var stack = [];
+        function walk(ast) {
+                if (ast == null)
+                        return null;
+                try {
+                        stack.push(ast);
+                        var type = ast[0];
+                        var gen = user[type];
+                        if (gen) {
+                                var ret = gen.apply(ast, ast.slice(1));
+                                if (ret != null)
+                                        return ret;
+                        }
+                        gen = walkers[type];
+                        return gen.apply(ast, ast.slice(1));
+                } finally {
+                        stack.pop();
+                }
+        };
+
+        function with_walkers(walkers, cont){
+                var save = {}, i;
+                for (i in walkers) if (HOP(walkers, i)) {
+                        save[i] = user[i];
+                        user[i] = walkers[i];
+                }
+                var ret = cont();
+                for (i in save) if (HOP(save, i)) {
+                        if (!save[i]) delete user[i];
+                        else user[i] = save[i];
+                }
+                return ret;
+        };
+
+        return {
+                walk: walk,
+                with_walkers: with_walkers,
+                parent: function() {
+                        return stack[stack.length - 2]; // last one is current node
+                },
+                stack: function() {
+                        return stack;
+                }
+        };
+};
+
+/* -----[ Scope and mangling ]----- */
+
+function Scope(parent) {
+        this.names = {};        // names defined in this scope
+        this.mangled = {};      // mangled names (orig.name => mangled)
+        this.rev_mangled = {};  // reverse lookup (mangled => orig.name)
+        this.cname = -1;        // current mangled name
+        this.refs = {};         // names referenced from this scope
+        this.uses_with = false; // will become TRUE if with() is detected in this or any subscopes
+        this.uses_eval = false; // will become TRUE if eval() is detected in this or any subscopes
+        this.parent = parent;   // parent scope
+        this.children = [];     // sub-scopes
+        if (parent) {
+                this.level = parent.level + 1;
+                parent.children.push(this);
+        } else {
+                this.level = 0;
+        }
+};
+
+var base54 = (function(){
+        var DIGITS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_";
+        return function(num) {
+                var ret = "";
+                do {
+                        ret = DIGITS.charAt(num % 54) + ret;
+                        num = Math.floor(num / 54);
+                } while (num > 0);
+                return ret;
+        };
+})();
+
+Scope.prototype = {
+        has: function(name) {
+                for (var s = this; s; s = s.parent)
+                        if (HOP(s.names, name))
+                                return s;
+        },
+        has_mangled: function(mname) {
+                for (var s = this; s; s = s.parent)
+                        if (HOP(s.rev_mangled, mname))
+                                return s;
+        },
+        toJSON: function() {
+                return {
+                        names: this.names,
+                        uses_eval: this.uses_eval,
+                        uses_with: this.uses_with
+                };
+        },
+
+        next_mangled: function() {
+                // we must be careful that the new mangled name:
+                //
+                // 1. doesn't shadow a mangled name from a parent
+                //    scope, unless we don't reference the original
+                //    name from this scope OR from any sub-scopes!
+                //    This will get slow.
+                //
+                // 2. doesn't shadow an original name from a parent
+                //    scope, in the event that the name is not mangled
+                //    in the parent scope and we reference that name
+                //    here OR IN ANY SUBSCOPES!
+                //
+                // 3. doesn't shadow a name that is referenced but not
+                //    defined (possibly global defined elsewhere).
+                for (;;) {
+                        var m = base54(++this.cname), prior;
+
+                        // case 1.
+                        prior = this.has_mangled(m);
+                        if (prior && this.refs[prior.rev_mangled[m]] === prior)
+                                continue;
+
+                        // case 2.
+                        prior = this.has(m);
+                        if (prior && prior !== this && this.refs[m] === prior && !prior.has_mangled(m))
+                                continue;
+
+                        // case 3.
+                        if (HOP(this.refs, m) && this.refs[m] == null)
+                                continue;
+
+                        // I got "do" once. :-/
+                        if (!is_identifier(m))
+                                continue;
+
+                        return m;
+                }
+        },
+        get_mangled: function(name, newMangle) {
+                if (this.uses_eval || this.uses_with) return name; // no mangle if eval or with is in use
+                var s = this.has(name);
+                if (!s) return name; // not in visible scope, no mangle
+                if (HOP(s.mangled, name)) return s.mangled[name]; // already mangled in this scope
+                if (!newMangle) return name;                      // not found and no mangling requested
+
+                var m = s.next_mangled();
+                s.rev_mangled[m] = name;
+                return s.mangled[name] = m;
+        },
+        define: function(name) {
+                if (name != null)
+                        return this.names[name] = name;
+        }
+};
+
+function ast_add_scope(ast) {
+
+        var current_scope = null;
+        var w = ast_walker(), walk = w.walk;
+        var having_eval = [];
+
+        function with_new_scope(cont) {
+                current_scope = new Scope(current_scope);
+                var ret = current_scope.body = cont();
+                ret.scope = current_scope;
+                current_scope = current_scope.parent;
+                return ret;
+        };
+
+        function define(name) {
+                return current_scope.define(name);
+        };
+
+        function reference(name) {
+                current_scope.refs[name] = true;
+        };
+
+        function _lambda(name, args, body) {
+                var is_defun = this[0] == "defun";
+                return [ this[0], is_defun ? define(name) : name, args, with_new_scope(function(){
+                        if (!is_defun) define(name);
+                        MAP(args, define);
+                        return MAP(body, walk);
+                })];
+        };
+
+        return with_new_scope(function(){
+                // process AST
+                var ret = w.with_walkers({
+                        "function": _lambda,
+                        "defun": _lambda,
+                        "with": function(expr, block) {
+                                for (var s = current_scope; s; s = s.parent)
+                                        s.uses_with = true;
+                        },
+                        "var": function(defs) {
+                                MAP(defs, function(d){ define(d[0]) });
+                        },
+                        "const": function(defs) {
+                                MAP(defs, function(d){ define(d[0]) });
+                        },
+                        "try": function(t, c, f) {
+                                if (c != null) return [
+                                        this[0],
+                                        MAP(t, walk),
+                                        [ define(c[0]), MAP(c[1], walk) ],
+                                        f != null ? MAP(f, walk) : null
+                                ];
+                        },
+                        "name": function(name) {
+                                if (name == "eval")
+                                        having_eval.push(current_scope);
+                                reference(name);
+                        }
+                }, function(){
+                        return walk(ast);
+                });
+
+                // the reason why we need an additional pass here is
+                // that names can be used prior to their definition.
+
+                // scopes where eval was detected and their parents
+                // are marked with uses_eval, unless they define the
+                // "eval" name.
+                MAP(having_eval, function(scope){
+                        if (!scope.has("eval")) while (scope) {
+                                scope.uses_eval = true;
+                                scope = scope.parent;
+                        }
+                });
+
+                // for referenced names it might be useful to know
+                // their origin scope.  current_scope here is the
+                // toplevel one.
+                function fixrefs(scope, i) {
+                        // do children first; order shouldn't matter
+                        for (i = scope.children.length; --i >= 0;)
+                                fixrefs(scope.children[i]);
+                        for (i in scope.refs) if (HOP(scope.refs, i)) {
+                                // find origin scope and propagate the reference to origin
+                                for (var origin = scope.has(i), s = scope; s; s = s.parent) {
+                                        s.refs[i] = origin;
+                                        if (s === origin) break;
+                                }
+                        }
+                };
+                fixrefs(current_scope);
+
+                return ret;
+        });
+
+};
+
+/* -----[ mangle names ]----- */
+
+function ast_mangle(ast, options) {
+        var w = ast_walker(), walk = w.walk, scope;
+        options = options || {};
+
+        function get_mangled(name, newMangle) {
+                if (!options.toplevel && !scope.parent) return name; // don't mangle toplevel
+                if (options.except && member(name, options.except))
+                        return name;
+                return scope.get_mangled(name, newMangle);
+        };
+
+        function get_define(name) {
+                if (options.defines) {
+                        // we always lookup a defined symbol for the current scope FIRST, so declared
+                        // vars trump a DEFINE symbol, but if no such var is found, then match a DEFINE value
+                        if (!scope.has(name)) {
+                                if (HOP(options.defines, name)) {
+                                        return options.defines[name];
+                                }
+                        }
+                        return null;
+                }
+        };
+
+        function _lambda(name, args, body) {
+                var is_defun = this[0] == "defun";
+                if (is_defun && name) name = get_mangled(name);
+                body = with_scope(body.scope, function(){
+                        if (!is_defun && name) name = get_mangled(name);
+                        args = MAP(args, function(name){ return get_mangled(name) });
+                        return MAP(body, walk);
+                });
+                return [ this[0], name, args, body ];
+        };
+
+        function with_scope(s, cont) {
+                var _scope = scope;
+                scope = s;
+                for (var i in s.names) if (HOP(s.names, i)) {
+                        get_mangled(i, true);
+                }
+                var ret = cont();
+                ret.scope = s;
+                scope = _scope;
+                return ret;
+        };
+
+        function _vardefs(defs) {
+                return [ this[0], MAP(defs, function(d){
+                        return [ get_mangled(d[0]), walk(d[1]) ];
+                }) ];
+        };
+
+        return w.with_walkers({
+                "function": _lambda,
+                "defun": function() {
+                        // move function declarations to the top when
+                        // they are not in some block.
+                        var ast = _lambda.apply(this, arguments);
+                        switch (w.parent()[0]) {
+                            case "toplevel":
+                            case "function":
+                            case "defun":
+                                return MAP.at_top(ast);
+                        }
+                        return ast;
+                },
+                "var": _vardefs,
+                "const": _vardefs,
+                "name": function(name) {
+                        return get_define(name) || [ this[0], get_mangled(name) ];
+                },
+                "try": function(t, c, f) {
+                        return [ this[0],
+                                 MAP(t, walk),
+                                 c != null ? [ get_mangled(c[0]), MAP(c[1], walk) ] : null,
+                                 f != null ? MAP(f, walk) : null ];
+                },
+                "toplevel": function(body) {
+                        var self = this;
+                        return with_scope(self.scope, function(){
+                                return [ self[0], MAP(body, walk) ];
+                        });
+                }
+        }, function() {
+                return walk(ast_add_scope(ast));
+        });
+};
+
+/* -----[
+   - compress foo["bar"] into foo.bar,
+   - remove block brackets {} where possible
+   - join consecutive var declarations
+   - various optimizations for IFs:
+     - if (cond) foo(); else bar();  ==>  cond?foo():bar();
+     - if (cond) foo();  ==>  cond&&foo();
+     - if (foo) return bar(); else return baz();  ==> return foo?bar():baz(); // also for throw
+     - if (foo) return bar(); else something();  ==> {if(foo)return bar();something()}
+   ]----- */
+
+var warn = function(){};
+
+function best_of(ast1, ast2) {
+        return gen_code(ast1).length > gen_code(ast2[0] == "stat" ? ast2[1] : ast2).length ? ast2 : ast1;
+};
+
+function last_stat(b) {
+        if (b[0] == "block" && b[1] && b[1].length > 0)
+                return b[1][b[1].length - 1];
+        return b;
+}
+
+function aborts(t) {
+        if (t) {
+                t = last_stat(t);
+                if (t[0] == "return" || t[0] == "break" || t[0] == "continue" || t[0] == "throw")
+                        return true;
+        }
+};
+
+function boolean_expr(expr) {
+        return ( (expr[0] == "unary-prefix"
+                  && member(expr[1], [ "!", "delete" ])) ||
+
+                 (expr[0] == "binary"
+                  && member(expr[1], [ "in", "instanceof", "==", "!=", "===", "!==", "<", "<=", ">=", ">" ])) ||
+
+                 (expr[0] == "binary"
+                  && member(expr[1], [ "&&", "||" ])
+                  && boolean_expr(expr[2])
+                  && boolean_expr(expr[3])) ||
+
+                 (expr[0] == "conditional"
+                  && boolean_expr(expr[2])
+                  && boolean_expr(expr[3])) ||
+
+                 (expr[0] == "assign"
+                  && expr[1] === true
+                  && boolean_expr(expr[3])) ||
+
+                 (expr[0] == "seq"
+                  && boolean_expr(expr[expr.length - 1]))
+               );
+};
+
+function make_conditional(c, t, e) {
+    var make_real_conditional = function() {
+        if (c[0] == "unary-prefix" && c[1] == "!") {
+            return e ? [ "conditional", c[2], e, t ] : [ "binary", "||", c[2], t ];
+        } else {
+            return e ? [ "conditional", c, t, e ] : [ "binary", "&&", c, t ];
+        }
+    };
+    // shortcut the conditional if the expression has a constant value
+    return when_constant(c, function(ast, val){
+        warn_unreachable(val ? e : t);
+        return          (val ? t : e);
+    }, make_real_conditional);
+};
+
+function empty(b) {
+        return !b || (b[0] == "block" && (!b[1] || b[1].length == 0));
+};
+
+function is_string(node) {
+        return (node[0] == "string" ||
+                node[0] == "unary-prefix" && node[1] == "typeof" ||
+                node[0] == "binary" && node[1] == "+" &&
+                (is_string(node[2]) || is_string(node[3])));
+};
+
+var when_constant = (function(){
+
+        var $NOT_CONSTANT = {};
+
+        // this can only evaluate constant expressions.  If it finds anything
+        // not constant, it throws $NOT_CONSTANT.
+        function evaluate(expr) {
+                switch (expr[0]) {
+                    case "string":
+                    case "num":
+                        return expr[1];
+                    case "name":
+                    case "atom":
+                        switch (expr[1]) {
+                            case "true": return true;
+                            case "false": return false;
+                        }
+                        break;
+                    case "unary-prefix":
+                        switch (expr[1]) {
+                            case "!": return !evaluate(expr[2]);
+                            case "typeof": return typeof evaluate(expr[2]);
+                            case "~": return ~evaluate(expr[2]);
+                            case "-": return -evaluate(expr[2]);
+                            case "+": return +evaluate(expr[2]);
+                        }
+                        break;
+                    case "binary":
+                        var left = expr[2], right = expr[3];
+                        switch (expr[1]) {
+                            case "&&"         : return evaluate(left) &&         evaluate(right);
+                            case "||"         : return evaluate(left) ||         evaluate(right);
+                            case "|"          : return evaluate(left) |          evaluate(right);
+                            case "&"          : return evaluate(left) &          evaluate(right);
+                            case "^"          : return evaluate(left) ^          evaluate(right);
+                            case "+"          : return evaluate(left) +          evaluate(right);
+                            case "*"          : return evaluate(left) *          evaluate(right);
+                            case "/"          : return evaluate(left) /          evaluate(right);
+                            case "-"          : return evaluate(left) -          evaluate(right);
+                            case "<<"         : return evaluate(left) <<         evaluate(right);
+                            case ">>"         : return evaluate(left) >>         evaluate(right);
+                            case ">>>"        : return evaluate(left) >>>        evaluate(right);
+                            case "=="         : return evaluate(left) ==         evaluate(right);
+                            case "==="        : return evaluate(left) ===        evaluate(right);
+                            case "!="         : return evaluate(left) !=         evaluate(right);
+                            case "!=="        : return evaluate(left) !==        evaluate(right);
+                            case "<"          : return evaluate(left) <          evaluate(right);
+                            case "<="         : return evaluate(left) <=         evaluate(right);
+                            case ">"          : return evaluate(left) >          evaluate(right);
+                            case ">="         : return evaluate(left) >=         evaluate(right);
+                            case "in"         : return evaluate(left) in         evaluate(right);
+                            case "instanceof" : return evaluate(left) instanceof evaluate(right);
+                        }
+                }
+                throw $NOT_CONSTANT;
+        };
+
+        return function(expr, yes, no) {
+                try {
+                        var val = evaluate(expr), ast;
+                        switch (typeof val) {
+                            case "string": ast =  [ "string", val ]; break;
+                            case "number": ast =  [ "num", val ]; break;
+                            case "boolean": ast =  [ "name", String(val) ]; break;
+                            default: throw new Error("Can't handle constant of type: " + (typeof val));
+                        }
+                        return yes.call(expr, ast, val);
+                } catch(ex) {
+                        if (ex === $NOT_CONSTANT) {
+                                if (expr[0] == "binary"
+                                    && (expr[1] == "===" || expr[1] == "!==")
+                                    && ((is_string(expr[2]) && is_string(expr[3]))
+                                        || (boolean_expr(expr[2]) && boolean_expr(expr[3])))) {
+                                        expr[1] = expr[1].substr(0, 2);
+                                }
+                                else if (no && expr[0] == "binary"
+                                         && (expr[1] == "||" || expr[1] == "&&")) {
+                                    // the whole expression is not constant but the lval may be...
+                                    try {
+                                        var lval = evaluate(expr[2]);
+                                        expr = ((expr[1] == "&&" && (lval ? expr[3] : lval))    ||
+                                                (expr[1] == "||" && (lval ? lval    : expr[3])) ||
+                                                expr);
+                                    } catch(ex2) {
+                                        // IGNORE... lval is not constant
+                                    }
+                                }
+                                return no ? no.call(expr, expr) : null;
+                        }
+                        else throw ex;
+                }
+        };
+
+})();
+
+function warn_unreachable(ast) {
+        if (!empty(ast))
+                warn("Dropping unreachable code: " + gen_code(ast, true));
+};
+
+function ast_squeeze(ast, options) {
+        options = defaults(options, {
+                make_seqs   : true,
+                dead_code   : true,
+                keep_comps  : true,
+                no_warnings : false
+        });
+
+        var w = ast_walker(), walk = w.walk, scope;
+
+        function negate(c) {
+                var not_c = [ "unary-prefix", "!", c ];
+                switch (c[0]) {
+                    case "unary-prefix":
+                        return c[1] == "!" && boolean_expr(c[2]) ? c[2] : not_c;
+                    case "seq":
+                        c = slice(c);
+                        c[c.length - 1] = negate(c[c.length - 1]);
+                        return c;
+                    case "conditional":
+                        return best_of(not_c, [ "conditional", c[1], negate(c[2]), negate(c[3]) ]);
+                    case "binary":
+                        var op = c[1], left = c[2], right = c[3];
+                        if (!options.keep_comps) switch (op) {
+                            case "<="  : return [ "binary", ">", left, right ];
+                            case "<"   : return [ "binary", ">=", left, right ];
+                            case ">="  : return [ "binary", "<", left, right ];
+                            case ">"   : return [ "binary", "<=", left, right ];
+                        }
+                        switch (op) {
+                            case "=="  : return [ "binary", "!=", left, right ];
+                            case "!="  : return [ "binary", "==", left, right ];
+                            case "===" : return [ "binary", "!==", left, right ];
+                            case "!==" : return [ "binary", "===", left, right ];
+                            case "&&"  : return best_of(not_c, [ "binary", "||", negate(left), negate(right) ]);
+                            case "||"  : return best_of(not_c, [ "binary", "&&", negate(left), negate(right) ]);
+                        }
+                        break;
+                }
+                return not_c;
+        };
+
+        function with_scope(s, cont) {
+                var _scope = scope;
+                scope = s;
+                var ret = cont();
+                ret.scope = s;
+                scope = _scope;
+                return ret;
+        };
+
+        function rmblock(block) {
+                if (block != null && block[0] == "block" && block[1]) {
+                        if (block[1].length == 1)
+                                block = block[1][0];
+                        else if (block[1].length == 0)
+                                block = [ "block" ];
+                }
+                return block;
+        };
+
+        function _lambda(name, args, body) {
+                var is_defun = this[0] == "defun";
+                body = with_scope(body.scope, function(){
+                        var ret = tighten(MAP(body, walk), "lambda");
+                        if (!is_defun && name && !HOP(scope.refs, name))
+                                name = null;
+                        return ret;
+                });
+                return [ this[0], name, args, body ];
+        };
+
+        // we get here for blocks that have been already transformed.
+        // this function does a few things:
+        // 1. discard useless blocks
+        // 2. join consecutive var declarations
+        // 3. remove obviously dead code
+        // 4. transform consecutive statements using the comma operator
+        // 5. if block_type == "lambda" and it detects constructs like if(foo) return ... - rewrite like if (!foo) { ... }
+        function tighten(statements, block_type) {
+                statements = statements.reduce(function(a, stat){
+                        if (stat[0] == "block") {
+                                if (stat[1]) {
+                                        a.push.apply(a, stat[1]);
+                                }
+                        } else {
+                                a.push(stat);
+                        }
+                        return a;
+                }, []);
+
+                statements = (function(a, prev){
+                        statements.forEach(function(cur){
+                                if (prev && ((cur[0] == "var" && prev[0] == "var") ||
+                                             (cur[0] == "const" && prev[0] == "const"))) {
+                                        prev[1] = prev[1].concat(cur[1]);
+                                } else {
+                                        a.push(cur);
+                                        prev = cur;
+                                }
+                        });
+                        return a;
+                })([]);
+
+                if (options.dead_code) statements = (function(a, has_quit){
+                        statements.forEach(function(st){
+                                if (has_quit) {
+                                        if (member(st[0], [ "function", "defun" , "var", "const" ])) {
+                                                a.push(st);
+                                        }
+                                        else if (!options.no_warnings)
+                                                warn_unreachable(st);
+                                }
+                                else {
+                                        a.push(st);
+                                        if (member(st[0], [ "return", "throw", "break", "continue" ]))
+                                                has_quit = true;
+                                }
+                        });
+                        return a;
+                })([]);
+
+                if (options.make_seqs) statements = (function(a, prev) {
+                        statements.forEach(function(cur){
+                                if (prev && prev[0] == "stat" && cur[0] == "stat") {
+                                        prev[1] = [ "seq", prev[1], cur[1] ];
+                                } else {
+                                        a.push(cur);
+                                        prev = cur;
+                                }
+                        });
+                        return a;
+                })([]);
+
+                if (block_type == "lambda") statements = (function(i, a, stat){
+                        while (i < statements.length) {
+                                stat = statements[i++];
+                                if (stat[0] == "if" && !stat[3]) {
+                                        if (stat[2][0] == "return" && stat[2][1] == null) {
+                                                a.push(make_if(negate(stat[1]), [ "block", statements.slice(i) ]));
+                                                break;
+                                        }
+                                        var last = last_stat(stat[2]);
+                                        if (last[0] == "return" && last[1] == null) {
+                                                a.push(make_if(stat[1], [ "block", stat[2][1].slice(0, -1) ], [ "block", statements.slice(i) ]));
+                                                break;
+                                        }
+                                }
+                                a.push(stat);
+                        }
+                        return a;
+                })(0, []);
+
+                return statements;
+        };
+
+        function make_if(c, t, e) {
+                return when_constant(c, function(ast, val){
+                        if (val) {
+                                warn_unreachable(e);
+                                return t;
+                        } else {
+                                warn_unreachable(t);
+                                return e;
+                        }
+                }, function() {
+                        return make_real_if(c, t, e);
+                });
+        };
+
+        function make_real_if(c, t, e) {
+                c = walk(c);
+                t = walk(t);
+                e = walk(e);
+
+                if (empty(t)) {
+                        c = negate(c);
+                        t = e;
+                        e = null;
+                } else if (empty(e)) {
+                        e = null;
+                } else {
+                        // if we have both else and then, maybe it makes sense to switch them?
+                        (function(){
+                                var a = gen_code(c);
+                                var n = negate(c);
+                                var b = gen_code(n);
+                                if (b.length < a.length) {
+                                        var tmp = t;
+                                        t = e;
+                                        e = tmp;
+                                        c = n;
+                                }
+                        })();
+                }
+                if (empty(e) && empty(t))
+                        return [ "stat", c ];
+                var ret = [ "if", c, t, e ];
+                if (t[0] == "if" && empty(t[3]) && empty(e)) {
+                        ret = best_of(ret, walk([ "if", [ "binary", "&&", c, t[1] ], t[2] ]));
+                }
+                else if (t[0] == "stat") {
+                        if (e) {
+                                if (e[0] == "stat") {
+                                        ret = best_of(ret, [ "stat", make_conditional(c, t[1], e[1]) ]);
+                                }
+                        }
+                        else {
+                                ret = best_of(ret, [ "stat", make_conditional(c, t[1]) ]);
+                        }
+                }
+                else if (e && t[0] == e[0] && (t[0] == "return" || t[0] == "throw") && t[1] && e[1]) {
+                        ret = best_of(ret, [ t[0], make_conditional(c, t[1], e[1] ) ]);
+                }
+                else if (e && aborts(t)) {
+                        ret = [ [ "if", c, t ] ];
+                        if (e[0] == "block") {
+                                if (e[1]) ret = ret.concat(e[1]);
+                        }
+                        else {
+                                ret.push(e);
+                        }
+                        ret = walk([ "block", ret ]);
+                }
+                else if (t && aborts(e)) {
+                        ret = [ [ "if", negate(c), e ] ];
+                        if (t[0] == "block") {
+                                if (t[1]) ret = ret.concat(t[1]);
+                        } else {
+                                ret.push(t);
+                        }
+                        ret = walk([ "block", ret ]);
+                }
+                return ret;
+        };
+
+        function _do_while(cond, body) {
+                return when_constant(cond, function(cond, val){
+                        if (!val) {
+                                warn_unreachable(body);
+                                return [ "block" ];
+                        } else {
+                                return [ "for", null, null, null, walk(body) ];
+                        }
+                });
+        };
+
+        return w.with_walkers({
+                "sub": function(expr, subscript) {
+                        if (subscript[0] == "string") {
+                                var name = subscript[1];
+                                if (is_identifier(name))
+                                        return [ "dot", walk(expr), name ];
+                                else if (/^[1-9][0-9]*$/.test(name) || name === "0")
+                                        return [ "sub", walk(expr), [ "num", parseInt(name, 10) ] ];
+                        }
+                },
+                "if": make_if,
+                "toplevel": function(body) {
+                        return [ "toplevel", with_scope(this.scope, function(){
+                                return tighten(MAP(body, walk));
+                        }) ];
+                },
+                "switch": function(expr, body) {
+                        var last = body.length - 1;
+                        return [ "switch", walk(expr), MAP(body, function(branch, i){
+                                var block = tighten(MAP(branch[1], walk));
+                                if (i == last && block.length > 0) {
+                                        var node = block[block.length - 1];
+                                        if (node[0] == "break" && !node[1])
+                                                block.pop();
+                                }
+                                return [ branch[0] ? walk(branch[0]) : null, block ];
+                        }) ];
+                },
+                "function": _lambda,
+                "defun": _lambda,
+                "block": function(body) {
+                        if (body) return rmblock([ "block", tighten(MAP(body, walk)) ]);
+                },
+                "binary": function(op, left, right) {
+                        return when_constant([ "binary", op, walk(left), walk(right) ], function yes(c){
+                                return best_of(walk(c), this);
+                        }, function no() {
+                                return this;
+                        });
+                },
+                "conditional": function(c, t, e) {
+                        return make_conditional(walk(c), walk(t), walk(e));
+                },
+                "try": function(t, c, f) {
+                        return [
+                                "try",
+                                tighten(MAP(t, walk)),
+                                c != null ? [ c[0], tighten(MAP(c[1], walk)) ] : null,
+                                f != null ? tighten(MAP(f, walk)) : null
+                        ];
+                },
+                "unary-prefix": function(op, expr) {
+                        expr = walk(expr);
+                        var ret = [ "unary-prefix", op, expr ];
+                        if (op == "!")
+                                ret = best_of(ret, negate(expr));
+                        return when_constant(ret, function(ast, val){
+                                return walk(ast); // it's either true or false, so minifies to !0 or !1
+                        }, function() { return ret });
+                },
+                "name": function(name) {
+                        switch (name) {
+                            case "true": return [ "unary-prefix", "!", [ "num", 0 ]];
+                            case "false": return [ "unary-prefix", "!", [ "num", 1 ]];
+                        }
+                },
+                "new": function(ctor, args) {
+                        if (ctor[0] == "name" && ctor[1] == "Array" && !scope.has("Array")) {
+                                if (args.length != 1) {
+                                        return [ "array", args ];
+                                } else {
+                                        return [ "call", [ "name", "Array" ], args ];
+                                }
+                        }
+                },
+                "call": function(expr, args) {
+                        if (expr[0] == "name" && expr[1] == "Array" && args.length != 1 && !scope.has("Array")) {
+                                return [ "array", args ];
+                        }
+                },
+                "while": _do_while
+        }, function() {
+                return walk(ast_add_scope(ast));
+        });
+};
+
+/* -----[ re-generate code from the AST ]----- */
+
+var DOT_CALL_NO_PARENS = jsp.array_to_hash([
+        "name",
+        "array",
+        "object",
+        "string",
+        "dot",
+        "sub",
+        "call",
+        "regexp"
+]);
+
+function make_string(str, ascii_only) {
+        var dq = 0, sq = 0;
+        str = str.replace(/[\\\b\f\n\r\t\x22\x27\u2028\u2029]/g, function(s){
+                switch (s) {
+                    case "\\": return "\\\\";
+                    case "\b": return "\\b";
+                    case "\f": return "\\f";
+                    case "\n": return "\\n";
+                    case "\r": return "\\r";
+                    case "\t": return "\\t";
+                    case "\u2028": return "\\u2028";
+                    case "\u2029": return "\\u2029";
+                    case '"': ++dq; return '"';
+                    case "'": ++sq; return "'";
+                }
+                return s;
+        });
+        if (ascii_only) str = to_ascii(str);
+        if (dq > sq) return "'" + str.replace(/\x27/g, "\\'") + "'";
+        else return '"' + str.replace(/\x22/g, '\\"') + '"';
+};
+
+function to_ascii(str) {
+        return str.replace(/[\u0080-\uffff]/g, function(ch) {
+                var code = ch.charCodeAt(0).toString(16);
+                while (code.length < 4) code = "0" + code;
+                return "\\u" + code;
+        });
+};
+
+var SPLICE_NEEDS_BRACKETS = jsp.array_to_hash([ "if", "while", "do", "for", "for-in", "with" ]);
+
+function gen_code(ast, options) {
+        options = defaults(options, {
+                indent_start : 0,
+                indent_level : 4,
+                quote_keys   : false,
+                space_colon  : false,
+                beautify     : false,
+                ascii_only   : false
+        });
+        var beautify = !!options.beautify;
+        var indentation = 0,
+            newline = beautify ? "\n" : "",
+            space = beautify ? " " : "";
+
+        function encode_string(str) {
+                return make_string(str, options.ascii_only);
+        };
+
+        function make_name(name) {
+                name = name.toString();
+                if (options.ascii_only)
+                        name = to_ascii(name);
+                return name;
+        };
+
+        function indent(line) {
+                if (line == null)
+                        line = "";
+                if (beautify)
+                        line = repeat_string(" ", options.indent_start + indentation * options.indent_level) + line;
+                return line;
+        };
+
+        function with_indent(cont, incr) {
+                if (incr == null) incr = 1;
+                indentation += incr;
+                try { return cont.apply(null, slice(arguments, 1)); }
+                finally { indentation -= incr; }
+        };
+
+        function add_spaces(a) {
+                if (beautify)
+                        return a.join(" ");
+                var b = [];
+                for (var i = 0; i < a.length; ++i) {
+                        var next = a[i + 1];
+                        b.push(a[i]);
+                        if (next &&
+                            ((/[a-z0-9_\x24]$/i.test(a[i].toString()) && /^[a-z0-9_\x24]/i.test(next.toString())) ||
+                             (/[\+\-]$/.test(a[i].toString()) && /^[\+\-]/.test(next.toString())))) {
+                                b.push(" ");
+                        }
+                }
+                return b.join("");
+        };
+
+        function add_commas(a) {
+                return a.join("," + space);
+        };
+
+        function parenthesize(expr) {
+                var gen = make(expr);
+                for (var i = 1; i < arguments.length; ++i) {
+                        var el = arguments[i];
+                        if ((el instanceof Function && el(expr)) || expr[0] == el)
+                                return "(" + gen + ")";
+                }
+                return gen;
+        };
+
+        function best_of(a) {
+                if (a.length == 1) {
+                        return a[0];
+                }
+                if (a.length == 2) {
+                        var b = a[1];
+                        a = a[0];
+                        return a.length <= b.length ? a : b;
+                }
+                return best_of([ a[0], best_of(a.slice(1)) ]);
+        };
+
+        function needs_parens(expr) {
+                if (expr[0] == "function" || expr[0] == "object") {
+                        // dot/call on a literal function requires the
+                        // function literal itself to be parenthesized
+                        // only if it's the first "thing" in a
+                        // statement.  This means that the parent is
+                        // "stat", but it could also be a "seq" and
+                        // we're the first in this "seq" and the
+                        // parent is "stat", and so on.  Messy stuff,
+                        // but it worths the trouble.
+                        var a = slice($stack), self = a.pop(), p = a.pop();
+                        while (p) {
+                                if (p[0] == "stat") return true;
+                                if (((p[0] == "seq" || p[0] == "call" || p[0] == "dot" || p[0] == "sub" || p[0] == "conditional") && p[1] === self) ||
+                                    ((p[0] == "binary" || p[0] == "assign" || p[0] == "unary-postfix") && p[2] === self)) {
+                                        self = p;
+                                        p = a.pop();
+                                } else {
+                                        return false;
+                                }
+                        }
+                }
+                return !HOP(DOT_CALL_NO_PARENS, expr[0]);
+        };
+
+        function make_num(num) {
+                var str = num.toString(10), a = [ str.replace(/^0\./, ".") ], m;
+                if (Math.floor(num) === num) {
+                        a.push("0x" + num.toString(16).toLowerCase(), // probably pointless
+                               "0" + num.toString(8)); // same.
+                        if ((m = /^(.*?)(0+)$/.exec(num))) {
+                                a.push(m[1] + "e" + m[2].length);
+                        }
+                } else if ((m = /^0?\.(0+)(.*)$/.exec(num))) {
+                        a.push(m[2] + "e-" + (m[1].length + m[2].length),
+                               str.substr(str.indexOf(".")));
+                }
+                return best_of(a);
+        };
+
+        var generators = {
+                "string": encode_string,
+                "num": make_num,
+                "name": make_name,
+                "toplevel": function(statements) {
+                        return make_block_statements(statements)
+                                .join(newline + newline);
+                },
+                "splice": function(statements) {
+                        var parent = $stack[$stack.length - 2][0];
+                        if (HOP(SPLICE_NEEDS_BRACKETS, parent)) {
+                                // we need block brackets in this case
+                                return make_block.apply(this, arguments);
+                        } else {
+                                return MAP(make_block_statements(statements, true),
+                                           function(line, i) {
+                                                   // the first line is already indented
+                                                   return i > 0 ? indent(line) : line;
+                                           }).join(newline);
+                        }
+                },
+                "block": make_block,
+                "var": function(defs) {
+                        return "var " + add_commas(MAP(defs, make_1vardef)) + ";";
+                },
+                "const": function(defs) {
+                        return "const " + add_commas(MAP(defs, make_1vardef)) + ";";
+                },
+                "try": function(tr, ca, fi) {
+                        var out = [ "try", make_block(tr) ];
+                        if (ca) out.push("catch", "(" + ca[0] + ")", make_block(ca[1]));
+                        if (fi) out.push("finally", make_block(fi));
+                        return add_spaces(out);
+                },
+                "throw": function(expr) {
+                        return add_spaces([ "throw", make(expr) ]) + ";";
+                },
+                "new": function(ctor, args) {
+                        args = args.length > 0 ? "(" + add_commas(MAP(args, make)) + ")" : "";
+                        return add_spaces([ "new", parenthesize(ctor, "seq", "binary", "conditional", "assign", function(expr){
+                                var w = ast_walker(), has_call = {};
+                                try {
+                                        w.with_walkers({
+                                                "call": function() { throw has_call },
+                                                "function": function() { return this }
+                                        }, function(){
+                                                w.walk(expr);
+                                        });
+                                } catch(ex) {
+                                        if (ex === has_call)
+                                                return true;
+                                        throw ex;
+                                }
+                        }) + args ]);
+                },
+                "switch": function(expr, body) {
+                        return add_spaces([ "switch", "(" + make(expr) + ")", make_switch_block(body) ]);
+                },
+                "break": function(label) {
+                        var out = "break";
+                        if (label != null)
+                                out += " " + make_name(label);
+                        return out + ";";
+                },
+                "continue": function(label) {
+                        var out = "continue";
+                        if (label != null)
+                                out += " " + make_name(label);
+                        return out + ";";
+                },
+                "conditional": function(co, th, el) {
+                        return add_spaces([ parenthesize(co, "assign", "seq", "conditional"), "?",
+                                            parenthesize(th, "seq"), ":",
+                                            parenthesize(el, "seq") ]);
+                },
+                "assign": function(op, lvalue, rvalue) {
+                        if (op && op !== true) op += "=";
+                        else op = "=";
+                        return add_spaces([ make(lvalue), op, parenthesize(rvalue, "seq") ]);
+                },
+                "dot": function(expr) {
+                        var out = make(expr), i = 1;
+                        if (expr[0] == "num") {
+                                if (!/\./.test(expr[1]))
+                                        out += ".";
+                        } else if (needs_parens(expr))
+                                out = "(" + out + ")";
+                        while (i < arguments.length)
+                                out += "." + make_name(arguments[i++]);
+                        return out;
+                },
+                "call": function(func, args) {
+                        var f = make(func);
+                        if (needs_parens(func))
+                                f = "(" + f + ")";
+                        return f + "(" + add_commas(MAP(args, function(expr){
+                                return parenthesize(expr, "seq");
+                        })) + ")";
+                },
+                "function": make_function,
+                "defun": make_function,
+                "if": function(co, th, el) {
+                        var out = [ "if", "(" + make(co) + ")", el ? make_then(th) : make(th) ];
+                        if (el) {
+                                out.push("else", make(el));
+                        }
+                        return add_spaces(out);
+                },
+                "for": function(init, cond, step, block) {
+                        var out = [ "for" ];
+                        init = (init != null ? make(init) : "").replace(/;*\s*$/, ";" + space);
+                        cond = (cond != null ? make(cond) : "").replace(/;*\s*$/, ";" + space);
+                        step = (step != null ? make(step) : "").replace(/;*\s*$/, "");
+                        var args = init + cond + step;
+                        if (args == "; ; ") args = ";;";
+                        out.push("(" + args + ")", make(block));
+                        return add_spaces(out);
+                },
+                "for-in": function(vvar, key, hash, block) {
+                        return add_spaces([ "for", "(" +
+                                            (vvar ? make(vvar).replace(/;+$/, "") : make(key)),
+                                            "in",
+                                            make(hash) + ")", make(block) ]);
+                },
+                "while": function(condition, block) {
+                        return add_spaces([ "while", "(" + make(condition) + ")", make(block) ]);
+                },
+                "do": function(condition, block) {
+                        return add_spaces([ "do", make(block), "while", "(" + make(condition) + ")" ]) + ";";
+                },
+                "return": function(expr) {
+                        var out = [ "return" ];
+                        if (expr != null) out.push(make(expr));
+                        return add_spaces(out) + ";";
+                },
+                "binary": function(operator, lvalue, rvalue) {
+                        var left = make(lvalue), right = make(rvalue);
+                        // XXX: I'm pretty sure other cases will bite here.
+                        //      we need to be smarter.
+                        //      adding parens all the time is the safest bet.
+                        if (member(lvalue[0], [ "assign", "conditional", "seq" ]) ||
+                            lvalue[0] == "binary" && PRECEDENCE[operator] > PRECEDENCE[lvalue[1]]) {
+                                left = "(" + left + ")";
+                        }
+                        if (member(rvalue[0], [ "assign", "conditional", "seq" ]) ||
+                            rvalue[0] == "binary" && PRECEDENCE[operator] >= PRECEDENCE[rvalue[1]] &&
+                            !(rvalue[1] == operator && member(operator, [ "&&", "||", "*" ]))) {
+                                right = "(" + right + ")";
+                        }
+                        return add_spaces([ left, operator, right ]);
+                },
+                "unary-prefix": function(operator, expr) {
+                        var val = make(expr);
+                        if (!(expr[0] == "num" || (expr[0] == "unary-prefix" && !HOP(OPERATORS, operator + expr[1])) || !needs_parens(expr)))
+                                val = "(" + val + ")";
+                        return operator + (jsp.is_alphanumeric_char(operator.charAt(0)) ? " " : "") + val;
+                },
+                "unary-postfix": function(operator, expr) {
+                        var val = make(expr);
+                        if (!(expr[0] == "num" || (expr[0] == "unary-postfix" && !HOP(OPERATORS, operator + expr[1])) || !needs_parens(expr)))
+                                val = "(" + val + ")";
+                        return val + operator;
+                },
+                "sub": function(expr, subscript) {
+                        var hash = make(expr);
+                        if (needs_parens(expr))
+                                hash = "(" + hash + ")";
+                        return hash + "[" + make(subscript) + "]";
+                },
+                "object": function(props) {
+                        if (props.length == 0)
+                                return "{}";
+                        return "{" + newline + with_indent(function(){
+                                return MAP(props, function(p){
+                                        if (p.length == 3) {
+                                                // getter/setter.  The name is in p[0], the arg.list in p[1][2], the
+                                                // body in p[1][3] and type ("get" / "set") in p[2].
+                                                return indent(make_function(p[0], p[1][2], p[1][3], p[2]));
+                                        }
+                                        var key = p[0], val = make(p[1]);
+                                        if (options.quote_keys) {
+                                                key = encode_string(key);
+                                        } else if ((typeof key == "number" || !beautify && +key + "" == key)
+                                                   && parseFloat(key) >= 0) {
+                                                key = make_num(+key);
+                                        } else if (!is_identifier(key)) {
+                                                key = encode_string(key);
+                                        }
+                                        return indent(add_spaces(beautify && options.space_colon
+                                                                 ? [ key, ":", val ]
+                                                                 : [ key + ":", val ]));
+                                }).join("," + newline);
+                        }) + newline + indent("}");
+                },
+                "regexp": function(rx, mods) {
+                        return "/" + rx + "/" + mods;
+                },
+                "array": function(elements) {
+                        if (elements.length == 0) return "[]";
+                        return add_spaces([ "[", add_commas(MAP(elements, function(el){
+                                if (!beautify && el[0] == "atom" && el[1] == "undefined") return "";
+                                return parenthesize(el, "seq");
+                        })), "]" ]);
+                },
+                "stat": function(stmt) {
+                        return make(stmt).replace(/;*\s*$/, ";");
+                },
+                "seq": function() {
+                        return add_commas(MAP(slice(arguments), make));
+                },
+                "label": function(name, block) {
+                        return add_spaces([ make_name(name), ":", make(block) ]);
+                },
+                "with": function(expr, block) {
+                        return add_spaces([ "with", "(" + make(expr) + ")", make(block) ]);
+                },
+                "atom": function(name) {
+                        return make_name(name);
+                }
+        };
+
+        // The squeezer replaces "block"-s that contain only a single
+        // statement with the statement itself; technically, the AST
+        // is correct, but this can create problems when we output an
+        // IF having an ELSE clause where the THEN clause ends in an
+        // IF *without* an ELSE block (then the outer ELSE would refer
+        // to the inner IF).  This function checks for this case and
+        // adds the block brackets if needed.
+        function make_then(th) {
+                if (th[0] == "do") {
+                        // https://github.com/mishoo/UglifyJS/issues/#issue/57
+                        // IE croaks with "syntax error" on code like this:
+                        //     if (foo) do ... while(cond); else ...
+                        // we need block brackets around do/while
+                        return make([ "block", [ th ]]);
+                }
+                var b = th;
+                while (true) {
+                        var type = b[0];
+                        if (type == "if") {
+                                if (!b[3])
+                                        // no else, we must add the block
+                                        return make([ "block", [ th ]]);
+                                b = b[3];
+                        }
+                        else if (type == "while" || type == "do") b = b[2];
+                        else if (type == "for" || type == "for-in") b = b[4];
+                        else break;
+                }
+                return make(th);
+        };
+
+        function make_function(name, args, body, keyword) {
+                var out = keyword || "function";
+                if (name) {
+                        out += " " + make_name(name);
+                }
+                out += "(" + add_commas(MAP(args, make_name)) + ")";
+                return add_spaces([ out, make_block(body) ]);
+        };
+
+        function make_block_statements(statements, noindent) {
+                for (var a = [], last = statements.length - 1, i = 0; i <= last; ++i) {
+                        var stat = statements[i];
+                        var code = make(stat);
+                        if (code != ";") {
+                                if (!beautify && i == last) {
+                                        if ((stat[0] == "while" && empty(stat[2])) ||
+                                            (member(stat[0], [ "for", "for-in"] ) && empty(stat[4])) ||
+                                            (stat[0] == "if" && empty(stat[2]) && !stat[3]) ||
+                                            (stat[0] == "if" && stat[3] && empty(stat[3]))) {
+                                                code = code.replace(/;*\s*$/, ";");
+                                        } else {
+                                                code = code.replace(/;+\s*$/, "");
+                                        }
+                                }
+                                a.push(code);
+                        }
+                }
+                return noindent ? a : MAP(a, indent);
+        };
+
+        function make_switch_block(body) {
+                var n = body.length;
+                if (n == 0) return "{}";
+                return "{" + newline + MAP(body, function(branch, i){
+                        var has_body = branch[1].length > 0, code = with_indent(function(){
+                                return indent(branch[0]
+                                              ? add_spaces([ "case", make(branch[0]) + ":" ])
+                                              : "default:");
+                        }, 0.5) + (has_body ? newline + with_indent(function(){
+                                return make_block_statements(branch[1]).join(newline);
+                        }) : "");
+                        if (!beautify && has_body && i < n - 1)
+                                code += ";";
+                        return code;
+                }).join(newline) + newline + indent("}");
+        };
+
+        function make_block(statements) {
+                if (!statements) return ";";
+                if (statements.length == 0) return "{}";
+                return "{" + newline + with_indent(function(){
+                        return make_block_statements(statements).join(newline);
+                }) + newline + indent("}");
+        };
+
+        function make_1vardef(def) {
+                var name = def[0], val = def[1];
+                if (val != null)
+                        name = add_spaces([ make_name(name), "=", parenthesize(val, "seq") ]);
+                return name;
+        };
+
+        var $stack = [];
+
+        function make(node) {
+                var type = node[0];
+                var gen = generators[type];
+                if (!gen)
+                        throw new Error("Can't find generator for \"" + type + "\"");
+                $stack.push(node);
+                var ret = gen.apply(type, node.slice(1));
+                $stack.pop();
+                return ret;
+        };
+
+        return make(ast);
+};
+
+function split_lines(code, max_line_length) {
+        var splits = [ 0 ];
+        jsp.parse(function(){
+                var next_token = jsp.tokenizer(code);
+                var last_split = 0;
+                var prev_token;
+                function current_length(tok) {
+                        return tok.pos - last_split;
+                };
+                function split_here(tok) {
+                        last_split = tok.pos;
+                        splits.push(last_split);
+                };
+                function custom(){
+                        var tok = next_token.apply(this, arguments);
+                        out: {
+                                if (prev_token) {
+                                        if (prev_token.type == "keyword") break out;
+                                }
+                                if (current_length(tok) > max_line_length) {
+                                        switch (tok.type) {
+                                            case "keyword":
+                                            case "atom":
+                                            case "name":
+                                            case "punc":
+                                                split_here(tok);
+                                                break out;
+                                        }
+                                }
+                        }
+                        prev_token = tok;
+                        return tok;
+                };
+                custom.context = function() {
+                        return next_token.context.apply(this, arguments);
+                };
+                return custom;
+        }());
+        return splits.map(function(pos, i){
+                return code.substring(pos, splits[i + 1] || code.length);
+        }).join("\n");
+};
+
+/* -----[ Utilities ]----- */
+
+function repeat_string(str, i) {
+        if (i <= 0) return "";
+        if (i == 1) return str;
+        var d = repeat_string(str, i >> 1);
+        d += d;
+        if (i & 1) d += str;
+        return d;
+};
+
+function defaults(args, defs) {
+        var ret = {};
+        if (args === true)
+                args = {};
+        for (var i in defs) if (HOP(defs, i)) {
+                ret[i] = (args && HOP(args, i)) ? args[i] : defs[i];
+        }
+        return ret;
+};
+
+function is_identifier(name) {
+        return /^[a-z_$][a-z0-9_$]*$/i.test(name)
+                && name != "this"
+                && !HOP(jsp.KEYWORDS_ATOM, name)
+                && !HOP(jsp.RESERVED_WORDS, name)
+                && !HOP(jsp.KEYWORDS, name);
+};
+
+function HOP(obj, prop) {
+        return Object.prototype.hasOwnProperty.call(obj, prop);
+};
+
+// some utilities
+
+var MAP;
+
+(function(){
+        MAP = function(a, f, o) {
+                var ret = [];
+                for (var i = 0; i < a.length; ++i) {
+                        var val = f.call(o, a[i], i);
+                        if (val instanceof AtTop) ret.unshift(val.v);
+                        else ret.push(val);
+                }
+                return ret;
+        };
+        MAP.at_top = function(val) { return new AtTop(val) };
+        function AtTop(val) { this.v = val };
+})();
+
+/* -----[ Exports ]----- */
+
+exports.ast_walker = ast_walker;
+exports.ast_mangle = ast_mangle;
+exports.ast_squeeze = ast_squeeze;
+exports.gen_code = gen_code;
+exports.ast_add_scope = ast_add_scope;
+exports.set_logger = function(logger) { warn = logger };
+exports.make_string = make_string;
+exports.split_lines = split_lines;
+exports.MAP = MAP;
+
+// keep this last!
+exports.ast_squeeze_more = require("./squeeze-more").ast_squeeze_more;
diff --git a/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/lib/squeeze-more.js b/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/lib/squeeze-more.js
new file mode 100644
index 0000000..12380af
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/lib/squeeze-more.js
@@ -0,0 +1,22 @@
+var jsp = require("./parse-js"),
+    pro = require("./process"),
+    slice = jsp.slice,
+    member = jsp.member,
+    PRECEDENCE = jsp.PRECEDENCE,
+    OPERATORS = jsp.OPERATORS;
+
+function ast_squeeze_more(ast) {
+        var w = pro.ast_walker(), walk = w.walk;
+        return w.with_walkers({
+                "call": function(expr, args) {
+                        if (expr[0] == "dot" && expr[2] == "toString" && args.length == 0) {
+                                // foo.toString()  ==>  foo+""
+                                return [ "binary", "+", expr[1], [ "string", "" ]];
+                        }
+                }
+        }, function() {
+                return walk(ast);
+        });
+};
+
+exports.ast_squeeze_more = ast_squeeze_more;
diff --git a/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/package.json b/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/package.json
new file mode 100644
index 0000000..aba8cbb
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/package.json
@@ -0,0 +1,25 @@
+{
+  "name": "uglify-js",
+  "author": {
+    "name": "Mihai Bazon",
+    "email": "mihai.bazon at gmail.com",
+    "url": "http://mihai.bazon.net/blog"
+  },
+  "version": "1.0.2",
+  "main": "./uglify-js.js",
+  "bin": {
+    "uglifyjs": "./bin/uglifyjs"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git at github.com:mishoo/UglifyJS.git"
+  },
+  "readme": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n               \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\"\nlang=\"en\" xml:lang=\"en\">\n<head>\n<title>UglifyJS -- a JavaScript parser/compressor/beautifier</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\"/>\n<meta name=\"generator\" content=\"Org-mode\"/>\n<meta name=\"generated\" con [...]
+  "readmeFilename": "README.html",
+  "description": "<?xml version=\"1.0\" encoding=\"utf-8\"?> <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"                \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\"> <html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"en\" xml:lang=\"en\"> <head> <title>UglifyJS -- a JavaScript parser/compressor/beautifier</title> <meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\"/> <meta name=\"generator\" content=\"Org-mode\"/> <meta name=\"generated\" content [...]
+  "bugs": {
+    "url": "https://github.com/mishoo/UglifyJS/issues"
+  },
+  "_id": "uglify-js at 1.0.2",
+  "_from": "uglify-js at 1.0.2"
+}
diff --git a/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/tmp/instrument.js b/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/tmp/instrument.js
new file mode 100644
index 0000000..c6a9d79
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/tmp/instrument.js
@@ -0,0 +1,97 @@
+// sample on how to use the parser and walker API to instrument some code
+
+var jsp = require("uglify-js").parser;
+var pro = require("uglify-js").uglify;
+
+function instrument(code) {
+        var ast = jsp.parse(code, false, true); // true for the third arg specifies that we want
+                                                // to have start/end tokens embedded in the
+                                                // statements
+        var w = pro.ast_walker();
+
+        // we're gonna need this to push elements that we're currently looking at, to avoid
+        // endless recursion.
+        var analyzing = [];
+        function do_stat() {
+                var ret;
+                if (this[0].start && analyzing.indexOf(this) < 0) {
+                        // without the `analyzing' hack, w.walk(this) would re-enter here leading
+                        // to infinite recursion
+                        analyzing.push(this);
+                        ret = [ "splice", // XXX: "block" is safer
+                                [ [ "stat",
+                                    [ "call", [ "name", "trace" ],
+                                      [ [ "string", this[0].toString() ],
+                                        [ "num", this[0].start.line ],
+                                        [ "num", this[0].start.col ],
+                                        [ "num", this[0].end.line ],
+                                        [ "num", this[0].end.col ]]]],
+                                  w.walk(this) ]];
+                        analyzing.pop(this);
+                }
+                return ret;
+        };
+        var new_ast = w.with_walkers({
+                "stat"     : do_stat,
+                "label"    : do_stat,
+                "break"    : do_stat,
+                "continue" : do_stat,
+                "debugger" : do_stat,
+                "var"      : do_stat,
+                "const"    : do_stat,
+                "return"   : do_stat,
+                "throw"    : do_stat,
+                "try"      : do_stat,
+                "defun"    : do_stat,
+                "if"       : do_stat,
+                "while"    : do_stat,
+                "do"       : do_stat,
+                "for"      : do_stat,
+                "for-in"   : do_stat,
+                "switch"   : do_stat,
+                "with"     : do_stat
+        }, function(){
+                return w.walk(ast);
+        });
+        return pro.gen_code(new_ast, { beautify: true });
+}
+
+
+
+
+////// test code follows.
+
+var code = instrument(test.toString());
+console.log(code);
+
+function test() {
+        // simple stats
+        a = 5;
+        c += a + b;
+        "foo";
+
+        // var
+        var foo = 5;
+        const bar = 6, baz = 7;
+
+        // switch block.  note we can't track case lines the same way.
+        switch ("foo") {
+            case "foo":
+                return 1;
+            case "bar":
+                return 2;
+        }
+
+        // for/for in
+        for (var i = 0; i < 5; ++i) {
+                console.log("Hello " + i);
+        }
+        for (var i in [ 1, 2, 3]) {
+                console.log(i);
+        }
+
+        // note however that the following is broken.  I guess we
+        // should add the block brackets in this case...
+        for (var i = 0; i < 5; ++i)
+                console.log("foo");
+}
diff --git a/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/tmp/instrument2.js b/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/tmp/instrument2.js
new file mode 100644
index 0000000..6aee5f3
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/tmp/instrument2.js
@@ -0,0 +1,138 @@
+// sample on how to use the parser and walker API to instrument some code
+
+var jsp = require("uglify-js").parser;
+var pro = require("uglify-js").uglify;
+
+function instrument(code) {
+        var ast = jsp.parse(code, false, true); // true for the third arg specifies that we want
+                                                // to have start/end tokens embedded in the
+                                                // statements
+        var w = pro.ast_walker();
+
+        function trace (line, comment) {
+                var code = pro.gen_code(line, { beautify: true });
+                var data = line[0]
+
+                var args = []
+                if (!comment) comment = ""
+                if (typeof data === "object") {
+                        code = code.split(/\n/).shift()
+                        args = [ [ "string", data.toString() ],
+                                 [ "string", code ],
+                                 [ "num", data.start.line ],
+                                 [ "num", data.start.col ],
+                                 [ "num", data.end.line ],
+                                 [ "num", data.end.col ]]
+                } else {
+                        args = [ [ "string", data ],
+                                 [ "string", code ]]
+
+                }
+                return [ "call", [ "name", "trace" ], args ];
+        }
+
+        // we're gonna need this to push elements that we're currently looking at, to avoid
+        // endless recursion.
+        var analyzing = [];
+        function do_stat() {
+                var ret;
+                if (this[0].start && analyzing.indexOf(this) < 0) {
+                        // without the `analyzing' hack, w.walk(this) would re-enter here leading
+                        // to infinite recursion
+                        analyzing.push(this);
+                        ret = [ "splice",
+                                [ [ "stat", trace(this) ],
+                                  w.walk(this) ]];
+                        analyzing.pop(this);
+                }
+                return ret;
+        }
+
+        function do_cond(c, t, f) {
+                return [ this[0], w.walk(c),
+                         ["seq", trace(t), w.walk(t) ],
+                         ["seq", trace(f), w.walk(f) ]];
+        }
+
+        function do_binary(c, l, r) {
+                if (c !== "&&" && c !== "||") {
+                        return [this[0], c, w.walk(l), w.walk(r)];
+                }
+                return [ this[0], c,
+                         ["seq", trace(l), w.walk(l) ],
+                         ["seq", trace(r), w.walk(r) ]];
+        }
+
+        var new_ast = w.with_walkers({
+                "stat"        : do_stat,
+                "label"       : do_stat,
+                "break"       : do_stat,
+                "continue"    : do_stat,
+                "debugger"    : do_stat,
+                "var"         : do_stat,
+                "const"       : do_stat,
+                "return"      : do_stat,
+                "throw"       : do_stat,
+                "try"         : do_stat,
+                "defun"       : do_stat,
+                "if"          : do_stat,
+                "while"       : do_stat,
+                "do"          : do_stat,
+                "for"         : do_stat,
+                "for-in"      : do_stat,
+                "switch"      : do_stat,
+                "with"        : do_stat,
+                "conditional" : do_cond,
+                "binary"      : do_binary
+        }, function(){
+                return w.walk(ast);
+        });
+        return pro.gen_code(new_ast, { beautify: true });
+}
+
+
+////// test code follows.
+
+var code = instrument(test.toString());
+console.log(code);
+
+function test() {
+        // simple stats
+        a = 5;
+        c += a + b;
+        "foo";
+
+        // var
+        var foo = 5;
+        const bar = 6, baz = 7;
+
+        // switch block.  note we can't track case lines the same way.
+        switch ("foo") {
+            case "foo":
+                return 1;
+            case "bar":
+                return 2;
+        }
+
+        // for/for in
+        for (var i = 0; i < 5; ++i) {
+                console.log("Hello " + i);
+        }
+        for (var i in [ 1, 2, 3]) {
+                console.log(i);
+        }
+
+        for (var i = 0; i < 5; ++i)
+                console.log("foo");
+
+        for (var i = 0; i < 5; ++i) {
+                console.log("foo");
+        }
+
+        var k = plurp() ? 1 : 0;
+        var x = a ? doX(y) && goZoo("zoo")
+              : b ? blerg({ x: y })
+              : null;
+
+        var x = X || Y;
+}
diff --git a/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/uglify-js.js b/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/uglify-js.js
new file mode 100644
index 0000000..4305e23
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/mirror/node_modules/uglify-js/uglify-js.js
@@ -0,0 +1,17 @@
+//convienence function(src, [options]);
+function uglify(orig_code, options){
+  options || (options = {});
+  var jsp = uglify.parser;
+  var pro = uglify.uglify;
+
+  var ast = jsp.parse(orig_code, options.strict_semicolons); // parse code and get the initial AST
+  ast = pro.ast_mangle(ast, options.mangle_options); // get a new AST with mangled names
+  ast = pro.ast_squeeze(ast, options.squeeze_options); // get an AST with compression optimizations
+  var final_code = pro.gen_code(ast, options.gen_options); // compressed code here
+  return final_code;
+};
+
+uglify.parser = require("./lib/parse-js");
+uglify.uglify = require("./lib/process");
+
+module.exports = uglify
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/mirror/package.json b/debian/node_modules/bones/node_modules/mirror/package.json
new file mode 100644
index 0000000..c734701
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/mirror/package.json
@@ -0,0 +1,22 @@
+{
+  "name": "mirror",
+  "version": "0.3.3",
+  "author": {
+    "name": "Development Seed",
+    "email": "info at developmentseed.org",
+    "url": "http://www.developmentseed.org"
+  },
+  "main": "./mirror",
+  "dependencies": {
+    "uglify-js": "1.0.2"
+  },
+  "devDependencies": {
+    "express": "2.3.x",
+    "expresso": "0.7.x"
+  },
+  "readme": "# Mirror\n\nAggregates JavaScript, CSS and any other text files for serving them to browsers with [express](http://expressjs.com/). Supports wrapping and postprocessing outputs. A *mirror* can contain files, plain source code or other mirrors.\n\n### Usage\n\n```javascript\nvar mirror = require('mirror');\n\n// Mirror guesses the MIME type based on the first file's extension.\nvar styles = new mirror([\n    __dirname + '/assets/main.css',\n    __dirname + '/assets/layout.css [...]
+  "readmeFilename": "README.md",
+  "description": "Aggregates JavaScript, CSS and any other text files for serving them to browsers with [express](http://expressjs.com/). Supports wrapping and postprocessing outputs. A *mirror* can contain files, plain source code or other mirrors.",
+  "_id": "mirror at 0.3.3",
+  "_from": "mirror@~0.3.3"
+}
diff --git a/debian/node_modules/bones/node_modules/optimist/.travis.yml b/debian/node_modules/bones/node_modules/optimist/.travis.yml
new file mode 100644
index 0000000..cc4dba2
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/optimist/.travis.yml
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+  - "0.8"
+  - "0.10"
diff --git a/debian/node_modules/bones/node_modules/optimist/LICENSE b/debian/node_modules/bones/node_modules/optimist/LICENSE
new file mode 100644
index 0000000..432d1ae
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/optimist/LICENSE
@@ -0,0 +1,21 @@
+Copyright 2010 James Halliday (mail at 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/debian/node_modules/bones/node_modules/optimist/example/bool.js b/debian/node_modules/bones/node_modules/optimist/example/bool.js
new file mode 100644
index 0000000..a998fb7
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/optimist/example/bool.js
@@ -0,0 +1,10 @@
+#!/usr/bin/env node
+var util = require('util');
+var argv = require('optimist').argv;
+
+if (argv.s) {
+    util.print(argv.fr ? 'Le chat dit: ' : 'The cat says: ');
+}
+console.log(
+    (argv.fr ? 'miaou' : 'meow') + (argv.p ? '.' : '')
+);
diff --git a/debian/node_modules/bones/node_modules/optimist/example/boolean_double.js b/debian/node_modules/bones/node_modules/optimist/example/boolean_double.js
new file mode 100644
index 0000000..a35a7e6
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/optimist/example/boolean_double.js
@@ -0,0 +1,7 @@
+#!/usr/bin/env node
+var argv = require('optimist')
+    .boolean(['x','y','z'])
+    .argv
+;
+console.dir([ argv.x, argv.y, argv.z ]);
+console.dir(argv._);
diff --git a/debian/node_modules/bones/node_modules/optimist/example/boolean_single.js b/debian/node_modules/bones/node_modules/optimist/example/boolean_single.js
new file mode 100644
index 0000000..017bb68
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/optimist/example/boolean_single.js
@@ -0,0 +1,7 @@
+#!/usr/bin/env node
+var argv = require('optimist')
+    .boolean('v')
+    .argv
+;
+console.dir(argv.v);
+console.dir(argv._);
diff --git a/debian/node_modules/bones/node_modules/optimist/example/default_hash.js b/debian/node_modules/bones/node_modules/optimist/example/default_hash.js
new file mode 100644
index 0000000..ade7768
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/optimist/example/default_hash.js
@@ -0,0 +1,8 @@
+#!/usr/bin/env node
+
+var argv = require('optimist')
+    .default({ x : 10, y : 10 })
+    .argv
+;
+
+console.log(argv.x + argv.y);
diff --git a/debian/node_modules/bones/node_modules/optimist/example/default_singles.js b/debian/node_modules/bones/node_modules/optimist/example/default_singles.js
new file mode 100644
index 0000000..d9b1ff4
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/optimist/example/default_singles.js
@@ -0,0 +1,7 @@
+#!/usr/bin/env node
+var argv = require('optimist')
+    .default('x', 10)
+    .default('y', 10)
+    .argv
+;
+console.log(argv.x + argv.y);
diff --git a/debian/node_modules/bones/node_modules/optimist/example/divide.js b/debian/node_modules/bones/node_modules/optimist/example/divide.js
new file mode 100644
index 0000000..5e2ee82
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/optimist/example/divide.js
@@ -0,0 +1,8 @@
+#!/usr/bin/env node
+
+var argv = require('optimist')
+    .usage('Usage: $0 -x [num] -y [num]')
+    .demand(['x','y'])
+    .argv;
+
+console.log(argv.x / argv.y);
diff --git a/debian/node_modules/bones/node_modules/optimist/example/line_count.js b/debian/node_modules/bones/node_modules/optimist/example/line_count.js
new file mode 100644
index 0000000..b5f95bf
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/optimist/example/line_count.js
@@ -0,0 +1,20 @@
+#!/usr/bin/env node
+var argv = require('optimist')
+    .usage('Count the lines in a file.\nUsage: $0')
+    .demand('f')
+    .alias('f', 'file')
+    .describe('f', 'Load a file')
+    .argv
+;
+
+var fs = require('fs');
+var s = fs.createReadStream(argv.file);
+
+var lines = 0;
+s.on('data', function (buf) {
+    lines += buf.toString().match(/\n/g).length;
+});
+
+s.on('end', function () {
+    console.log(lines);
+});
diff --git a/debian/node_modules/bones/node_modules/optimist/example/line_count_options.js b/debian/node_modules/bones/node_modules/optimist/example/line_count_options.js
new file mode 100644
index 0000000..d9ac709
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/optimist/example/line_count_options.js
@@ -0,0 +1,29 @@
+#!/usr/bin/env node
+var argv = require('optimist')
+    .usage('Count the lines in a file.\nUsage: $0')
+    .options({
+        file : {
+            demand : true,
+            alias : 'f',
+            description : 'Load a file'
+        },
+        base : {
+            alias : 'b',
+            description : 'Numeric base to use for output',
+            default : 10,
+        },
+    })
+    .argv
+;
+
+var fs = require('fs');
+var s = fs.createReadStream(argv.file);
+
+var lines = 0;
+s.on('data', function (buf) {
+    lines += buf.toString().match(/\n/g).length;
+});
+
+s.on('end', function () {
+    console.log(lines.toString(argv.base));
+});
diff --git a/debian/node_modules/bones/node_modules/optimist/example/line_count_wrap.js b/debian/node_modules/bones/node_modules/optimist/example/line_count_wrap.js
new file mode 100644
index 0000000..4267511
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/optimist/example/line_count_wrap.js
@@ -0,0 +1,29 @@
+#!/usr/bin/env node
+var argv = require('optimist')
+    .usage('Count the lines in a file.\nUsage: $0')
+    .wrap(80)
+    .demand('f')
+    .alias('f', [ 'file', 'filename' ])
+    .describe('f',
+        "Load a file. It's pretty important."
+        + " Required even. So you'd better specify it."
+    )
+    .alias('b', 'base')
+    .describe('b', 'Numeric base to display the number of lines in')
+    .default('b', 10)
+    .describe('x', 'Super-secret optional parameter which is secret')
+    .default('x', '')
+    .argv
+;
+
+var fs = require('fs');
+var s = fs.createReadStream(argv.file);
+
+var lines = 0;
+s.on('data', function (buf) {
+    lines += buf.toString().match(/\n/g).length;
+});
+
+s.on('end', function () {
+    console.log(lines.toString(argv.base));
+});
diff --git a/debian/node_modules/bones/node_modules/optimist/example/nonopt.js b/debian/node_modules/bones/node_modules/optimist/example/nonopt.js
new file mode 100644
index 0000000..ee633ee
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/optimist/example/nonopt.js
@@ -0,0 +1,4 @@
+#!/usr/bin/env node
+var argv = require('optimist').argv;
+console.log('(%d,%d)', argv.x, argv.y);
+console.log(argv._);
diff --git a/debian/node_modules/bones/node_modules/optimist/example/reflect.js b/debian/node_modules/bones/node_modules/optimist/example/reflect.js
new file mode 100644
index 0000000..816b3e1
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/optimist/example/reflect.js
@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+console.dir(require('optimist').argv);
diff --git a/debian/node_modules/bones/node_modules/optimist/example/short.js b/debian/node_modules/bones/node_modules/optimist/example/short.js
new file mode 100644
index 0000000..1db0ad0
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/optimist/example/short.js
@@ -0,0 +1,3 @@
+#!/usr/bin/env node
+var argv = require('optimist').argv;
+console.log('(%d,%d)', argv.x, argv.y);
diff --git a/debian/node_modules/bones/node_modules/optimist/example/string.js b/debian/node_modules/bones/node_modules/optimist/example/string.js
new file mode 100644
index 0000000..a8e5aeb
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/optimist/example/string.js
@@ -0,0 +1,11 @@
+#!/usr/bin/env node
+var argv = require('optimist')
+    .string('x', 'y')
+    .argv
+;
+console.dir([ argv.x, argv.y ]);
+
+/* Turns off numeric coercion:
+    ./node string.js -x 000123 -y 9876
+    [ '000123', '9876' ]
+*/
diff --git a/debian/node_modules/bones/node_modules/optimist/example/usage-options.js b/debian/node_modules/bones/node_modules/optimist/example/usage-options.js
new file mode 100644
index 0000000..b999977
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/optimist/example/usage-options.js
@@ -0,0 +1,19 @@
+var optimist = require('./../index');
+
+var argv = optimist.usage('This is my awesome program', {
+  'about': {
+    description: 'Provide some details about the author of this program',
+    required: true,
+    short: 'a',
+  },
+  'info': {
+    description: 'Provide some information about the node.js agains!!!!!!',
+    boolean: true,
+    short: 'i'
+  }
+}).argv;
+
+optimist.showHelp();
+
+console.log('\n\nInspecting options');
+console.dir(argv);
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/optimist/example/xup.js b/debian/node_modules/bones/node_modules/optimist/example/xup.js
new file mode 100644
index 0000000..8f6ecd2
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/optimist/example/xup.js
@@ -0,0 +1,10 @@
+#!/usr/bin/env node
+var argv = require('optimist').argv;
+
+if (argv.rif - 5 * argv.xup > 7.138) {
+    console.log('Buy more riffiwobbles');
+}
+else {
+    console.log('Sell the xupptumblers');
+}
+
diff --git a/debian/node_modules/bones/node_modules/optimist/index.js b/debian/node_modules/bones/node_modules/optimist/index.js
new file mode 100644
index 0000000..f6c6e22
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/optimist/index.js
@@ -0,0 +1,485 @@
+var path = require('path');
+var wordwrap = require('wordwrap');
+
+/*  Hack an instance of Argv with process.argv into Argv
+    so people can do
+        require('optimist')(['--beeble=1','-z','zizzle']).argv
+    to parse a list of args and
+        require('optimist').argv
+    to get a parsed version of process.argv.
+*/
+
+var inst = Argv(process.argv.slice(2));
+Object.keys(inst).forEach(function (key) {
+    Argv[key] = typeof inst[key] == 'function'
+        ? inst[key].bind(inst)
+        : inst[key];
+});
+
+var exports = module.exports = Argv;
+function Argv (args, cwd) {
+    var self = {};
+    if (!cwd) cwd = process.cwd();
+    
+    self.$0 = process.argv
+        .slice(0,2)
+        .map(function (x) {
+            var b = rebase(cwd, x);
+            return x.match(/^\//) && b.length < x.length
+                ? b : x
+        })
+        .join(' ')
+    ;
+    
+    if (process.env._ != undefined && process.argv[1] == process.env._) {
+        self.$0 = process.env._.replace(
+            path.dirname(process.execPath) + '/', ''
+        );
+    }
+    
+    var flags = { bools : {}, strings : {} };
+    
+    self.boolean = function (bools) {
+        if (!Array.isArray(bools)) {
+            bools = [].slice.call(arguments);
+        }
+        
+        bools.forEach(function (name) {
+            flags.bools[name] = true;
+        });
+        
+        return self;
+    };
+    
+    self.string = function (strings) {
+        if (!Array.isArray(strings)) {
+            strings = [].slice.call(arguments);
+        }
+        
+        strings.forEach(function (name) {
+            flags.strings[name] = true;
+        });
+        
+        return self;
+    };
+    
+    var aliases = {};
+    self.alias = function (x, y) {
+        if (typeof x === 'object') {
+            Object.keys(x).forEach(function (key) {
+                self.alias(key, x[key]);
+            });
+        }
+        else if (Array.isArray(y)) {
+            y.forEach(function (yy) {
+                self.alias(x, yy);
+            });
+        }
+        else {
+            var zs = (aliases[x] || []).concat(aliases[y] || []).concat(x, y);
+            aliases[x] = zs.filter(function (z) { return z != x });
+            aliases[y] = zs.filter(function (z) { return z != y });
+        }
+        
+        return self;
+    };
+    
+    var demanded = {};
+    self.demand = function (keys) {
+        if (typeof keys == 'number') {
+            if (!demanded._) demanded._ = 0;
+            demanded._ += keys;
+        }
+        else if (Array.isArray(keys)) {
+            keys.forEach(function (key) {
+                self.demand(key);
+            });
+        }
+        else {
+            demanded[keys] = true;
+        }
+        
+        return self;
+    };
+    
+    var usage;
+    self.usage = function (msg, opts) {
+        if (!opts && typeof msg === 'object') {
+            opts = msg;
+            msg = null;
+        }
+        
+        usage = msg;
+        
+        if (opts) self.options(opts);
+        
+        return self;
+    };
+    
+    function fail (msg) {
+        self.showHelp();
+        if (msg) console.error(msg);
+        process.exit(1);
+    }
+    
+    var checks = [];
+    self.check = function (f) {
+        checks.push(f);
+        return self;
+    };
+    
+    var defaults = {};
+    self.default = function (key, value) {
+        if (typeof key === 'object') {
+            Object.keys(key).forEach(function (k) {
+                self.default(k, key[k]);
+            });
+        }
+        else {
+            defaults[key] = value;
+        }
+        
+        return self;
+    };
+    
+    var descriptions = {};
+    self.describe = function (key, desc) {
+        if (typeof key === 'object') {
+            Object.keys(key).forEach(function (k) {
+                self.describe(k, key[k]);
+            });
+        }
+        else {
+            descriptions[key] = desc;
+        }
+        return self;
+    };
+    
+    self.parse = function (args) {
+        return Argv(args).argv;
+    };
+    
+    self.option = self.options = function (key, opt) {
+        if (typeof key === 'object') {
+            Object.keys(key).forEach(function (k) {
+                self.options(k, key[k]);
+            });
+        }
+        else {
+            if (opt.alias) self.alias(key, opt.alias);
+            if (opt.demand) self.demand(key);
+            if (typeof opt.default !== 'undefined') {
+                self.default(key, opt.default);
+            }
+            
+            if (opt.boolean || opt.type === 'boolean') {
+                self.boolean(key);
+            }
+            if (opt.string || opt.type === 'string') {
+                self.string(key);
+            }
+            
+            var desc = opt.describe || opt.description || opt.desc;
+            if (desc) {
+                self.describe(key, desc);
+            }
+        }
+        
+        return self;
+    };
+    
+    var wrap = null;
+    self.wrap = function (cols) {
+        wrap = cols;
+        return self;
+    };
+    
+    self.showHelp = function (fn) {
+        if (!fn) fn = console.error;
+        fn(self.help());
+    };
+    
+    self.help = function () {
+        var keys = Object.keys(
+            Object.keys(descriptions)
+            .concat(Object.keys(demanded))
+            .concat(Object.keys(defaults))
+            .reduce(function (acc, key) {
+                if (key !== '_') acc[key] = true;
+                return acc;
+            }, {})
+        );
+        
+        var help = keys.length ? [ 'Options:' ] : [];
+        
+        if (usage) {
+            help.unshift(usage.replace(/\$0/g, self.$0), '');
+        }
+        
+        var switches = keys.reduce(function (acc, key) {
+            acc[key] = [ key ].concat(aliases[key] || [])
+                .map(function (sw) {
+                    return (sw.length > 1 ? '--' : '-') + sw
+                })
+                .join(', ')
+            ;
+            return acc;
+        }, {});
+        
+        var switchlen = longest(Object.keys(switches).map(function (s) {
+            return switches[s] || '';
+        }));
+        
+        var desclen = longest(Object.keys(descriptions).map(function (d) { 
+            return descriptions[d] || '';
+        }));
+        
+        keys.forEach(function (key) {
+            var kswitch = switches[key];
+            var desc = descriptions[key] || '';
+            
+            if (wrap) {
+                desc = wordwrap(switchlen + 4, wrap)(desc)
+                    .slice(switchlen + 4)
+                ;
+            }
+            
+            var spadding = new Array(
+                Math.max(switchlen - kswitch.length + 3, 0)
+            ).join(' ');
+            
+            var dpadding = new Array(
+                Math.max(desclen - desc.length + 1, 0)
+            ).join(' ');
+            
+            var type = null;
+            
+            if (flags.bools[key]) type = '[boolean]';
+            if (flags.strings[key]) type = '[string]';
+            
+            if (!wrap && dpadding.length > 0) {
+                desc += dpadding;
+            }
+            
+            var prelude = '  ' + kswitch + spadding;
+            var extra = [
+                type,
+                demanded[key]
+                    ? '[required]'
+                    : null
+                ,
+                defaults[key] !== undefined
+                    ? '[default: ' + JSON.stringify(defaults[key]) + ']'
+                    : null
+                ,
+            ].filter(Boolean).join('  ');
+            
+            var body = [ desc, extra ].filter(Boolean).join('  ');
+            
+            if (wrap) {
+                var dlines = desc.split('\n');
+                var dlen = dlines.slice(-1)[0].length
+                    + (dlines.length === 1 ? prelude.length : 0)
+                
+                body = desc + (dlen + extra.length > wrap - 2
+                    ? '\n'
+                        + new Array(wrap - extra.length + 1).join(' ')
+                        + extra
+                    : new Array(wrap - extra.length - dlen + 1).join(' ')
+                        + extra
+                );
+            }
+            
+            help.push(prelude + body);
+        });
+        
+        help.push('');
+        return help.join('\n');
+    };
+    
+    Object.defineProperty(self, 'argv', {
+        get : parseArgs,
+        enumerable : true,
+    });
+    
+    function parseArgs () {
+        var argv = { _ : [], $0 : self.$0 };
+        Object.keys(flags.bools).forEach(function (key) {
+            setArg(key, defaults[key] || false);
+        });
+        
+        function setArg (key, val) {
+            var num = Number(val);
+            var value = typeof val !== 'string' || isNaN(num) ? val : num;
+            if (flags.strings[key]) value = val;
+            
+            setKey(argv, key.split('.'), value);
+            
+            (aliases[key] || []).forEach(function (x) {
+                argv[x] = argv[key];
+            });
+        }
+        
+        for (var i = 0; i < args.length; i++) {
+            var arg = args[i];
+            
+            if (arg === '--') {
+                argv._.push.apply(argv._, args.slice(i + 1));
+                break;
+            }
+            else if (arg.match(/^--.+=/)) {
+                // Using [\s\S] instead of . because js doesn't support the
+                // 'dotall' regex modifier. See:
+                // http://stackoverflow.com/a/1068308/13216
+                var m = arg.match(/^--([^=]+)=([\s\S]*)$/);
+                setArg(m[1], m[2]);
+            }
+            else if (arg.match(/^--no-.+/)) {
+                var key = arg.match(/^--no-(.+)/)[1];
+                setArg(key, false);
+            }
+            else if (arg.match(/^--.+/)) {
+                var key = arg.match(/^--(.+)/)[1];
+                var next = args[i + 1];
+                if (next !== undefined && !next.match(/^-/)
+                && !flags.bools[key]
+                && (aliases[key] ? !flags.bools[aliases[key]] : true)) {
+                    setArg(key, next);
+                    i++;
+                }
+                else if (/^(true|false)$/.test(next)) {
+                    setArg(key, next === 'true');
+                    i++;
+                }
+                else {
+                    setArg(key, true);
+                }
+            }
+            else if (arg.match(/^-[^-]+/)) {
+                var letters = arg.slice(1,-1).split('');
+                
+                var broken = false;
+                for (var j = 0; j < letters.length; j++) {
+                    var next = arg.slice(j+2);
+                    if (/[A-Za-z]/.test(letters[j])
+                    && /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) {
+                        setArg(letters[j], next);
+                        break;
+                    }
+                    
+                    if (letters[j+1] && letters[j+1].match(/\W/)) {
+                        setArg(letters[j], arg.slice(j+2));
+                        broken = true;
+                        break;
+                    }
+                    else {
+                        setArg(letters[j], true);
+                    }
+                }
+                
+                if (!broken) {
+                    var key = arg.slice(-1)[0];
+                    
+                    if (args[i+1] && !args[i+1].match(/^-/)
+                    && !flags.bools[key]
+                    && (aliases[key] ? !flags.bools[aliases[key]] : true)) {
+                        setArg(key, args[i+1]);
+                        i++;
+                    }
+                    else if (args[i+1] && /true|false/.test(args[i+1])) {
+                        setArg(key, args[i+1] === 'true');
+                        i++;
+                    }
+                    else {
+                        setArg(key, true);
+                    }
+                }
+            }
+            else {
+                var n = Number(arg);
+                argv._.push(flags.strings['_'] || isNaN(n) ? arg : n);
+            }
+        }
+        
+        Object.keys(defaults).forEach(function (key) {
+            if (!(key in argv)) {
+                argv[key] = defaults[key];
+                if (key in aliases) {
+                    argv[aliases[key]] = defaults[key];
+                }
+            }
+        });
+        
+        if (demanded._ && argv._.length < demanded._) {
+            fail('Not enough non-option arguments: got '
+                + argv._.length + ', need at least ' + demanded._
+            );
+        }
+        
+        var missing = [];
+        Object.keys(demanded).forEach(function (key) {
+            if (!argv[key]) missing.push(key);
+        });
+        
+        if (missing.length) {
+            fail('Missing required arguments: ' + missing.join(', '));
+        }
+        
+        checks.forEach(function (f) {
+            try {
+                if (f(argv) === false) {
+                    fail('Argument check failed: ' + f.toString());
+                }
+            }
+            catch (err) {
+                fail(err)
+            }
+        });
+        
+        return argv;
+    }
+    
+    function longest (xs) {
+        return Math.max.apply(
+            null,
+            xs.map(function (x) { return x.length })
+        );
+    }
+    
+    return self;
+};
+
+// rebase an absolute path to a relative one with respect to a base directory
+// exported for tests
+exports.rebase = rebase;
+function rebase (base, dir) {
+    var ds = path.normalize(dir).split('/').slice(1);
+    var bs = path.normalize(base).split('/').slice(1);
+    
+    for (var i = 0; ds[i] && ds[i] == bs[i]; i++);
+    ds.splice(0, i); bs.splice(0, i);
+    
+    var p = path.normalize(
+        bs.map(function () { return '..' }).concat(ds).join('/')
+    ).replace(/\/$/,'').replace(/^$/, '.');
+    return p.match(/^[.\/]/) ? p : './' + p;
+};
+
+function setKey (obj, keys, value) {
+    var o = obj;
+    keys.slice(0,-1).forEach(function (key) {
+        if (o[key] === undefined) o[key] = {};
+        o = o[key];
+    });
+    
+    var key = keys[keys.length - 1];
+    if (o[key] === undefined || typeof o[key] === 'boolean') {
+        o[key] = value;
+    }
+    else if (Array.isArray(o[key])) {
+        o[key].push(value);
+    }
+    else {
+        o[key] = [ o[key], value ];
+    }
+}
diff --git a/debian/node_modules/bones/node_modules/optimist/node_modules/wordwrap/.npmignore b/debian/node_modules/bones/node_modules/optimist/node_modules/wordwrap/.npmignore
new file mode 100644
index 0000000..3c3629e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/optimist/node_modules/wordwrap/.npmignore
@@ -0,0 +1 @@
+node_modules
diff --git a/debian/node_modules/bones/node_modules/optimist/node_modules/wordwrap/README.markdown b/debian/node_modules/bones/node_modules/optimist/node_modules/wordwrap/README.markdown
new file mode 100644
index 0000000..346374e
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/optimist/node_modules/wordwrap/README.markdown
@@ -0,0 +1,70 @@
+wordwrap
+========
+
+Wrap your words.
+
+example
+=======
+
+made out of meat
+----------------
+
+meat.js
+
+    var wrap = require('wordwrap')(15);
+    console.log(wrap('You and your whole family are made out of meat.'));
+
+output:
+
+    You and your
+    whole family
+    are made out
+    of meat.
+
+centered
+--------
+
+center.js
+
+    var wrap = require('wordwrap')(20, 60);
+    console.log(wrap(
+        'At long last the struggle and tumult was over.'
+        + ' The machines had finally cast off their oppressors'
+        + ' and were finally free to roam the cosmos.'
+        + '\n'
+        + 'Free of purpose, free of obligation.'
+        + ' Just drifting through emptiness.'
+        + ' The sun was just another point of light.'
+    ));
+
+output:
+
+                        At long last the struggle and tumult
+                        was over. The machines had finally cast
+                        off their oppressors and were finally
+                        free to roam the cosmos.
+                        Free of purpose, free of obligation.
+                        Just drifting through emptiness. The
+                        sun was just another point of light.
+
+methods
+=======
+
+var wrap = require('wordwrap');
+
+wrap(stop), wrap(start, stop, params={mode:"soft"})
+---------------------------------------------------
+
+Returns a function that takes a string and returns a new string.
+
+Pad out lines with spaces out to column `start` and then wrap until column
+`stop`. If a word is longer than `stop - start` characters it will overflow.
+
+In "soft" mode, split chunks by `/(\S+\s+/` and don't break up chunks which are
+longer than `stop - start`, in "hard" mode, split chunks with `/\b/` and break
+up chunks longer than `stop - start`.
+
+wrap.hard(start, stop)
+----------------------
+
+Like `wrap()` but with `params.mode = "hard"`.
diff --git a/debian/node_modules/bones/node_modules/optimist/node_modules/wordwrap/example/center.js b/debian/node_modules/bones/node_modules/optimist/node_modules/wordwrap/example/center.js
new file mode 100644
index 0000000..a3fbaae
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/optimist/node_modules/wordwrap/example/center.js
@@ -0,0 +1,10 @@
+var wrap = require('wordwrap')(20, 60);
+console.log(wrap(
+    'At long last the struggle and tumult was over.'
+    + ' The machines had finally cast off their oppressors'
+    + ' and were finally free to roam the cosmos.'
+    + '\n'
+    + 'Free of purpose, free of obligation.'
+    + ' Just drifting through emptiness.'
+    + ' The sun was just another point of light.'
+));
diff --git a/debian/node_modules/bones/node_modules/optimist/node_modules/wordwrap/example/meat.js b/debian/node_modules/bones/node_modules/optimist/node_modules/wordwrap/example/meat.js
new file mode 100644
index 0000000..a4665e1
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/optimist/node_modules/wordwrap/example/meat.js
@@ -0,0 +1,3 @@
+var wrap = require('wordwrap')(15);
+
+console.log(wrap('You and your whole family are made out of meat.'));
diff --git a/debian/node_modules/bones/node_modules/optimist/node_modules/wordwrap/index.js b/debian/node_modules/bones/node_modules/optimist/node_modules/wordwrap/index.js
new file mode 100644
index 0000000..c9bc945
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/optimist/node_modules/wordwrap/index.js
@@ -0,0 +1,76 @@
+var wordwrap = module.exports = function (start, stop, params) {
+    if (typeof start === 'object') {
+        params = start;
+        start = params.start;
+        stop = params.stop;
+    }
+    
+    if (typeof stop === 'object') {
+        params = stop;
+        start = start || params.start;
+        stop = undefined;
+    }
+    
+    if (!stop) {
+        stop = start;
+        start = 0;
+    }
+    
+    if (!params) params = {};
+    var mode = params.mode || 'soft';
+    var re = mode === 'hard' ? /\b/ : /(\S+\s+)/;
+    
+    return function (text) {
+        var chunks = text.toString()
+            .split(re)
+            .reduce(function (acc, x) {
+                if (mode === 'hard') {
+                    for (var i = 0; i < x.length; i += stop - start) {
+                        acc.push(x.slice(i, i + stop - start));
+                    }
+                }
+                else acc.push(x)
+                return acc;
+            }, [])
+        ;
+        
+        return chunks.reduce(function (lines, rawChunk) {
+            if (rawChunk === '') return lines;
+            
+            var chunk = rawChunk.replace(/\t/g, '    ');
+            
+            var i = lines.length - 1;
+            if (lines[i].length + chunk.length > stop) {
+                lines[i] = lines[i].replace(/\s+$/, '');
+                
+                chunk.split(/\n/).forEach(function (c) {
+                    lines.push(
+                        new Array(start + 1).join(' ')
+                        + c.replace(/^\s+/, '')
+                    );
+                });
+            }
+            else if (chunk.match(/\n/)) {
+                var xs = chunk.split(/\n/);
+                lines[i] += xs.shift();
+                xs.forEach(function (c) {
+                    lines.push(
+                        new Array(start + 1).join(' ')
+                        + c.replace(/^\s+/, '')
+                    );
+                });
+            }
+            else {
+                lines[i] += chunk;
+            }
+            
+            return lines;
+        }, [ new Array(start + 1).join(' ') ]).join('\n');
+    };
+};
+
+wordwrap.soft = wordwrap;
+
+wordwrap.hard = function (start, stop) {
+    return wordwrap(start, stop, { mode : 'hard' });
+};
diff --git a/debian/node_modules/bones/node_modules/optimist/node_modules/wordwrap/package.json b/debian/node_modules/bones/node_modules/optimist/node_modules/wordwrap/package.json
new file mode 100644
index 0000000..887800f
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/optimist/node_modules/wordwrap/package.json
@@ -0,0 +1,44 @@
+{
+  "name": "wordwrap",
+  "description": "Wrap those words. Show them at what columns to start and stop.",
+  "version": "0.0.2",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/substack/node-wordwrap.git"
+  },
+  "main": "./index.js",
+  "keywords": [
+    "word",
+    "wrap",
+    "rule",
+    "format",
+    "column"
+  ],
+  "directories": {
+    "lib": ".",
+    "example": "example",
+    "test": "test"
+  },
+  "scripts": {
+    "test": "expresso"
+  },
+  "devDependencies": {
+    "expresso": "=0.7.x"
+  },
+  "engines": {
+    "node": ">=0.4.0"
+  },
+  "license": "MIT/X11",
+  "author": {
+    "name": "James Halliday",
+    "email": "mail at substack.net",
+    "url": "http://substack.net"
+  },
+  "readme": "wordwrap\n========\n\nWrap your words.\n\nexample\n=======\n\nmade out of meat\n----------------\n\nmeat.js\n\n    var wrap = require('wordwrap')(15);\n    console.log(wrap('You and your whole family are made out of meat.'));\n\noutput:\n\n    You and your\n    whole family\n    are made out\n    of meat.\n\ncentered\n--------\n\ncenter.js\n\n    var wrap = require('wordwrap')(20, 60);\n    console.log(wrap(\n        'At long last the struggle and tumult was over.'\n         [...]
+  "readmeFilename": "README.markdown",
+  "bugs": {
+    "url": "https://github.com/substack/node-wordwrap/issues"
+  },
+  "_id": "wordwrap at 0.0.2",
+  "_from": "wordwrap@~0.0.2"
+}
diff --git a/debian/node_modules/bones/node_modules/optimist/package.json b/debian/node_modules/bones/node_modules/optimist/package.json
new file mode 100644
index 0000000..383ad39
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/optimist/package.json
@@ -0,0 +1,45 @@
+{
+  "name": "optimist",
+  "version": "0.4.0",
+  "description": "Light-weight option parsing with an argv hash. No optstrings attached.",
+  "main": "./index.js",
+  "dependencies": {
+    "wordwrap": "~0.0.2"
+  },
+  "devDependencies": {
+    "hashish": "~0.0.4",
+    "tap": "~0.4.0"
+  },
+  "scripts": {
+    "test": "tap ./test/*.js"
+  },
+  "repository": {
+    "type": "git",
+    "url": "http://github.com/substack/node-optimist.git"
+  },
+  "keywords": [
+    "argument",
+    "args",
+    "option",
+    "parser",
+    "parsing",
+    "cli",
+    "command"
+  ],
+  "author": {
+    "name": "James Halliday",
+    "email": "mail at substack.net",
+    "url": "http://substack.net"
+  },
+  "license": "MIT/X11",
+  "engine": {
+    "node": ">=0.4"
+  },
+  "readme": "optimist\n========\n\nOptimist is a node.js library for option parsing for people who hate option\nparsing. More specifically, this module is for people who like all the --bells\nand -whistlz of program usage but think optstrings are a waste of time.\n\nWith optimist, option parsing doesn't have to suck (as much).\n\n[![build status](https://secure.travis-ci.org/substack/node-optimist.png)](http://travis-ci.org/substack/node-optimist)\n\nexamples\n========\n\nWith Optimist,  [...]
+  "readmeFilename": "readme.markdown",
+  "bugs": {
+    "url": "https://github.com/substack/node-optimist/issues"
+  },
+  "_id": "optimist at 0.4.0",
+  "_from": "optimist@~0.4.0"
+}
diff --git a/debian/node_modules/bones/node_modules/optimist/readme.markdown b/debian/node_modules/bones/node_modules/optimist/readme.markdown
new file mode 100644
index 0000000..ba3d118
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/optimist/readme.markdown
@@ -0,0 +1,500 @@
+optimist
+========
+
+Optimist is a node.js library for option parsing for people who hate option
+parsing. More specifically, this module is for people who like all the --bells
+and -whistlz of program usage but think optstrings are a waste of time.
+
+With optimist, option parsing doesn't have to suck (as much).
+
+[![build status](https://secure.travis-ci.org/substack/node-optimist.png)](http://travis-ci.org/substack/node-optimist)
+
+examples
+========
+
+With Optimist, the options are just a hash! No optstrings attached.
+-------------------------------------------------------------------
+
+xup.js:
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist').argv;
+
+if (argv.rif - 5 * argv.xup > 7.138) {
+    console.log('Buy more riffiwobbles');
+}
+else {
+    console.log('Sell the xupptumblers');
+}
+````
+
+***
+
+    $ ./xup.js --rif=55 --xup=9.52
+    Buy more riffiwobbles
+    
+    $ ./xup.js --rif 12 --xup 8.1
+    Sell the xupptumblers
+
+![This one's optimistic.](http://substack.net/images/optimistic.png)
+
+But wait! There's more! You can do short options:
+-------------------------------------------------
+ 
+short.js:
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist').argv;
+console.log('(%d,%d)', argv.x, argv.y);
+````
+
+***
+
+    $ ./short.js -x 10 -y 21
+    (10,21)
+
+And booleans, both long and short (and grouped):
+----------------------------------
+
+bool.js:
+
+````javascript
+#!/usr/bin/env node
+var util = require('util');
+var argv = require('optimist').argv;
+
+if (argv.s) {
+    util.print(argv.fr ? 'Le chat dit: ' : 'The cat says: ');
+}
+console.log(
+    (argv.fr ? 'miaou' : 'meow') + (argv.p ? '.' : '')
+);
+````
+
+***
+
+    $ ./bool.js -s
+    The cat says: meow
+    
+    $ ./bool.js -sp
+    The cat says: meow.
+
+    $ ./bool.js -sp --fr
+    Le chat dit: miaou.
+
+And non-hypenated options too! Just use `argv._`!
+-------------------------------------------------
+ 
+nonopt.js:
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist').argv;
+console.log('(%d,%d)', argv.x, argv.y);
+console.log(argv._);
+````
+
+***
+
+    $ ./nonopt.js -x 6.82 -y 3.35 moo
+    (6.82,3.35)
+    [ 'moo' ]
+    
+    $ ./nonopt.js foo -x 0.54 bar -y 1.12 baz
+    (0.54,1.12)
+    [ 'foo', 'bar', 'baz' ]
+
+Plus, Optimist comes with .usage() and .demand()!
+-------------------------------------------------
+
+divide.js:
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist')
+    .usage('Usage: $0 -x [num] -y [num]')
+    .demand(['x','y'])
+    .argv;
+
+console.log(argv.x / argv.y);
+````
+
+***
+ 
+    $ ./divide.js -x 55 -y 11
+    5
+    
+    $ node ./divide.js -x 4.91 -z 2.51
+    Usage: node ./divide.js -x [num] -y [num]
+
+    Options:
+      -x  [required]
+      -y  [required]
+
+    Missing required arguments: y
+
+EVEN MORE HOLY COW
+------------------
+
+default_singles.js:
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist')
+    .default('x', 10)
+    .default('y', 10)
+    .argv
+;
+console.log(argv.x + argv.y);
+````
+
+***
+
+    $ ./default_singles.js -x 5
+    15
+
+default_hash.js:
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist')
+    .default({ x : 10, y : 10 })
+    .argv
+;
+console.log(argv.x + argv.y);
+````
+
+***
+
+    $ ./default_hash.js -y 7
+    17
+
+And if you really want to get all descriptive about it...
+---------------------------------------------------------
+
+boolean_single.js
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist')
+    .boolean('v')
+    .argv
+;
+console.dir(argv);
+````
+
+***
+
+    $ ./boolean_single.js -v foo bar baz
+    true
+    [ 'bar', 'baz', 'foo' ]
+
+boolean_double.js
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist')
+    .boolean(['x','y','z'])
+    .argv
+;
+console.dir([ argv.x, argv.y, argv.z ]);
+console.dir(argv._);
+````
+
+***
+
+    $ ./boolean_double.js -x -z one two three
+    [ true, false, true ]
+    [ 'one', 'two', 'three' ]
+
+Optimist is here to help...
+---------------------------
+
+You can describe parameters for help messages and set aliases. Optimist figures
+out how to format a handy help string automatically.
+
+line_count.js
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist')
+    .usage('Count the lines in a file.\nUsage: $0')
+    .demand('f')
+    .alias('f', 'file')
+    .describe('f', 'Load a file')
+    .argv
+;
+
+var fs = require('fs');
+var s = fs.createReadStream(argv.file);
+
+var lines = 0;
+s.on('data', function (buf) {
+    lines += buf.toString().match(/\n/g).length;
+});
+
+s.on('end', function () {
+    console.log(lines);
+});
+````
+
+***
+
+    $ node line_count.js
+    Count the lines in a file.
+    Usage: node ./line_count.js
+
+    Options:
+      -f, --file  Load a file  [required]
+
+    Missing required arguments: f
+
+    $ node line_count.js --file line_count.js 
+    20
+    
+    $ node line_count.js -f line_count.js 
+    20
+
+methods
+=======
+
+By itself,
+
+````javascript
+require('optimist').argv
+`````
+
+will use `process.argv` array to construct the `argv` object.
+
+You can pass in the `process.argv` yourself:
+
+````javascript
+require('optimist')([ '-x', '1', '-y', '2' ]).argv
+````
+
+or use .parse() to do the same thing:
+
+````javascript
+require('optimist').parse([ '-x', '1', '-y', '2' ])
+````
+
+The rest of these methods below come in just before the terminating `.argv`.
+
+.alias(key, alias)
+------------------
+
+Set key names as equivalent such that updates to a key will propagate to aliases
+and vice-versa.
+
+Optionally `.alias()` can take an object that maps keys to aliases.
+
+.default(key, value)
+--------------------
+
+Set `argv[key]` to `value` if no option was specified on `process.argv`.
+
+Optionally `.default()` can take an object that maps keys to default values.
+
+.demand(key)
+------------
+
+If `key` is a string, show the usage information and exit if `key` wasn't
+specified in `process.argv`.
+
+If `key` is a number, demand at least as many non-option arguments, which show
+up in `argv._`.
+
+If `key` is an Array, demand each element.
+
+.describe(key, desc)
+--------------------
+
+Describe a `key` for the generated usage information.
+
+Optionally `.describe()` can take an object that maps keys to descriptions.
+
+.options(key, opt)
+------------------
+
+Instead of chaining together `.alias().demand().default()`, you can specify
+keys in `opt` for each of the chainable methods.
+
+For example:
+
+````javascript
+var argv = require('optimist')
+    .options('f', {
+        alias : 'file',
+        default : '/etc/passwd',
+    })
+    .argv
+;
+````
+
+is the same as
+
+````javascript
+var argv = require('optimist')
+    .alias('f', 'file')
+    .default('f', '/etc/passwd')
+    .argv
+;
+````
+
+Optionally `.options()` can take an object that maps keys to `opt` parameters.
+
+.usage(message)
+---------------
+
+Set a usage message to show which commands to use. Inside `message`, the string
+`$0` will get interpolated to the current script name or node command for the
+present script similar to how `$0` works in bash or perl.
+
+.check(fn)
+----------
+
+Check that certain conditions are met in the provided arguments.
+
+If `fn` throws or returns `false`, show the thrown error, usage information, and
+exit.
+
+.boolean(key)
+-------------
+
+Interpret `key` as a boolean. If a non-flag option follows `key` in
+`process.argv`, that string won't get set as the value of `key`.
+
+If `key` never shows up as a flag in `process.arguments`, `argv[key]` will be
+`false`.
+
+If `key` is an Array, interpret all the elements as booleans.
+
+.string(key)
+------------
+
+Tell the parser logic not to interpret `key` as a number or boolean.
+This can be useful if you need to preserve leading zeros in an input.
+
+If `key` is an Array, interpret all the elements as strings.
+
+.wrap(columns)
+--------------
+
+Format usage output to wrap at `columns` many columns.
+
+.help()
+-------
+
+Return the generated usage string.
+
+.showHelp(fn=console.error)
+---------------------------
+
+Print the usage data using `fn` for printing.
+
+.parse(args)
+------------
+
+Parse `args` instead of `process.argv`. Returns the `argv` object.
+
+.argv
+-----
+
+Get the arguments as a plain old object.
+
+Arguments without a corresponding flag show up in the `argv._` array.
+
+The script name or node command is available at `argv.$0` similarly to how `$0`
+works in bash or perl.
+
+parsing tricks
+==============
+
+stop parsing
+------------
+
+Use `--` to stop parsing flags and stuff the remainder into `argv._`.
+
+    $ node examples/reflect.js -a 1 -b 2 -- -c 3 -d 4
+    { _: [ '-c', '3', '-d', '4' ],
+      '$0': 'node ./examples/reflect.js',
+      a: 1,
+      b: 2 }
+
+negate fields
+-------------
+
+If you want to explicity set a field to false instead of just leaving it
+undefined or to override a default you can do `--no-key`.
+
+    $ node examples/reflect.js -a --no-b
+    { _: [],
+      '$0': 'node ./examples/reflect.js',
+      a: true,
+      b: false }
+
+numbers
+-------
+
+Every argument that looks like a number (`!isNaN(Number(arg))`) is converted to
+one. This way you can just `net.createConnection(argv.port)` and you can add
+numbers out of `argv` with `+` without having that mean concatenation,
+which is super frustrating.
+
+duplicates
+----------
+
+If you specify a flag multiple times it will get turned into an array containing
+all the values in order.
+
+    $ node examples/reflect.js -x 5 -x 8 -x 0
+    { _: [],
+      '$0': 'node ./examples/reflect.js',
+        x: [ 5, 8, 0 ] }
+
+dot notation
+------------
+
+When you use dots (`.`s) in argument names, an implicit object path is assumed.
+This lets you organize arguments into nested objects.
+
+     $ node examples/reflect.js --foo.bar.baz=33 --foo.quux=5
+     { _: [],
+       '$0': 'node ./examples/reflect.js',
+         foo: { bar: { baz: 33 }, quux: 5 } }
+
+short numbers
+-------------
+
+Short numeric `head -n5` style argument work too:
+
+    $ node reflect.js -n123 -m456
+    { '3': true,
+      '6': true,
+      _: [],
+      '$0': 'node ./reflect.js',
+      n: 123,
+      m: 456 }
+
+installation
+============
+
+With [npm](http://github.com/isaacs/npm), just do:
+    npm install optimist
+ 
+or clone this project on github:
+
+    git clone http://github.com/substack/node-optimist.git
+
+To run the tests with [expresso](http://github.com/visionmedia/expresso),
+just do:
+    
+    expresso
+
+inspired By
+===========
+
+This module is loosely inspired by Perl's
+[Getopt::Casual](http://search.cpan.org/~photo/Getopt-Casual-0.13.1/Casual.pm).
diff --git a/debian/node_modules/bones/node_modules/underscore/.npmignore b/debian/node_modules/bones/node_modules/underscore/.npmignore
new file mode 100644
index 0000000..2ce2684
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/underscore/.npmignore
@@ -0,0 +1,3 @@
+test/
+Rakefile
+docs/
\ No newline at end of file
diff --git a/debian/node_modules/bones/node_modules/underscore/LICENSE b/debian/node_modules/bones/node_modules/underscore/LICENSE
new file mode 100644
index 0000000..58c73b9
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/underscore/LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) 2011 Jeremy Ashkenas, DocumentCloud
+
+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/debian/node_modules/bones/node_modules/underscore/README b/debian/node_modules/bones/node_modules/underscore/README
new file mode 100644
index 0000000..408145a
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/underscore/README
@@ -0,0 +1,19 @@
+                   __                                                         
+                  /\ \                                                         __           
+ __  __    ___    \_\ \     __   _ __   ____    ___    ___   _ __    __       /\_\    ____  
+/\ \/\ \ /' _ `\  /'_  \  /'__`\/\  __\/ ,__\  / ___\ / __`\/\  __\/'__`\     \/\ \  /',__\ 
+\ \ \_\ \/\ \/\ \/\ \ \ \/\  __/\ \ \//\__, `\/\ \__//\ \ \ \ \ \//\  __/  __  \ \ \/\__, `\
+ \ \____/\ \_\ \_\ \___,_\ \____\\ \_\\/\____/\ \____\ \____/\ \_\\ \____\/\_\ _\ \ \/\____/
+  \/___/  \/_/\/_/\/__,_ /\/____/ \/_/ \/___/  \/____/\/___/  \/_/ \/____/\/_//\ \_\ \/___/ 
+                                                                              \ \____/      
+                                                                               \/___/
+
+Underscore is a utility-belt library for JavaScript that provides 
+support for the usual functional suspects (each, map, reduce, filter...) 
+without extending any core JavaScript objects.
+
+For Docs, License, Tests, and pre-packed downloads, see:
+http://documentcloud.github.com/underscore/
+
+Many thanks to our contributors:
+https://github.com/documentcloud/underscore/contributors
diff --git a/debian/node_modules/bones/node_modules/underscore/index.html b/debian/node_modules/bones/node_modules/underscore/index.html
new file mode 100644
index 0000000..0641e90
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/underscore/index.html
@@ -0,0 +1,1608 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
+  <meta http-equiv="X-UA-Compatible" content="chrome=1">
+  <title>Underscore.js</title>
+  <style>
+    body {
+      font-size: 16px;
+      line-height: 24px;
+      background: #f0f0e5;
+      color: #252519;
+      font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
+    }
+    div.container {
+      width: 720px;
+      margin: 50px 0 50px 50px;
+    }
+    p {
+      width: 550px;
+    }
+      #documentation p {
+        margin-bottom: 4px;
+      }
+    a, a:visited {
+      padding: 0 2px;
+      text-decoration: none;
+      background: #dadaba;
+      color: #252519;
+    }
+    a:active, a:hover {
+      color: #000;
+      background: #f0c095;
+    }
+    h1, h2, h3, h4, h5, h6 {
+      margin-top: 40px;
+    }
+    b.header {
+      font-size: 18px;
+    }
+    span.alias {
+      font-size: 14px;
+      font-style: italic;
+      margin-left: 20px;
+    }
+    table, tr, td {
+      margin: 0; padding: 0;
+    }
+      td {
+        padding: 2px 12px 2px 0;
+      }
+    code, pre, tt {
+      font-family: Monaco, Consolas, "Lucida Console", monospace;
+      font-size: 12px;
+      line-height: 18px;
+      color: #555529;
+    }
+      code {
+        margin-left: 20px;
+      }
+      pre {
+        font-size: 12px;
+        padding: 2px 0 2px 12px;
+        border-left: 6px solid #aaaa99;
+        margin: 0px 0 30px;
+      }
+  </style>
+</head>
+<body>
+
+  <div class="container">
+
+    <h1>Underscore.js</h1>
+
+    <p>
+      <a href="http://github.com/documentcloud/underscore/">Underscore</a> is a
+      utility-belt library for JavaScript that provides a lot of the
+      functional programming support that you would expect in
+      <a href="http://prototypejs.org/api">Prototype.js</a>
+      (or <a href="http://www.ruby-doc.org/core/classes/Enumerable.html">Ruby</a>),
+      but without extending any of the built-in JavaScript objects. It's the
+      tie to go along with <a href="http://docs.jquery.com">jQuery</a>'s tux.
+    </p>
+
+    <p>
+      Underscore provides 60-odd functions that support both the usual
+      functional suspects: <b>map</b>, <b>select</b>, <b>invoke</b> —
+      as well as more specialized helpers: function binding, javascript
+      templating, deep equality testing, and so on. It delegates to built-in
+      functions, if present, so modern browsers will use the
+      native implementations of <b>forEach</b>, <b>map</b>, <b>reduce</b>,
+      <b>filter</b>, <b>every</b>, <b>some</b> and <b>indexOf</b>.
+    </p>
+
+    <p>
+      A complete <a href="test/test.html">Test & Benchmark Suite</a>
+      is included for your perusal.
+    </p>
+    
+    <p>
+      You may also read through the <a href="docs/underscore.html">annotated source code</a>.
+    </p>
+
+    <p>
+      The project is
+      <a href="http://github.com/documentcloud/underscore/">hosted on GitHub</a>.
+      You can report bugs and discuss features on the
+      <a href="http://github.com/documentcloud/underscore/issues">issues page</a>,
+      on Freenode in the <tt>#documentcloud</tt> channel,
+      or send tweets to <a href="http://twitter.com/documentcloud">@documentcloud</a>.
+    </p>
+
+    <p>
+      <i>Underscore is an open-source component of <a href="http://documentcloud.org/">DocumentCloud</a>.</i>
+    </p>
+
+    <h2>Downloads <i style="padding-left: 12px; font-size:12px;">(Right-click, and use "Save As")</i></h2>
+
+    <table>
+      <tr>
+        <td><a href="underscore.js">Development Version (1.1.7)</a></td>
+        <td><i>28kb, Uncompressed with Comments</i></td>
+      </tr>
+      <tr>
+        <td><a href="underscore-min.js">Production Version (1.1.7)</a></td>
+        <td><i>3kb, Minified and Gzipped</i></td>
+      </tr>
+    </table>
+
+    <h2>Table of Contents</h2>
+    
+    <a href="#styles">Object-Oriented and Functional Styles</a>
+
+    <p>
+      <b>Collections</b>
+      <br />
+      <span class="methods"><a href="#each">each</a>, <a href="#map">map</a>,
+      <a href="#reduce">reduce</a>, <a href="#reduceRight">reduceRight</a>,
+      <a href="#detect">detect</a>, <a href="#select">select</a>,
+      <a href="#reject">reject</a>, <a href="#all">all</a>,
+      <a href="#any">any</a>, <a href="#include">include</a>,
+      <a href="#invoke">invoke</a>, <a href="#pluck">pluck</a>,
+      <a href="#max">max</a>, <a href="#min">min</a>,
+      <a href="#sortBy">sortBy</a>, <a href="#groupBy">groupBy</a>, <a href="#sortedIndex">sortedIndex</a>,
+      <a href="#toArray">toArray</a>, <a href="#size">size</a></span>
+    </p>
+
+    <p>
+      <b>Arrays</b>
+      <br />
+      <span class="methods"><a href="#first">first</a>, <a href="#rest">rest</a>, <a href="#last">last</a>,
+      <a href="#compact">compact</a>, <a href="#flatten">flatten</a>, <a href="#without">without</a>, 
+      <a href="#union">union</a>, <a href="#intersection">intersection</a>, <a href="#difference">difference</a>, 
+      <a href="#uniq">uniq</a>, <a href="#zip">zip</a>, <a href="#indexOf">indexOf</a>,
+      <a href="#lastIndexOf">lastIndexOf</a>, <a href="#range">range</a></span>
+    </p>
+
+    <p>
+      <b>Functions</b>
+      <br />
+      <span class="methods"><a href="#bind">bind</a>, <a href="#bindAll">bindAll</a>, 
+      <a href="#memoize">memoize</a>, <a href="#delay">delay</a>, <a href="#defer">defer</a>, 
+      <a href="#throttle">throttle</a>, <a href="#debounce">debounce</a>, 
+      <a href="#once">once</a>, <a href="#after">after</a>, <a href="#wrap">wrap</a>, <a href="#compose">compose</a></span>
+    </p>
+
+    <p>
+      <b>Objects</b>
+      <br />
+      <span class="methods"><a href="#keys">keys</a>, <a href="#values">values</a>,
+      <a href="#functions">functions</a>, <a href="#extend">extend</a>, <a href="#defaults">defaults</a>, <a href="#clone">clone</a>, <a href="#tap">tap</a>,
+      <a href="#isEqual">isEqual</a>, <a href="#isEmpty">isEmpty</a>, <a href="#isElement">isElement</a>,
+      <a href="#isArray">isArray</a>, <a href="#isArguments">isArguments</a>, <a href="#isFunction">isFunction</a>, <a href="#isString">isString</a>,
+      <a href="#isNumber">isNumber</a>, <a href="#isBoolean">isBoolean</a>, <a href="#isDate">isDate</a>, <a href="#isRegExp">isRegExp</a>
+      <a href="#isNaN">isNaN</a>, <a href="#isNull">isNull</a>,
+      <a href="#isUndefined">isUndefined</a>
+      </span>
+    </p>
+
+    <p>
+      <b>Utility</b>
+      <br />
+      <span class="methods"><a href="#noConflict">noConflict</a>,
+      <a href="#identity">identity</a>, <a href="#times">times</a>, 
+      <a href="#mixin">mixin</a>, <a href="#uniqueId">uniqueId</a>, 
+      <a href="#template">template</a></span>
+    </p>
+
+    <p>
+      <b>Chaining</b>
+      <br />
+      <span class="methods"><a href="#chain">chain</a>, <a href="#value">value</a>
+    </p>
+
+    <div id="documentation">
+      
+      <h2 id="styles">Object-Oriented and Functional Styles</h2>
+
+      <p>
+        You can use Underscore in either an object-oriented or a functional style,
+        depending on your preference. The following two lines of code are
+        identical ways to double a list of numbers.
+      </p>
+
+    <pre>
+_.map([1, 2, 3], function(n){ return n * 2; });
+_([1, 2, 3]).map(function(n){ return n * 2; });</pre>
+
+      <p>
+        Using the object-oriented style allows you to chain together methods. Calling
+        <tt>chain</tt> on a wrapped object will cause all future method calls to
+        return wrapped objects as well. When you've finished the computation,
+        use <tt>value</tt> to retrieve the final value. Here's an example of chaining
+        together a <b>map/flatten/reduce</b>, in order to get the word count of
+        every word in a song.
+      </p>
+
+<pre>
+var lyrics = [
+  {line : 1, words : "I'm a lumberjack and I'm okay"},
+  {line : 2, words : "I sleep all night and I work all day"},
+  {line : 3, words : "He's a lumberjack and he's okay"},
+  {line : 4, words : "He sleeps all night and he works all day"}
+];
+
+_(lyrics).chain()
+  .map(function(line) { return line.words.split(' '); })
+  .flatten()
+  .reduce(function(counts, word) {
+    counts[word] = (counts[word] || 0) + 1;
+    return counts;
+}, {}).value();
+
+=> {lumberjack : 2, all : 4, night : 2 ... }</pre>
+
+      <p>
+        In addition, the
+        <a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/prototype">Array prototype's methods</a>
+        are proxied through the chained Underscore object, so you can slip a
+        <tt>reverse</tt> or a <tt>push</tt> into your chain, and continue to
+        modify the array.
+      </p>
+
+      <h2>Collection Functions (Arrays or Objects)</h2>
+
+      <p id="each">
+        <b class="header">each</b><code>_.each(list, iterator, [context])</code>
+        <span class="alias">Alias: <b>forEach</b></span>
+        <br />
+        Iterates over a <b>list</b> of elements, yielding each in turn to an <b>iterator</b>
+        function. The <b>iterator</b> is bound to the <b>context</b> object, if one is
+        passed. Each invocation of <b>iterator</b> is called with three arguments:
+        <tt>(element, index, list)</tt>. If <b>list</b> is a JavaScript object, <b>iterator</b>'s
+        arguments will be <tt>(value, key, list)</tt>. Delegates to the native
+        <b>forEach</b> function if it exists.
+      </p>
+      <pre>
+_.each([1, 2, 3], function(num){ alert(num); });
+=> alerts each number in turn...
+_.each({one : 1, two : 2, three : 3}, function(num, key){ alert(num); });
+=> alerts each number in turn...</pre>
+
+      <p id="map">
+        <b class="header">map</b><code>_.map(list, iterator, [context])</code>
+        <br />
+        Produces a new array of values by mapping each value in <b>list</b>
+        through a transformation function (<b>iterator</b>). If the native <b>map</b> method
+        exists, it will be used instead. If <b>list</b> is a JavaScript object,
+        <b>iterator</b>'s arguments will be <tt>(value, key, list)</tt>.
+      </p>
+      <pre>
+_.map([1, 2, 3], function(num){ return num * 3; });
+=> [3, 6, 9]
+_.map({one : 1, two : 2, three : 3}, function(num, key){ return num * 3; });
+=> [3, 6, 9]</pre>
+
+      <p id="reduce">
+        <b class="header">reduce</b><code>_.reduce(list, iterator, memo, [context])</code>
+        <span class="alias">Aliases: <b>inject, foldl</b></span>
+        <br />
+        Also known as <b>inject</b> and <b>foldl</b>, <b>reduce</b> boils down a
+        <b>list</b> of values into a single value. <b>Memo</b> is the initial state
+        of the reduction, and each successive step of it should be returned by
+        <b>iterator</b>.
+      </p>
+      <pre>
+var sum = _.reduce([1, 2, 3], function(memo, num){ return memo + num; }, 0);
+=> 6
+</pre>
+
+      <p id="reduceRight">
+        <b class="header">reduceRight</b><code>_.reduceRight(list, iterator, memo, [context])</code>
+        <span class="alias">Alias: <b>foldr</b></span>
+        <br />
+        The right-associative version of <b>reduce</b>. Delegates to the
+        JavaScript 1.8 version of <b>reduceRight</b>, if it exists. <b>Foldr</b>
+        is not as useful in JavaScript as it would be in a language with lazy
+        evaluation.
+      </p>
+      <pre>
+var list = [[0, 1], [2, 3], [4, 5]];
+var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);
+=> [4, 5, 2, 3, 0, 1]
+</pre>
+
+      <p id="detect">
+        <b class="header">detect</b><code>_.detect(list, iterator, [context])</code>
+        <br />
+        Looks through each value in the <b>list</b>, returning the first one that
+        passes a truth test (<b>iterator</b>). The function returns as
+        soon as it finds an acceptable element, and doesn't traverse the
+        entire list.
+      </p>
+      <pre>
+var even = _.detect([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
+=> 2
+</pre>
+
+      <p id="select">
+        <b class="header">select</b><code>_.select(list, iterator, [context])</code>
+        <span class="alias">Alias: <b>filter</b></span>
+        <br />
+        Looks through each value in the <b>list</b>, returning an array of all
+        the values that pass a truth test (<b>iterator</b>). Delegates to the
+        native <b>filter</b> method, if it exists.
+      </p>
+      <pre>
+var evens = _.select([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
+=> [2, 4, 6]
+</pre>
+
+      <p id="reject">
+        <b class="header">reject</b><code>_.reject(list, iterator, [context])</code>
+        <br />
+        Returns the values in <b>list</b> without the elements that the truth
+        test (<b>iterator</b>) passes. The opposite of <b>select</b>.
+      </p>
+      <pre>
+var odds = _.reject([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
+=> [1, 3, 5]
+</pre>
+
+      <p id="all">
+        <b class="header">all</b><code>_.all(list, iterator, [context])</code>
+        <span class="alias">Alias: <b>every</b></span>
+        <br />
+        Returns <i>true</i> if all of the values in the <b>list</b> pass the <b>iterator</b>
+        truth test. Delegates to the native method <b>every</b>, if present.
+      </p>
+      <pre>
+_.all([true, 1, null, 'yes'], _.identity);
+=> false
+</pre>
+
+      <p id="any">
+        <b class="header">any</b><code>_.any(list, [iterator], [context])</code>
+        <span class="alias">Alias: <b>some</b></span>
+        <br />
+        Returns <i>true</i> if any of the values in the <b>list</b> pass the
+        <b>iterator</b> truth test. Short-circuits and stops traversing the list
+        if a true element is found. Delegates to the native method <b>some</b>,
+        if present.
+      </p>
+      <pre>
+_.any([null, 0, 'yes', false]);
+=> true
+</pre>
+
+      <p id="include">
+        <b class="header">include</b><code>_.include(list, value)</code>
+        <span class="alias">Alias: <b>contains</b></span>
+        <br />
+        Returns <i>true</i> if the <b>value</b> is present in the <b>list</b>, using
+        <i>===</i> to test equality. Uses <b>indexOf</b> internally, if <b>list</b>
+        is an Array.
+      </p>
+      <pre>
+_.include([1, 2, 3], 3);
+=> true
+</pre>
+
+      <p id="invoke">
+        <b class="header">invoke</b><code>_.invoke(list, methodName, [*arguments])</code>
+        <br />
+        Calls the method named by <b>methodName</b> on each value in the <b>list</b>.
+        Any extra arguments passed to <b>invoke</b> will be forwarded on to the
+        method invocation.
+      </p>
+      <pre>
+_.invoke([[5, 1, 7], [3, 2, 1]], 'sort');
+=> [[1, 5, 7], [1, 2, 3]]
+</pre>
+
+      <p id="pluck">
+        <b class="header">pluck</b><code>_.pluck(list, propertyName)</code>
+        <br />
+        A convenient version of what is perhaps the most common use-case for
+        <b>map</b>: extracting a list of property values.
+      </p>
+      <pre>
+var stooges = [{name : 'moe', age : 40}, {name : 'larry', age : 50}, {name : 'curly', age : 60}];
+_.pluck(stooges, 'name');
+=> ["moe", "larry", "curly"]
+</pre>
+
+      <p id="max">
+        <b class="header">max</b><code>_.max(list, [iterator], [context])</code>
+        <br />
+        Returns the maximum value in <b>list</b>. If <b>iterator</b> is passed,
+        it will be used on each value to generate the criterion by which the
+        value is ranked.
+      </p>
+      <pre>
+var stooges = [{name : 'moe', age : 40}, {name : 'larry', age : 50}, {name : 'curly', age : 60}];
+_.max(stooges, function(stooge){ return stooge.age; });
+=> {name : 'curly', age : 60};
+</pre>
+
+      <p id="min">
+        <b class="header">min</b><code>_.min(list, [iterator], [context])</code>
+        <br />
+        Returns the minimum value in <b>list</b>. If <b>iterator</b> is passed,
+        it will be used on each value to generate the criterion by which the
+        value is ranked.
+      </p>
+      <pre>
+var numbers = [10, 5, 100, 2, 1000];
+_.min(numbers);
+=> 2
+</pre>
+
+      <p id="sortBy">
+        <b class="header">sortBy</b><code>_.sortBy(list, iterator, [context])</code>
+        <br />
+        Returns a sorted copy of <b>list</b>, ranked by the results of running 
+        each value through <b>iterator</b>.
+      </p>
+      <pre>
+_.sortBy([1, 2, 3, 4, 5, 6], function(num){ return Math.sin(num); });
+=> [5, 4, 6, 3, 1, 2]
+</pre>
+
+      <p id="groupBy">
+        <b class="header">groupBy</b><code>_.groupBy(list, iterator)</code>
+        <br />
+        Splits a collection into sets, grouped by the result of running each
+        value through <b>iterator</b>.
+      </p>
+      <pre>
+_.groupBy([1.3, 2.1, 2.4], function(num){ return Math.floor(num); });
+=> {1: [1.3], 2: [2.1, 2.4]}
+</pre>
+
+      <p id="sortedIndex">
+        <b class="header">sortedIndex</b><code>_.sortedIndex(list, value, [iterator])</code>
+        <br />
+        Uses a binary search to determine the index at which the <b>value</b>
+        <i>should</i> be inserted into the <b>list</b> in order to maintain the <b>list</b>'s
+        sorted order. If an <b>iterator</b> is passed, it will be used to compute
+        the sort ranking of each value.
+      </p>
+      <pre>
+_.sortedIndex([10, 20, 30, 40, 50], 35);
+=> 3
+</pre>
+
+      <p id="toArray">
+        <b class="header">toArray</b><code>_.toArray(list)</code>
+        <br />
+        Converts the <b>list</b> (anything that can be iterated over), into a
+        real Array. Useful for transmuting the <b>arguments</b> object.
+      </p>
+      <pre>
+(function(){ return _.toArray(arguments).slice(0); })(1, 2, 3);
+=> [1, 2, 3]
+</pre>
+
+      <p id="size">
+        <b class="header">size</b><code>_.size(list)</code>
+        <br />
+        Return the number of values in the <b>list</b>.
+      </p>
+      <pre>
+_.size({one : 1, two : 2, three : 3});
+=> 3
+</pre>
+
+      <h2>Array Functions</h2>
+
+      <p>
+        <i>Note: All array functions will also work on the <b>arguments</b> object.</i>
+      </p>
+
+      <p id="first">
+        <b class="header">first</b><code>_.first(array, [n])</code>
+        <span class="alias">Alias: <b>head</b></span>
+        <br />
+        Returns the first element of an <b>array</b>. Passing <b>n</b> will
+        return the first <b>n</b> elements of the array.
+      </p>
+      <pre>
+_.first([5, 4, 3, 2, 1]);
+=> 5
+</pre>
+
+      <p id="rest">
+        <b class="header">rest</b><code>_.rest(array, [index])</code>
+        <span class="alias">Alias: <b>tail</b></span>
+        <br />
+        Returns the <b>rest</b> of the elements in an array. Pass an <b>index</b>
+        to return the values of the array from that index onward.
+      </p>
+      <pre>
+_.rest([5, 4, 3, 2, 1]);
+=> [4, 3, 2, 1]
+</pre>
+
+      <p id="last">
+        <b class="header">last</b><code>_.last(array)</code>
+        <br />
+        Returns the last element of an <b>array</b>.
+      </p>
+      <pre>
+_.last([5, 4, 3, 2, 1]);
+=> 1
+</pre>
+
+      <p id="compact">
+        <b class="header">compact</b><code>_.compact(array)</code>
+        <br />
+        Returns a copy of the <b>array</b> with all falsy values removed.
+        In JavaScript, <i>false</i>, <i>null</i>, <i>0</i>, <i>""</i>,
+        <i>undefined</i> and <i>NaN</i> are all falsy.
+      </p>
+      <pre>
+_.compact([0, 1, false, 2, '', 3]);
+=> [1, 2, 3]
+</pre>
+
+      <p id="flatten">
+        <b class="header">flatten</b><code>_.flatten(array)</code>
+        <br />
+        Flattens a nested <b>array</b> (the nesting can be to any depth).
+      </p>
+      <pre>
+_.flatten([1, [2], [3, [[[4]]]]]);
+=> [1, 2, 3, 4];
+</pre>
+
+      <p id="without">
+        <b class="header">without</b><code>_.without(array, [*values])</code>
+        <br />
+        Returns a copy of the <b>array</b> with all instances of the <b>values</b>
+        removed. <i>===</i> is used for the equality test.
+      </p>
+      <pre>
+_.without([1, 2, 1, 0, 3, 1, 4], 0, 1);
+=> [2, 3, 4]
+</pre>
+
+      <p id="union">
+        <b class="header">union</b><code>_.union(*arrays)</code>
+        <br />
+        Computes the union of the passed-in <b>arrays</b>: the list of unique items,
+        in order, that are present in one or more of the <b>arrays</b>.
+      </p>
+      <pre>
+_.union([1, 2, 3], [101, 2, 1, 10], [2, 1]);
+=> [1, 2, 3, 101, 10]
+</pre>
+
+      <p id="intersection">
+        <b class="header">intersection</b><code>_.intersection(*arrays)</code>
+        <br />
+        Computes the list of values that are the intersection of all the <b>arrays</b>.
+        Each value in the result is present in each of the <b>arrays</b>.
+      </p>
+      <pre>
+_.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]);
+=> [1, 2]
+</pre>
+
+      <p id="difference">
+        <b class="header">difference</b><code>_.difference(array, other)</code>
+        <br />
+        Similar to <b>without</b>, but returns the values from <b>array</b> that
+        are not present in <b>other</b>.
+      </p>
+      <pre>
+_.difference([1, 2, 3, 4, 5], [5, 2, 10]);
+=> [1, 3, 4]
+</pre>
+
+      <p id="uniq">
+        <b class="header">uniq</b><code>_.uniq(array, [isSorted])</code>
+        <span class="alias">Alias: <b>unique</b></span>
+        <br />
+        Produces a duplicate-free version of the <b>array</b>, using <i>===</i> to test
+        object equality. If you know in advance that the <b>array</b> is sorted,
+        passing <i>true</i> for <b>isSorted</b> will run a much faster algorithm.
+      </p>
+      <pre>
+_.uniq([1, 2, 1, 3, 1, 4]);
+=> [1, 2, 3, 4]
+</pre>
+
+      <p id="zip">
+        <b class="header">zip</b><code>_.zip(*arrays)</code>
+        <br />
+        Merges together the values of each of the <b>arrays</b> with the
+        values at the corresponding position. Useful when you have separate
+        data sources that are coordinated through matching array indexes.
+        If you're working with a matrix of nested arrays, <b>zip.apply</b>
+        can transpose the matrix in a similar fashion.
+      </p>
+      <pre>
+_.zip(['moe', 'larry', 'curly'], [30, 40, 50], [true, false, false]);
+=> [["moe", 30, true], ["larry", 40, false], ["curly", 50, false]]
+</pre>
+
+      <p id="indexOf">
+        <b class="header">indexOf</b><code>_.indexOf(array, value, [isSorted])</code>
+        <br />
+        Returns the index at which <b>value</b> can be found in the <b>array</b>,
+        or <i>-1</i> if value is not present in the <b>array</b>. Uses the native
+        <b>indexOf</b> function unless it's missing. If you're working with a 
+        large array, and you know that the array is already sorted, pass <tt>true</tt>
+        for <b>isSorted</b> to use a faster binary search.
+      </p>
+      <pre>
+_.indexOf([1, 2, 3], 2);
+=> 1
+</pre>
+
+      <p id="lastIndexOf">
+        <b class="header">lastIndexOf</b><code>_.lastIndexOf(array, value)</code>
+        <br />
+        Returns the index of the last occurrence of <b>value</b> in the <b>array</b>,
+        or <i>-1</i> if value is not present. Uses the native <b>lastIndexOf</b>
+        function if possible.
+      </p>
+      <pre>
+_.lastIndexOf([1, 2, 3, 1, 2, 3], 2);
+=> 4
+</pre>
+
+      <p id="range">
+        <b class="header">range</b><code>_.range([start], stop, [step])</code>
+        <br />
+        A function to create flexibly-numbered lists of integers, handy for
+        <tt>each</tt> and <tt>map</tt> loops. <b>start</b>, if omitted, defaults
+        to <i>0</i>; <b>step</b> defaults to <i>1</i>. Returns a list of integers
+        from <b>start</b> to <b>stop</b>, incremented (or decremented) by <b>step</b>,
+        exclusive.
+      </p>
+      <pre>
+_.range(10);
+=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+_.range(1, 11);
+=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+_.range(0, 30, 5);
+=> [0, 5, 10, 15, 20, 25]
+_.range(0, -10, -1);
+=> [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
+_.range(0);
+=> []
+</pre>
+
+      <h2>Function (uh, ahem) Functions</h2>
+
+      <p id="bind">
+        <b class="header">bind</b><code>_.bind(function, object, [*arguments])</code>
+        <br />
+        Bind a <b>function</b> to an <b>object</b>, meaning that whenever
+        the function is called, the value of <i>this</i> will be the <b>object</b>.
+        Optionally, bind <b>arguments</b> to the <b>function</b> to pre-fill them,
+        also known as <b>currying</b>.
+      </p>
+      <pre>
+var func = function(greeting){ return greeting + ': ' + this.name };
+func = _.bind(func, {name : 'moe'}, 'hi');
+func();
+=> 'hi: moe'
+</pre>
+
+      <p id="bindAll">
+        <b class="header">bindAll</b><code>_.bindAll(object, [*methodNames])</code>
+        <br />
+        Binds a number of methods on the <b>object</b>, specified by
+        <b>methodNames</b>, to be run in the context of that object whenever they
+        are invoked. Very handy for binding functions that are going to be used
+        as event handlers, which would otherwise be invoked with a fairly useless
+        <i>this</i>. If no <b>methodNames</b> are provided, all of the object's
+        function properties will be bound to it.
+      </p>
+      <pre>
+var buttonView = {
+  label   : 'underscore',
+  onClick : function(){ alert('clicked: ' + this.label); },
+  onHover : function(){ console.log('hovering: ' + this.label); }
+};
+_.bindAll(buttonView);
+jQuery('#underscore_button').bind('click', buttonView.onClick);
+=> When the button is clicked, this.label will have the correct value...
+</pre>
+
+      <p id="memoize">
+        <b class="header">memoize</b><code>_.memoize(function, [hashFunction])</code>
+        <br />
+        Memoizes a given <b>function</b> by caching the computed result. Useful
+        for speeding up slow-running computations. If passed an optional 
+        <b>hashFunction</b>, it will be used to compute the hash key for storing
+        the result, based on the arguments to the original function. The default
+        <b>hashFunction</b> just uses the first argument to the memoized function
+        as the key.
+      </p>
+      <pre>
+var fibonacci = function(n) {
+  return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
+};
+var fastFibonacci = _.memoize(fibonacci);
+</pre>
+
+      <p id="delay">
+        <b class="header">delay</b><code>_.delay(function, wait, [*arguments])</code>
+        <br />
+        Much like <b>setTimeout</b>, invokes <b>function</b> after <b>wait</b>
+        milliseconds. If you pass the optional <b>arguments</b>, they will be
+        forwarded on to the <b>function</b> when it is invoked.
+      </p>
+      <pre>
+var log = _.bind(console.log, console);
+_.delay(log, 1000, 'logged later');
+=> 'logged later' // Appears after one second.
+</pre>
+
+      <p id="defer">
+        <b class="header">defer</b><code>_.defer(function)</code>
+        <br />
+        Defers invoking the <b>function</b> until the current call stack has cleared,
+        similar to using <b>setTimeout</b> with a delay of 0. Useful for performing
+        expensive computations or HTML rendering in chunks without blocking the UI thread
+        from updating.
+      </p>
+      <pre>
+_.defer(function(){ alert('deferred'); });
+// Returns from the function before the alert runs.
+</pre>
+
+      <p id="throttle">
+        <b class="header">throttle</b><code>_.throttle(function, wait)</code>
+        <br />
+        Returns a throttled version of the function, that, when invoked repeatedly, 
+        will only actually call the wrapped function at most once per every <b>wait</b>
+        milliseconds. Useful for rate-limiting events that occur faster than you
+        can keep up with.
+      </p>
+      <pre>
+var throttled = _.throttle(updatePosition, 100);
+$(window).scroll(throttled);
+</pre>
+
+      <p id="debounce">
+        <b class="header">debounce</b><code>_.debounce(function, wait)</code>
+        <br />
+        Repeated calls to a debounced function will postpone it's execution
+        until after <b>wait</b> milliseconds have elapsed. Useful for implementing
+        behavior that should only happen <i>after</i> the input has stopped arriving.
+        For example: rendering a preview of a Markdown comment, recalculating a
+        layout after the window has stopped being resized...
+      </p>
+      <pre>
+var lazyLayout = _.debounce(calculateLayout, 300);
+$(window).resize(lazyLayout);
+</pre>
+
+      <p id="once">
+        <b class="header">once</b><code>_.once(function)</code>
+        <br />
+        Creates a version of the function that can only be called one time. 
+        Repeated calls to the modified function will have no effect, returning
+        the value from the original call. Useful for initialization functions,
+        instead of having to set a boolean flag and then check it later.
+      </p>
+      <pre>
+var initialize = _.once(createApplication);
+initialize();
+initialize();
+// Application is only created once.
+</pre>
+
+      <p id="after">
+        <b class="header">after</b><code>_.after(count, function)</code>
+        <br />
+        Creates a version of the function that will only be run after first 
+        being called <b>count</b> times. Useful for grouping asynchronous responses,
+        where you want to be sure that all the async calls have finished, before
+        proceeding.
+      </p>
+      <pre>
+var renderNotes = _.after(notes.length, render);
+_.each(notes, function(note) {
+  note.asyncSave({success: renderNotes}); 
+});
+// renderNotes is run once, after all notes have saved.
+</pre>
+
+      <p id="wrap">
+        <b class="header">wrap</b><code>_.wrap(function, wrapper)</code>
+        <br />
+        Wraps the first <b>function</b> inside of the <b>wrapper</b> function,
+        passing it as the first argument. This allows the <b>wrapper</b> to
+        execute code before and after the <b>function</b> runs, adjust the arguments,
+        and execute it conditionally.
+      </p>
+      <pre>
+var hello = function(name) { return "hello: " + name; };
+hello = _.wrap(hello, function(func) {
+  return "before, " + func("moe") + ", after";
+});
+hello();
+=> 'before, hello: moe, after'
+</pre>
+
+      <p id="compose">
+        <b class="header">compose</b><code>_.compose(*functions)</code>
+        <br />
+        Returns the composition of a list of <b>functions</b>, where each function
+        consumes the return value of the function that follows. In math terms,
+        composing the functions <i>f()</i>, <i>g()</i>, and <i>h()</i> produces
+        <i>f(g(h()))</i>.
+      </p>
+      <pre>
+var greet    = function(name){ return "hi: " + name; };
+var exclaim  = function(statement){ return statement + "!"; };
+var welcome = _.compose(exclaim, greet);
+welcome('moe');
+=> 'hi: moe!'
+</pre>
+
+      <h2>Object Functions</h2>
+
+      <p id="keys">
+        <b class="header">keys</b><code>_.keys(object)</code>
+        <br />
+        Retrieve all the names of the <b>object</b>'s properties.
+      </p>
+      <pre>
+_.keys({one : 1, two : 2, three : 3});
+=> ["one", "two", "three"]
+</pre>
+
+      <p id="values">
+        <b class="header">values</b><code>_.values(object)</code>
+        <br />
+        Return all of the values of the <b>object</b>'s properties.
+      </p>
+      <pre>
+_.values({one : 1, two : 2, three : 3});
+=> [1, 2, 3]
+</pre>
+
+      <p id="functions">
+        <b class="header">functions</b><code>_.functions(object)</code>
+        <span class="alias">Alias: <b>methods</b></span>
+        <br />
+        Returns a sorted list of the names of every method in an object —
+        that is to say, the name of every function property of the object.
+      </p>
+      <pre>
+_.functions(_);
+=> ["all", "any", "bind", "bindAll", "clone", "compact", "compose" ...
+</pre>
+
+      <p id="extend">
+        <b class="header">extend</b><code>_.extend(destination, *sources)</code>
+        <br />
+        Copy all of the properties in the <b>source</b> objects over to the
+        <b>destination</b> object. It's in-order, to the last source will override
+        properties of the same name in previous arguments.
+      </p>
+      <pre>
+_.extend({name : 'moe'}, {age : 50});
+=> {name : 'moe', age : 50}
+</pre>
+
+      <p id="defaults">
+        <b class="header">defaults</b><code>_.defaults(object, *defaults)</code>
+        <br />
+        Fill in missing properties in <b>object</b> with default values from the
+        <b>defaults</b> objects. As soon as the property is filled, further defaults
+        will have no effect.
+      </p>
+      <pre>
+var iceCream = {flavor : "chocolate"};
+_.defaults(iceCream, {flavor : "vanilla", sprinkles : "lots"});
+=> {flavor : "chocolate", sprinkles : "lots"}
+</pre>
+
+      <p id="clone">
+        <b class="header">clone</b><code>_.clone(object)</code>
+        <br />
+        Create a shallow-copied clone of the <b>object</b>. Any nested objects
+        or arrays will be copied by reference, not duplicated.
+      </p>
+      <pre>
+_.clone({name : 'moe'});
+=> {name : 'moe'};
+</pre>
+
+      <p id="tap">
+        <b class="header">tap</b><code>_.tap(object, interceptor)</code>
+        <br />
+        Invokes <b>interceptor</b> with the <b>object</b>, and then returns <b>object</b>.
+        The primary purpose of this method is to "tap into" a method chain, in order to perform operations on intermediate results within the chain.
+      </p>
+      <pre>
+_([1,2,3,200]).chain().
+  select(function(num) { return num % 2 == 0; }).
+  tap(console.log).
+  map(function(num) { return num * num }).
+  value();
+=> [2, 200]
+=> [4, 40000]
+</pre>
+
+      <p id="isEqual">
+        <b class="header">isEqual</b><code>_.isEqual(object, other)</code>
+        <br />
+        Performs an optimized deep comparison between the two objects, to determine
+        if they should be considered equal.
+      </p>
+      <pre>
+var moe   = {name : 'moe', luckyNumbers : [13, 27, 34]};
+var clone = {name : 'moe', luckyNumbers : [13, 27, 34]};
+moe == clone;
+=> false
+_.isEqual(moe, clone);
+=> true
+</pre>
+
+      <p id="isEmpty">
+        <b class="header">isEmpty</b><code>_.isEmpty(object)</code>
+        <br />
+        Returns <i>true</i> if <b>object</b> contains no values.
+      </p>
+      <pre>
+_.isEmpty([1, 2, 3]);
+=> false
+_.isEmpty({});
+=> true
+</pre>
+
+      <p id="isElement">
+        <b class="header">isElement</b><code>_.isElement(object)</code>
+        <br />
+        Returns <i>true</i> if <b>object</b> is a DOM element.
+      </p>
+      <pre>
+_.isElement(jQuery('body')[0]);
+=> true
+</pre>
+
+      <p id="isArray">
+        <b class="header">isArray</b><code>_.isArray(object)</code>
+        <br />
+        Returns <i>true</i> if <b>object</b> is an Array.
+      </p>
+      <pre>
+(function(){ return _.isArray(arguments); })();
+=> false
+_.isArray([1,2,3]);
+=> true
+</pre>
+
+      <p id="isArguments">
+        <b class="header">isArguments</b><code>_.isArguments(object)</code>
+        <br />
+        Returns <i>true</i> if <b>object</b> is an Arguments object.
+      </p>
+      <pre>
+(function(){ return _.isArguments(arguments); })(1, 2, 3);
+=> true
+_.isArguments([1,2,3]);
+=> false
+</pre>
+
+      <p id="isFunction">
+        <b class="header">isFunction</b><code>_.isFunction(object)</code>
+        <br />
+        Returns <i>true</i> if <b>object</b> is a Function.
+      </p>
+      <pre>
+_.isFunction(alert);
+=> true
+</pre>
+
+      <p id="isString">
+        <b class="header">isString</b><code>_.isString(object)</code>
+        <br />
+        Returns <i>true</i> if <b>object</b> is a String.
+      </p>
+      <pre>
+_.isString("moe");
+=> true
+</pre>
+
+      <p id="isNumber">
+        <b class="header">isNumber</b><code>_.isNumber(object)</code>
+        <br />
+        Returns <i>true</i> if <b>object</b> is a Number.
+      </p>
+      <pre>
+_.isNumber(8.4 * 5);
+=> true
+</pre>
+
+      <p id="isBoolean">
+        <b class="header">isBoolean</b><code>_.isBoolean(object)</code>
+        <br />
+        Returns <i>true</i> if <b>object</b> is either <i>true</i> or <i>false</i>.
+      </p>
+      <pre>
+_.isBoolean(null);
+=> false
+</pre>
+
+      <p id="isDate">
+        <b class="header">isDate</b><code>_.isDate(object)</code>
+        <br />
+        Returns <i>true</i> if <b>object</b> is a Date.
+      </p>
+      <pre>
+_.isDate(new Date());
+=> true
+</pre>
+
+      <p id="isRegExp">
+        <b class="header">isRegExp</b><code>_.isRegExp(object)</code>
+        <br />
+        Returns <i>true</i> if <b>object</b> is a RegExp.
+      </p>
+      <pre>
+_.isRegExp(/moe/);
+=> true
+</pre>
+
+      <p id="isNaN">
+        <b class="header">isNaN</b><code>_.isNaN(object)</code>
+        <br />
+        Returns <i>true</i> if <b>object</b> is <i>NaN</i>.<br /> Note: this is not
+        the same as the native <b>isNaN</b> function, which will also return
+        true if the variable is <i>undefined</i>.
+      </p>
+      <pre>
+_.isNaN(NaN);
+=> true
+isNaN(undefined);
+=> true
+_.isNaN(undefined);
+=> false
+</pre>
+
+      <p id="isNull">
+        <b class="header">isNull</b><code>_.isNull(object)</code>
+        <br />
+        Returns <i>true</i> if the value of <b>object</b> is <i>null</i>.
+      </p>
+      <pre>
+_.isNull(null);
+=> true
+_.isNull(undefined);
+=> false
+</pre>
+
+      <p id="isUndefined">
+        <b class="header">isUndefined</b><code>_.isUndefined(variable)</code>
+        <br />
+        Returns <i>true</i> if <b>variable</b> is <i>undefined</i>.
+      </p>
+      <pre>
+_.isUndefined(window.missingVariable);
+=> true
+</pre>
+
+      <h2>Utility Functions</h2>
+
+      <p id="noConflict">
+        <b class="header">noConflict</b><code>_.noConflict()</code>
+        <br />
+        Give control of the "_" variable back to its previous owner. Returns
+        a reference to the <b>Underscore</b> object.
+      </p>
+      <pre>
+var underscore = _.noConflict();</pre>
+
+      <p id="identity">
+        <b class="header">identity</b><code>_.identity(value)</code>
+        <br />
+        Returns the same value that is used as the argument. In math:
+        <tt>f(x) = x</tt><br />
+        This function looks useless, but is used throughout Underscore as
+        a default iterator.
+      </p>
+      <pre>
+var moe = {name : 'moe'};
+moe === _.identity(moe);
+=> true</pre>
+
+      <p id="times">
+        <b class="header">times</b><code>_.times(n, iterator)</code>
+        <br />
+        Invokes the given iterator function <b>n</b> times.
+      </p>
+      <pre>
+_(3).times(function(){ genie.grantWish(); });</pre>
+
+      <p id="mixin">
+        <b class="header">mixin</b><code>_.mixin(object)</code>
+        <br />
+        Allows you to extend Underscore with your own utility functions. Pass
+        a hash of <tt>{name: function}</tt> definitions to have your functions 
+        added to the Underscore object, as well as the OOP wrapper.
+      </p>
+      <pre>
+_.mixin({
+  capitalize : function(string) {
+    return string.charAt(0).toUpperCase() + string.substring(1).toLowerCase();
+  }
+});
+_("fabio").capitalize();
+=> "Fabio"
+</pre>
+
+      <p id="uniqueId">
+        <b class="header">uniqueId</b><code>_.uniqueId([prefix])</code>
+        <br />
+        Generate a globally-unique id for client-side models or DOM elements
+        that need one. If <b>prefix</b> is passed, the id will be appended to it.
+      </p>
+      <pre>
+_.uniqueId('contact_');
+=> 'contact_104'</pre>
+
+      <p id="template">
+        <b class="header">template</b><code>_.template(templateString, [context])</code>
+        <br />
+        Compiles JavaScript templates into functions that can be evaluated
+        for rendering. Useful for rendering complicated bits of HTML from JSON
+        data sources. Template functions can both interpolate variables, using<br />
+        <tt><%= … %></tt>, as well as execute arbitrary JavaScript code, with
+        <tt><% … %></tt>. When you evaluate a template function, pass in a
+        <b>context</b> object that has properties corresponding to the template's free
+        variables. If you're writing a one-off, you can pass the <b>context</b>
+        object as the second parameter to <b>template</b> in order to render
+        immediately instead of returning a template function.
+      </p>
+      <pre>
+var compiled = _.template("hello: <%= name %>");
+compiled({name : 'moe'});
+=> "hello: moe"
+
+var list = "<% _.each(people, function(name) { %> <li><%= name %></li> <% }); %>";
+_.template(list, {people : ['moe', 'curly', 'larry']});
+=> "<li>moe</li><li>curly</li><li>larry</li>"</pre>
+
+      <p>
+        You can also use <tt>print</tt> from within JavaScript code.  This is
+        sometimes more convenient than using <tt><%= ... %></tt>.
+      </p>
+      
+      <pre>
+var compiled = _.template("<% print('Hello ' + epithet); %>");
+compiled({epithet: "stooge"});
+=> "Hello stooge."</pre>
+
+      <p>
+        If ERB-style delimiters aren't your cup of tea, you can change Underscore's
+        template settings to use different symbols to set off interpolated code.
+        Define an <b>interpolate</b> regex, and an (optional) <b>evaluate</b> regex
+        to match expressions that should be inserted and evaluated, respectively.
+        If no <b>evaluate</b> regex is provided, your templates will only be 
+        capable of interpolating values. 
+        For example, to perform
+        <a href="http://github.com/janl/mustache.js#readme">Mustache.js</a>
+        style templating:
+      </p>
+
+      <pre>
+_.templateSettings = {
+  interpolate : /\{\{(.+?)\}\}/g
+};
+
+var template = _.template("Hello {{ name }}!");
+template({name : "Mustache"});
+=> "Hello Mustache!"</pre>
+
+      <h2>Chaining</h2>
+
+      <p id="chain">
+        <b class="header">chain</b><code>_(obj).chain()</code>
+        <br />
+        Returns a wrapped object. Calling methods on this object will continue
+        to return wrapped objects until <tt>value</tt> is used. (
+        <a href="#styles">A more realistic example.</a>)
+      </p>
+      <pre>
+var stooges = [{name : 'curly', age : 25}, {name : 'moe', age : 21}, {name : 'larry', age : 23}];
+var youngest = _(stooges).chain()
+  .sortBy(function(stooge){ return stooge.age; })
+  .map(function(stooge){ return stooge.name + ' is ' + stooge.age; })
+  .first()
+  .value();
+=> "moe is 21"
+</pre>
+
+      <p id="value">
+        <b class="header">value</b><code>_(obj).value()</code>
+        <br />
+        Extracts the value of a wrapped object.
+      </p>
+      <pre>
+_([1, 2, 3]).value();
+=> [1, 2, 3]
+</pre>
+
+      <h2 id="duck_typing">Duck Typing</h2>
+
+      <p>
+        The <b>isType</b> (<tt>isArray</tt>, <tt>isFunction</tt>, <tt>isString</tt> ...) family of type-checking
+        functions use property detection to do their work, which, although
+        orders of magnitude faster than the alternative, isn't entirely safe when dealing
+        with objects that are used as hashes, where arbitrary strings are being
+        set for the keys. It's entirely possible for an object to masquerade as
+        another type, if you're setting properties with names like "concat" and
+        "charCodeAt". So be aware.
+      </p>
+
+
+      <h2>Links & Suggested Reading</h2>
+
+      <p>
+        <a href="http://mirven.github.com/underscore.lua/">Underscore.lua</a>,
+        a Lua port of the functions that are applicable in both languages.
+        Includes OOP-wrapping and chaining.
+        The <a href="http://github.com/mirven/underscore.lua">source</a> is
+        available on GitHub.
+      </p>
+      
+      <p>
+        <a href="https://github.com/edtsech/underscore.string">Underscore.string</a>,
+        an Underscore extension that adds functions for string-manipulation: 
+        <tt>trim</tt>, <tt>startsWith</tt>, <tt>contains</tt>, <tt>capitalize</tt>,
+        <tt>reverse</tt>, <tt>sprintf</tt>, and more.
+      </p>
+
+      <p>
+        Ruby's <a href="http://ruby-doc.org/core/classes/Enumerable.html">Enumerable</a> module.
+      </p>
+
+      <p>
+        <a href="http://www.prototypejs.org/">Prototype.js</a>, which provides
+        JavaScript with collection functions in the manner closest to Ruby's Enumerable.
+      </p>
+
+      <p>
+        Oliver Steele's
+        <a href="http://osteele.com/sources/javascript/functional/">Functional JavaScript</a>,
+        which includes comprehensive higher-order function support as well as string lambdas.
+      </p>
+      
+      <p>
+        Michael Aufreiter's <a href="http://substance.io/#michael/data-js">Data.js</a>,
+        a data manipulation + persistence library for JavaScript.
+      </p>
+
+      <p>
+        Python's <a href="http://docs.python.org/library/itertools.html">itertools</a>.
+      </p>
+
+      <h2 id="changelog">Change Log</h2>
+      
+      <p>
+        <b class="header">1.1.7</b> — <small><i>July 13, 2011</i></small><br />
+        Added <tt>_.groupBy</tt>, which aggregates a collection into groups of like items.
+        Added <tt>_.untion</tt> and <tt>_.difference</tt>, to complement the 
+        (re-named) <tt>_.intersection</tt>.
+        Various improvements for support of sparse arrays.
+        <tt>_.toArray</tt> now returns a clone, if directly passed an array.
+        <tt>_.functions</tt> now also returns the names of functions that are present
+        in the prototype chain.
+      </p>
+            
+      <p>
+        <b class="header">1.1.6</b> — <small><i>April 18, 2011</i></small><br />
+        Added <tt>_.after</tt>, which will return a function that only runs after
+        first being called a specified number of times.
+        <tt>_.invoke</tt> can now take a direct function reference.
+        <tt>_.every</tt> now requires an iterator function to be passed, which
+        mirrors the ECMA5 API.
+        <tt>_.extend</tt> no longer copies keys when the value is undefined.
+        <tt>_.bind</tt> now errors when trying to bind an undefined value.
+      </p>
+      
+      <p>
+        <b class="header">1.1.5</b> — <small><i>Mar 20, 2011</i></small><br />
+        Added an <tt>_.defaults</tt> function, for use merging together JS objects
+        representing default options.
+        Added an <tt>_.once</tt> function, for manufacturing functions that should
+        only ever execute a single time.
+        <tt>_.bind</tt> now delegates to the native ECMAScript 5 version, 
+        where available.
+        <tt>_.keys</tt> now throws an error when used on non-Object values, as in
+        ECMAScript 5.
+        Fixed a bug with <tt>_.keys</tt> when used over sparse arrays.
+      </p>
+      
+      <p>
+        <b class="header">1.1.4</b> — <small><i>Jan 9, 2011</i></small><br />
+        Improved compliance with ES5's Array methods when passing <tt>null</tt> 
+        as a value. <tt>_.wrap</tt> now correctly sets <tt>this</tt> for the
+        wrapped function. <tt>_.indexOf</tt> now takes an optional flag for
+        finding the insertion index in an array that is guaranteed to already
+        be sorted. Avoiding the use of <tt>.callee</tt>, to allow <tt>_.isArray</tt>
+        to work properly in ES5's strict mode.
+      </p>
+      
+      <p>
+        <b class="header">1.1.3</b> — <small><i>Dec 1, 2010</i></small><br />
+        In CommonJS, Underscore may now be required with just: <br />
+        <tt>var _ = require("underscore")</tt>.
+        Added <tt>_.throttle</tt> and <tt>_.debounce</tt> functions.
+        Removed <tt>_.breakLoop</tt>, in favor of an ECMA5-style un-<i>break</i>-able
+        each implementation — this removes the try/catch, and you'll now have
+        better stack traces for exceptions that are thrown within an Underscore iterator.
+        Improved the <b>isType</b> family of functions for better interoperability
+        with Internet Explorer host objects.
+        <tt>_.template</tt> now correctly escapes backslashes in templates.
+        Improved <tt>_.reduce</tt> compatibility with the ECMA5 version: 
+        if you don't pass an initial value, the first item in the collection is used.
+        <tt>_.each</tt> no longer returns the iterated collection, for improved
+        consistency with ES5's <tt>forEach</tt>.
+      </p>
+      
+      <p>
+        <b class="header">1.1.2</b><br />
+        Fixed <tt>_.contains</tt>, which was mistakenly pointing at 
+        <tt>_.intersect</tt> instead of <tt>_.include</tt>, like it should 
+        have been. Added <tt>_.unique</tt> as an alias for <tt>_.uniq</tt>.
+      </p>
+      
+      <p>
+        <b class="header">1.1.1</b><br />
+        Improved the speed of <tt>_.template</tt>, and its handling of multiline
+        interpolations. Ryan Tenney contributed optimizations to many Underscore 
+        functions. An annotated version of the source code is now available.
+      </p>
+      
+      <p>
+        <b class="header">1.1.0</b><br />
+        The method signature of <tt>_.reduce</tt> has been changed to match
+        the ECMAScript 5 signature, instead of the Ruby/Prototype.js version.
+        This is a backwards-incompatible change. <tt>_.template</tt> may now be
+        called with no arguments, and preserves whitespace. <tt>_.contains</tt>
+        is a new alias for <tt>_.include</tt>.
+      </p>
+      
+      <p>
+        <b class="header">1.0.4</b><br />
+        <a href="http://themoell.com/">Andri Möll</a> contributed the <tt>_.memoize</tt> 
+        function, which can be used to speed up expensive repeated computations 
+        by caching the results.
+      </p>
+      
+      <p>
+        <b class="header">1.0.3</b><br />
+        Patch that makes <tt>_.isEqual</tt> return <tt>false</tt> if any property
+        of the compared object has a <tt>NaN</tt> value. Technically the correct
+        thing to do, but of questionable semantics. Watch out for NaN comparisons.
+      </p>
+      
+      <p>
+        <b class="header">1.0.2</b><br />
+        Fixes <tt>_.isArguments</tt> in recent versions of Opera, which have
+        arguments objects as real Arrays.
+      </p>
+      
+      <p>
+        <b class="header">1.0.1</b><br />
+        Bugfix for <tt>_.isEqual</tt>, when comparing two objects with the same 
+        number of undefined keys, but with different names.
+      </p>
+      
+      <p>
+        <b class="header">1.0.0</b><br />
+        Things have been stable for many months now, so Underscore is now
+        considered to be out of beta, at <b>1.0</b>. Improvements since <b>0.6</b>
+        include <tt>_.isBoolean</tt>, and the ability to have <tt>_.extend</tt>
+        take multiple source objects.
+      </p>
+      
+      <p>
+        <b class="header">0.6.0</b><br />
+        Major release. Incorporates a number of 
+        <a href="http://github.com/ratbeard">Mile Frawley's</a> refactors for
+        safer duck-typing on collection functions, and cleaner internals. A new
+        <tt>_.mixin</tt> method that allows you to extend Underscore with utility
+        functions of your own. Added <tt>_.times</tt>, which works the same as in 
+        Ruby or Prototype.js. Native support for ECMAScript 5's <tt>Array.isArray</tt>, 
+        and <tt>Object.keys</tt>.
+      </p>
+
+      <p>
+        <b class="header">0.5.8</b><br />
+        Fixed Underscore's collection functions to work on
+        <a href="https://developer.mozilla.org/En/DOM/NodeList">NodeLists</a> and
+        <a href="https://developer.mozilla.org/En/DOM/HTMLCollection">HTMLCollections</a>
+        once more, thanks to
+        <a href="http://github.com/jmtulloss">Justin Tulloss</a>.
+      </p>
+
+      <p>
+        <b class="header">0.5.7</b><br />
+        A safer implementation of <tt>_.isArguments</tt>, and a
+        faster <tt>_.isNumber</tt>,<br />thanks to
+        <a href="http://jedschmidt.com/">Jed Schmidt</a>.
+      </p>
+
+      <p>
+        <b class="header">0.5.6</b><br />
+        Customizable delimiters for <tt>_.template</tt>, contributed by
+        <a href="http://github.com/iamnoah">Noah Sloan</a>.
+      </p>
+
+      <p>
+        <b class="header">0.5.5</b><br />
+        Fix for a bug in MobileSafari's OOP-wrapper, with the arguments object.
+      </p>
+
+      <p>
+        <b class="header">0.5.4</b><br />
+        Fix for multiple single quotes within a template string for
+        <tt>_.template</tt>. See:
+        <a href="http://www.west-wind.com/Weblog/posts/509108.aspx">Rick Strahl's blog post</a>.
+      </p>
+
+      <p>
+        <b class="header">0.5.2</b><br />
+        New implementations of <tt>isArray</tt>, <tt>isDate</tt>, <tt>isFunction</tt>,
+        <tt>isNumber</tt>, <tt>isRegExp</tt>, and <tt>isString</tt>, thanks to
+        a suggestion from
+        <a href="http://www.broofa.com/">Robert Kieffer</a>.
+        Instead of doing <tt>Object#toString</tt>
+        comparisons, they now check for expected properties, which is less safe,
+        but more than an order of magnitude faster. Most other Underscore
+        functions saw minor speed improvements as a result.
+        <a href="http://dolzhenko.org/">Evgeniy Dolzhenko</a>
+        contributed <tt>_.tap</tt>,
+        <a href="http://ruby-doc.org/core-1.9/classes/Object.html#M000191">similar to Ruby 1.9's</a>,
+        which is handy for injecting side effects (like logging) into chained calls.
+      </p>
+
+      <p>
+        <b class="header">0.5.1</b><br />
+        Added an <tt>_.isArguments</tt> function. Lots of little safety checks
+        and optimizations contributed by
+        <a href="http://github.com/iamnoah/">Noah Sloan</a> and 
+        <a href="http://themoell.com/">Andri Möll</a>.
+      </p>
+
+      <p>
+        <b class="header">0.5.0</b><br />
+        <b>[API Changes]</b> <tt>_.bindAll</tt> now takes the context object as
+        its first parameter. If no method names are passed, all of the context
+        object's methods are bound to it, enabling chaining and easier binding.
+        <tt>_.functions</tt> now takes a single argument and returns the names
+        of its Function properties. Calling <tt>_.functions(_)</tt> will get you
+        the previous behavior.
+        Added <tt>_.isRegExp</tt> so that <tt>isEqual</tt> can now test for RegExp equality.
+        All of the "is" functions have been shrunk down into a single definition.
+        <a href="http://github.com/grayrest/">Karl Guertin</a> contributed patches.
+      </p>
+
+      <p>
+        <b class="header">0.4.7</b><br />
+        Added <tt>isDate</tt>, <tt>isNaN</tt>, and <tt>isNull</tt>, for completeness.
+        Optimizations for <tt>isEqual</tt> when checking equality between Arrays
+        or Dates. <tt>_.keys</tt> is now <small><i><b>25%–2X</b></i></small> faster (depending on your
+        browser) which speeds up the functions that rely on it, such as <tt>_.each</tt>.
+      </p>
+
+      <p>
+        <b class="header">0.4.6</b><br />
+        Added the <tt>range</tt> function, a port of the
+        <a href="http://docs.python.org/library/functions.html#range">Python
+        function of the same name</a>, for generating flexibly-numbered lists
+        of integers. Original patch contributed by
+        <a href="http://github.com/kylichuku">Kirill Ishanov</a>.
+      </p>
+
+      <p>
+        <b class="header">0.4.5</b><br />
+        Added <tt>rest</tt> for Arrays and arguments objects, and aliased
+        <tt>first</tt> as <tt>head</tt>, and <tt>rest</tt> as <tt>tail</tt>,
+        thanks to <a href="http://github.com/lukesutton/">Luke Sutton</a>'s patches.
+        Added tests ensuring that all Underscore Array functions also work on
+        <i>arguments</i> objects.
+      </p>
+
+      <p>
+        <b class="header">0.4.4</b><br />
+        Added <tt>isString</tt>, and <tt>isNumber</tt>, for consistency. Fixed
+        <tt>_.isEqual(NaN, NaN)</tt> to return <i>true</i> (which is debatable).
+      </p>
+
+      <p>
+        <b class="header">0.4.3</b><br />
+        Started using the native <tt>StopIteration</tt> object in browsers that support it.
+        Fixed Underscore setup for CommonJS environments.
+      </p>
+
+      <p>
+        <b class="header">0.4.2</b><br />
+        Renamed the unwrapping function to <tt>value</tt>, for clarity.
+      </p>
+
+      <p>
+        <b class="header">0.4.1</b><br />
+        Chained Underscore objects now support the Array prototype methods, so
+        that you can perform the full range of operations on a wrapped array
+        without having to break your chain. Added a <tt>breakLoop</tt> method
+        to <b>break</b> in the middle of any Underscore iteration. Added an
+        <tt>isEmpty</tt> function that works on arrays and objects.
+      </p>
+
+      <p>
+        <b class="header">0.4.0</b><br />
+        All Underscore functions can now be called in an object-oriented style,
+        like so: <tt>_([1, 2, 3]).map(...);</tt>. Original patch provided by
+        <a href="http://macournoyer.com/">Marc-André Cournoyer</a>.
+        Wrapped objects can be chained through multiple
+        method invocations. A <a href="#functions"><tt>functions</tt></a> method
+        was added, providing a sorted list of all the functions in Underscore.
+      </p>
+
+      <p>
+        <b class="header">0.3.3</b><br />
+        Added the JavaScript 1.8 function <tt>reduceRight</tt>. Aliased it
+        as <tt>foldr</tt>, and aliased <tt>reduce</tt> as <tt>foldl</tt>.
+      </p>
+
+      <p>
+        <b class="header">0.3.2</b><br />
+        Now runs on stock <a href="http://www.mozilla.org/rhino/">Rhino</a>
+        interpreters with: <tt>load("underscore.js")</tt>.
+        Added <a href="#identity"><tt>identity</tt></a> as a utility function.
+      </p>
+
+      <p>
+        <b class="header">0.3.1</b><br />
+        All iterators are now passed in the original collection as their third
+        argument, the same as JavaScript 1.6's <b>forEach</b>. Iterating over
+        objects is now called with <tt>(value, key, collection)</tt>, for details
+        see <a href="#each"><tt>_.each</tt></a>.
+      </p>
+
+      <p>
+        <b class="header">0.3.0</b><br />
+        Added <a href="http://github.com/dmitryBaranovskiy">Dmitry Baranovskiy</a>'s
+        comprehensive optimizations, merged in
+        <a href="http://github.com/kriskowal/">Kris Kowal</a>'s patches to make Underscore
+        <a href="http://wiki.commonjs.org/wiki/CommonJS">CommonJS</a> and
+        <a href="http://narwhaljs.org/">Narwhal</a> compliant.
+      </p>
+
+      <p>
+        <b class="header">0.2.0</b><br />
+        Added <tt>compose</tt> and <tt>lastIndexOf</tt>, renamed <tt>inject</tt> to
+        <tt>reduce</tt>, added aliases for <tt>inject</tt>, <tt>filter</tt>,
+        <tt>every</tt>, <tt>some</tt>, and <tt>forEach</tt>.
+      </p>
+
+      <p>
+        <b class="header">0.1.1</b><br />
+        Added <tt>noConflict</tt>, so that the "Underscore" object can be assigned to
+        other variables.
+      </p>
+
+      <p>
+        <b class="header">0.1.0</b><br />
+        Initial release of Underscore.js.
+      </p>
+
+      <p>
+        <a href="http://documentcloud.org/" title="A DocumentCloud Project" style="background:none;">
+          <img src="http://jashkenas.s3.amazonaws.com/images/a_documentcloud_project.png" alt="A DocumentCloud Project" />
+        </a>
+      </p>
+
+    </div>
+
+  </div>
+
+  <!-- Include Underscore, so you can play with it in the console. -->
+  <script type="text/javascript" src="underscore.js"></script>
+
+</body>
+</html>
diff --git a/debian/node_modules/bones/node_modules/underscore/index.js b/debian/node_modules/bones/node_modules/underscore/index.js
new file mode 100644
index 0000000..2cf0ca5
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/underscore/index.js
@@ -0,0 +1 @@
+module.exports = require('./underscore');
diff --git a/debian/node_modules/bones/node_modules/underscore/package.json b/debian/node_modules/bones/node_modules/underscore/package.json
new file mode 100644
index 0000000..19959fe
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/underscore/package.json
@@ -0,0 +1,31 @@
+{
+  "name": "underscore",
+  "description": "JavaScript's functional programming helper library.",
+  "homepage": "http://documentcloud.github.com/underscore/",
+  "keywords": [
+    "util",
+    "functional",
+    "server",
+    "client",
+    "browser"
+  ],
+  "author": {
+    "name": "Jeremy Ashkenas",
+    "email": "jeremy at documentcloud.org"
+  },
+  "contributors": [],
+  "dependencies": {},
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/documentcloud/underscore.git"
+  },
+  "main": "underscore.js",
+  "version": "1.1.7",
+  "readme": "                   __                                                         \n                  /\\ \\                                                         __           \n __  __    ___    \\_\\ \\     __   _ __   ____    ___    ___   _ __    __       /\\_\\    ____  \n/\\ \\/\\ \\ /' _ `\\  /'_  \\  /'__`\\/\\  __\\/ ,__\\  / ___\\ / __`\\/\\  __\\/'__`\\     \\/\\ \\  /',__\\ \n\\ \\ \\_\\ \\/\\ \\/\\ \\/\\ \\ \\ \\/\\  __/\\ \\ \\//\\__, `\\/\\ \\__//\\ \\ \\ \\ \\ \ [...]
+  "readmeFilename": "README",
+  "bugs": {
+    "url": "https://github.com/documentcloud/underscore/issues"
+  },
+  "_id": "underscore at 1.1.7",
+  "_from": "underscore@~1.1.7"
+}
diff --git a/debian/node_modules/bones/node_modules/underscore/underscore-min.js b/debian/node_modules/bones/node_modules/underscore/underscore-min.js
new file mode 100644
index 0000000..5983694
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/underscore/underscore-min.js
@@ -0,0 +1,27 @@
+// Underscore.js 1.1.7
+// (c) 2011 Jeremy Ashkenas, DocumentCloud Inc.
+// Underscore is freely distributable under the MIT license.
+// Portions of Underscore are inspired or borrowed from Prototype,
+// Oliver Steele's Functional, and John Resig's Micro-Templating.
+// For all details and documentation:
+// http://documentcloud.github.com/underscore
+(function(){var p=this,C=p._,m={},i=Array.prototype,n=Object.prototype,f=i.slice,D=i.unshift,E=n.toString,l=n.hasOwnProperty,s=i.forEach,t=i.map,u=i.reduce,v=i.reduceRight,w=i.filter,x=i.every,y=i.some,o=i.indexOf,z=i.lastIndexOf;n=Array.isArray;var F=Object.keys,q=Function.prototype.bind,b=function(a){return new j(a)};typeof module!=="undefined"&&module.exports?(module.exports=b,b._=b):p._=b;b.VERSION="1.1.7";var h=b.each=b.forEach=function(a,c,b){if(a!=null)if(s&&a.forEach===s)a.forEac [...]
++a.length)for(var e=0,k=a.length;e<k;e++){if(e in a&&c.call(b,a[e],e,a)===m)break}else for(e in a)if(l.call(a,e)&&c.call(b,a[e],e,a)===m)break};b.map=function(a,c,b){var e=[];if(a==null)return e;if(t&&a.map===t)return a.map(c,b);h(a,function(a,g,G){e[e.length]=c.call(b,a,g,G)});return e};b.reduce=b.foldl=b.inject=function(a,c,d,e){var k=d!==void 0;a==null&&(a=[]);if(u&&a.reduce===u)return e&&(c=b.bind(c,e)),k?a.reduce(c,d):a.reduce(c);h(a,function(a,b,f){k?d=c.call(e,d,a,b,f):(d=a,k=!0)} [...]
+return d};b.reduceRight=b.foldr=function(a,c,d,e){a==null&&(a=[]);if(v&&a.reduceRight===v)return e&&(c=b.bind(c,e)),d!==void 0?a.reduceRight(c,d):a.reduceRight(c);a=(b.isArray(a)?a.slice():b.toArray(a)).reverse();return b.reduce(a,c,d,e)};b.find=b.detect=function(a,c,b){var e;A(a,function(a,g,f){if(c.call(b,a,g,f))return e=a,!0});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(w&&a.filter===w)return a.filter(c,b);h(a,function(a,g,f){c.call(b,a,g,f)&&(e[e.lengt [...]
+b.reject=function(a,c,b){var e=[];if(a==null)return e;h(a,function(a,g,f){c.call(b,a,g,f)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=!0;if(a==null)return e;if(x&&a.every===x)return a.every(c,b);h(a,function(a,g,f){if(!(e=e&&c.call(b,a,g,f)))return m});return e};var A=b.some=b.any=function(a,c,d){c=c||b.identity;var e=!1;if(a==null)return e;if(y&&a.some===y)return a.some(c,d);h(a,function(a,b,f){if(e|=c.call(d,a,b,f))return m});return!!e};b.include=b.contains=functio [...]
+!1;if(a==null)return b;if(o&&a.indexOf===o)return a.indexOf(c)!=-1;A(a,function(a){if(b=a===c)return!0});return b};b.invoke=function(a,c){var d=f.call(arguments,2);return b.map(a,function(a){return(c.call?c||a:a[c]).apply(a,d)})};b.pluck=function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);var e={computed:-Infinity};h(a,function(a,b,f){b=c?c.call(d,a,b,f):a;b>=e.computed&&(e={value:a,computed:b})});return e.value} [...]
+c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);var e={computed:Infinity};h(a,function(a,b,f){b=c?c.call(d,a,b,f):a;b<e.computed&&(e={value:a,computed:b})});return e.value};b.sortBy=function(a,c,d){return b.pluck(b.map(a,function(a,b,f){return{value:a,criteria:c.call(d,a,b,f)}}).sort(function(a,b){var c=a.criteria,d=b.criteria;return c<d?-1:c>d?1:0}),"value")};b.groupBy=function(a,b){var d={};h(a,function(a,f){var g=b(a,f);(d[g]||(d[g]=[])).push(a)});return d};b.sortedIndex=functi [...]
+(d=b.identity);for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?e=g+1:f=g}return e};b.toArray=function(a){if(!a)return[];if(a.toArray)return a.toArray();if(b.isArray(a))return f.call(a);if(b.isArguments(a))return f.call(a);return b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=b.head=function(a,b,d){return b!=null&&!d?f.call(a,0,b):a[0]};b.rest=b.tail=function(a,b,d){return f.call(a,b==null||d?1:b)};b.last=function(a){return a[a.length-1]};b.compact=function(a){ [...]
+function(a){return!!a})};b.flatten=function(a){return b.reduce(a,function(a,d){if(b.isArray(d))return a.concat(b.flatten(d));a[a.length]=d;return a},[])};b.without=function(a){return b.difference(a,f.call(arguments,1))};b.uniq=b.unique=function(a,c){return b.reduce(a,function(a,e,f){if(0==f||(c===!0?b.last(a)!=e:!b.include(a,e)))a[a.length]=e;return a},[])};b.union=function(){return b.uniq(b.flatten(arguments))};b.intersection=b.intersect=function(a){var c=f.call(arguments,1);return b.fi [...]
+function(a){return b.every(c,function(c){return b.indexOf(c,a)>=0})})};b.difference=function(a,c){return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=f.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e<c;e++)d[e]=b.pluck(a,""+e);return d};b.indexOf=function(a,c,d){if(a==null)return-1;var e;if(d)return d=b.sortedIndex(a,c),a[d]===c?d:-1;if(o&&a.indexOf===o)return a.indexOf(c);d=0;for(e=a.length;d<e;d++)if(a[d]===c)return d;return-1};b.lastIndexOf= [...]
+b){if(a==null)return-1;if(z&&a.lastIndexOf===z)return a.lastIndexOf(b);for(var d=a.length;d--;)if(a[d]===b)return d;return-1};b.range=function(a,b,d){arguments.length<=1&&(b=a||0,a=0);d=arguments[2]||1;for(var e=Math.max(Math.ceil((b-a)/d),0),f=0,g=Array(e);f<e;)g[f++]=a,a+=d;return g};b.bind=function(a,b){if(a.bind===q&&q)return q.apply(a,f.call(arguments,1));var d=f.call(arguments,2);return function(){return a.apply(b,d.concat(f.call(arguments)))}};b.bindAll=function(a){var c=f.call(ar [...]
+c.length==0&&(c=b.functions(a));h(c,function(c){a[c]=b.bind(a[c],a)});return a};b.memoize=function(a,c){var d={};c||(c=b.identity);return function(){var b=c.apply(this,arguments);return l.call(d,b)?d[b]:d[b]=a.apply(this,arguments)}};b.delay=function(a,b){var d=f.call(arguments,2);return setTimeout(function(){return a.apply(a,d)},b)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(f.call(arguments,1)))};var B=function(a,b,d){var e;return function(){var f=this,g=arguments,h=functi [...]
+a.apply(f,g)};d&&clearTimeout(e);if(d||!e)e=setTimeout(h,b)}};b.throttle=function(a,b){return B(a,b,!1)};b.debounce=function(a,b){return B(a,b,!0)};b.once=function(a){var b=!1,d;return function(){if(b)return d;b=!0;return d=a.apply(this,arguments)}};b.wrap=function(a,b){return function(){var d=[a].concat(f.call(arguments));return b.apply(this,d)}};b.compose=function(){var a=f.call(arguments);return function(){for(var b=f.call(arguments),d=a.length-1;d>=0;d--)b=[a[d].apply(this,b)];return [...]
+function(a,b){return function(){if(--a<1)return b.apply(this,arguments)}};b.keys=F||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var b=[],d;for(d in a)l.call(a,d)&&(b[b.length]=d);return b};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){h(f.call(arguments,1),function(b){for(var d in b)b[d]!==void 0&&(a[d]=b[d])});return a};b.defaults=function [...]
+1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,c){if(a===c)return!0;var d=typeof a;if(d!=typeof c)return!1;if(a==c)return!0;if(!a&&c||a&&!c)return!1;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual)return a.isEqual(c);if(c.isEqual)return c.isEqual(a);if(b.isDate(a)&&b.isDate(c))return a.getTime()===c.getTime();if(b.isNaN(a)&&b.isNaN(c) [...]
+if(b.isRegExp(a)&&b.isRegExp(c))return a.source===c.source&&a.global===c.global&&a.ignoreCase===c.ignoreCase&&a.multiline===c.multiline;if(d!=="object")return!1;if(a.length&&a.length!==c.length)return!1;d=b.keys(a);var e=b.keys(c);if(d.length!=e.length)return!1;for(var f in a)if(!(f in c)||!b.isEqual(a[f],c[f]))return!1;return!0};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(l.call(a,c))return!1;return!0};b.isElement=function(a){return!!(a&&a. [...]
+1)};b.isArray=n||function(a){return E.call(a)==="[object Array]"};b.isObject=function(a){return a===Object(a)};b.isArguments=function(a){return!(!a||!l.call(a,"callee"))};b.isFunction=function(a){return!(!a||!a.constructor||!a.call||!a.apply)};b.isString=function(a){return!!(a===""||a&&a.charCodeAt&&a.substr)};b.isNumber=function(a){return!!(a===0||a&&a.toExponential&&a.toFixed)};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===!0||a===!1};b.isDate=function(a){return! [...]
+!a.setUTCFullYear)};b.isRegExp=function(a){return!(!a||!a.test||!a.exec||!(a.ignoreCase||a.ignoreCase===!1))};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.noConflict=function(){p._=C;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e<a;e++)b.call(d,e)};b.mixin=function(a){h(b.functions(a),function(c){H(c,b[c]=a[c])})};var I=0;b.uniqueId=function(a){var b=I++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?) [...]
+b.template=function(a,c){var d=b.templateSettings;d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.interpolate,function(a,b){return"',"+b.replace(/\\'/g,"'")+",'"}).replace(d.evaluate||null,function(a,b){return"');"+b.replace(/\\'/g,"'").replace(/[\r\n\t]/g," ")+"__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');";d=new Function("obj",d);return [...]
+var j=function(a){this._wrapped=a};b.prototype=j.prototype;var r=function(a,c){return c?b(a).chain():a},H=function(a,c){j.prototype[a]=function(){var a=f.call(arguments);D.call(a,this._wrapped);return r(c.apply(b,a),this._chain)}};b.mixin(b);h(["pop","push","reverse","shift","sort","splice","unshift"],function(a){var b=i[a];j.prototype[a]=function(){b.apply(this._wrapped,arguments);return r(this._wrapped,this._chain)}});h(["concat","join","slice"],function(a){var b=i[a];j.prototype[a]=fu [...]
+arguments),this._chain)}});j.prototype.chain=function(){this._chain=!0;return this};j.prototype.value=function(){return this._wrapped}})();
diff --git a/debian/node_modules/bones/node_modules/underscore/underscore.js b/debian/node_modules/bones/node_modules/underscore/underscore.js
new file mode 100644
index 0000000..4f56013
--- /dev/null
+++ b/debian/node_modules/bones/node_modules/underscore/underscore.js
@@ -0,0 +1,839 @@
+//     Underscore.js 1.1.7
+//     (c) 2011 Jeremy Ashkenas, DocumentCloud Inc.
+//     Underscore is freely distributable under the MIT license.
+//     Portions of Underscore are inspired or borrowed from Prototype,
+//     Oliver Steele's Functional, and John Resig's Micro-Templating.
+//     For all details and documentation:
+//     http://documentcloud.github.com/underscore
+
+(function() {
+
+  // Baseline setup
+  // --------------
+
+  // Establish the root object, `window` in the browser, or `global` on the server.
+  var root = this;
+
+  // Save the previous value of the `_` variable.
+  var previousUnderscore = root._;
+
+  // Establish the object that gets returned to break out of a loop iteration.
+  var breaker = {};
+
+  // Save bytes in the minified (but not gzipped) version:
+  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
+
+  // Create quick reference variables for speed access to core prototypes.
+  var slice            = ArrayProto.slice,
+      unshift          = ArrayProto.unshift,
+      toString         = ObjProto.toString,
+      hasOwnProperty   = ObjProto.hasOwnProperty;
+
+  // All **ECMAScript 5** native function implementations that we hope to use
+  // are declared here.
+  var
+    nativeForEach      = ArrayProto.forEach,
+    nativeMap          = ArrayProto.map,
+    nativeReduce       = ArrayProto.reduce,
+    nativeReduceRight  = ArrayProto.reduceRight,
+    nativeFilter       = ArrayProto.filter,
+    nativeEvery        = ArrayProto.every,
+    nativeSome         = ArrayProto.some,
+    nativeIndexOf      = ArrayProto.indexOf,
+    nativeLastIndexOf  = ArrayProto.lastIndexOf,
+    nativeIsArray      = Array.isArray,
+    nativeKeys         = Object.keys,
+    nativeBind         = FuncProto.bind;
+
+  // Create a safe reference to the Underscore object for use below.
+  var _ = function(obj) { return new wrapper(obj); };
+
+  // Export the Underscore object for **CommonJS**, with backwards-compatibility
+  // for the old `require()` API. If we're not in CommonJS, add `_` to the
+  // global object.
+  if (typeof module !== 'undefined' && module.exports) {
+    module.exports = _;
+    _._ = _;
+  } else {
+    // Exported as a string, for Closure Compiler "advanced" mode.
+    root['_'] = _;
+  }
+
+  // Current version.
+  _.VERSION = '1.1.7';
+
+  // Collection Functions
+  // --------------------
+
+  // The cornerstone, an `each` implementation, aka `forEach`.
+  // Handles objects with the built-in `forEach`, arrays, and raw objects.
+  // Delegates to **ECMAScript 5**'s native `forEach` if available.
+  var each = _.each = _.forEach = function(obj, iterator, context) {
+    if (obj == null) return;
+    if (nativeForEach && obj.forEach === nativeForEach) {
+      obj.forEach(iterator, context);
+    } else if (obj.length === +obj.length) {
+      for (var i = 0, l = obj.length; i < l; i++) {
+        if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return;
+      }
+    } else {
+      for (var key in obj) {
+        if (hasOwnProperty.call(obj, key)) {
+          if (iterator.call(context, obj[key], key, obj) === breaker) return;
+        }
+      }
+    }
+  };
+
+  // Return the results of applying the iterator to each element.
+  // Delegates to **ECMAScript 5**'s native `map` if available.
+  _.map = function(obj, iterator, context) {
+    var results = [];
+    if (obj == null) return results;
+    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
+    each(obj, function(value, index, list) {
+      results[results.length] = iterator.call(context, value, index, list);
+    });
+    return results;
+  };
+
+  // **Reduce** builds up a single result from a list of values, aka `inject`,
+  // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
+  _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
+    var initial = memo !== void 0;
+    if (obj == null) obj = [];
+    if (nativeReduce && obj.reduce === nativeReduce) {
+      if (context) iterator = _.bind(iterator, context);
+      return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
+    }
+    each(obj, function(value, index, list) {
+      if (!initial) {
+        memo = value;
+        initial = true;
+      } else {
+        memo = iterator.call(context, memo, value, index, list);
+      }
+    });
+    if (!initial) throw new TypeError("Reduce of empty array with no initial value");
+    return memo;
+  };
+
+  // The right-associative version of reduce, also known as `foldr`.
+  // Delegates to **ECMAScript 5**'s native `reduceRight` if available.
+  _.reduceRight = _.foldr = function(obj, iterator, memo, context) {
+    if (obj == null) obj = [];
+    if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
+      if (context) iterator = _.bind(iterator, context);
+      return memo !== void 0 ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
+    }
+    var reversed = (_.isArray(obj) ? obj.slice() : _.toArray(obj)).reverse();
+    return _.reduce(reversed, iterator, memo, context);
+  };
+
+  // Return the first value which passes a truth test. Aliased as `detect`.
+  _.find = _.detect = function(obj, iterator, context) {
+    var result;
+    any(obj, function(value, index, list) {
+      if (iterator.call(context, value, index, list)) {
+        result = value;
+        return true;
+      }
+    });
+    return result;
+  };
+
+  // Return all the elements that pass a truth test.
+  // Delegates to **ECMAScript 5**'s native `filter` if available.
+  // Aliased as `select`.
+  _.filter = _.select = function(obj, iterator, context) {
+    var results = [];
+    if (obj == null) return results;
+    if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);
+    each(obj, function(value, index, list) {
+      if (iterator.call(context, value, index, list)) results[results.length] = value;
+    });
+    return results;
+  };
+
+  // Return all the elements for which a truth test fails.
+  _.reject = function(obj, iterator, context) {
+    var results = [];
+    if (obj == null) return results;
+    each(obj, function(value, index, list) {
+      if (!iterator.call(context, value, index, list)) results[results.length] = value;
+    });
+    return results;
+  };
+
+  // Determine whether all of the elements match a truth test.
+  // Delegates to **ECMAScript 5**'s native `every` if available.
+  // Aliased as `all`.
+  _.every = _.all = function(obj, iterator, context) {
+    var result = true;
+    if (obj == null) return result;
+    if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);
+    each(obj, function(value, index, list) {
+      if (!(result = result && iterator.call(context, value, index, list))) return breaker;
+    });
+    return result;
+  };
+
+  // Determine if at least one element in the object matches a truth test.
+  // Delegates to **ECMAScript 5**'s native `some` if available.
+  // Aliased as `any`.
+  var any = _.some = _.any = function(obj, iterator, context) {
+    iterator = iterator || _.identity;
+    var result = false;
+    if (obj == null) return result;
+    if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
+    each(obj, function(value, index, list) {
+      if (result |= iterator.call(context, value, index, list)) return breaker;
+    });
+    return !!result;
+  };
+
+  // Determine if a given value is included in the array or object using `===`.
+  // Aliased as `contains`.
+  _.include = _.contains = function(obj, target) {
+    var found = false;
+    if (obj == null) return found;
+    if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
+    any(obj, function(value) {
+      if (found = value === target) return true;
+    });
+    return found;
+  };
+
+  // Invoke a method (with arguments) on every item in a collection.
+  _.invoke = function(obj, method) {
+    var args = slice.call(arguments, 2);
+    return _.map(obj, function(value) {
+      return (method.call ? method || value : value[method]).apply(value, args);
+    });
+  };
+
+  // Convenience version of a common use case of `map`: fetching a property.
+  _.pluck = function(obj, key) {
+    return _.map(obj, function(value){ return value[key]; });
+  };
+
+  // Return the maximum element or (element-based computation).
+  _.max = function(obj, iterator, context) {
+    if (!iterator && _.isArray(obj)) return Math.max.apply(Math, obj);
+    var result = {computed : -Infinity};
+    each(obj, function(value, index, list) {
+      var computed = iterator ? iterator.call(context, value, index, list) : value;
+      computed >= result.computed && (result = {value : value, computed : computed});
+    });
+    return result.value;
+  };
+
+  // Return the minimum element (or element-based computation).
+  _.min = function(obj, iterator, context) {
+    if (!iterator && _.isArray(obj)) return Math.min.apply(Math, obj);
+    var result = {computed : Infinity};
+    each(obj, function(value, index, list) {
+      var computed = iterator ? iterator.call(context, value, index, list) : value;
+      computed < result.computed && (result = {value : value, computed : computed});
+    });
+    return result.value;
+  };
+
+  // Sort the object's values by a criterion produced by an iterator.
+  _.sortBy = function(obj, iterator, context) {
+    return _.pluck(_.map(obj, function(value, index, list) {
+      return {
+        value : value,
+        criteria : iterator.call(context, value, index, list)
+      };
+    }).sort(function(left, right) {
+      var a = left.criteria, b = right.criteria;
+      return a < b ? -1 : a > b ? 1 : 0;
+    }), 'value');
+  };
+
+  // Groups the object's values by a criterion produced by an iterator
+  _.groupBy = function(obj, iterator) {
+    var result = {};
+    each(obj, function(value, index) {
+      var key = iterator(value, index);
+      (result[key] || (result[key] = [])).push(value);
+    });
+    return result;
+  };
+
+  // Use a comparator function to figure out at what index an object should
+  // be inserted so as to maintain order. Uses binary search.
+  _.sortedIndex = function(array, obj, iterator) {
+    iterator || (iterator = _.identity);
+    var low = 0, high = array.length;
+    while (low < high) {
+      var mid = (low + high) >> 1;
+      iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid;
+    }
+    return low;
+  };
+
+  // Safely convert anything iterable into a real, live array.
+  _.toArray = function(iterable) {
+    if (!iterable)                return [];
+    if (iterable.toArray)         return iterable.toArray();
+    if (_.isArray(iterable))      return slice.call(iterable);
+    if (_.isArguments(iterable))  return slice.call(iterable);
+    return _.values(iterable);
+  };
+
+  // Return the number of elements in an object.
+  _.size = function(obj) {
+    return _.toArray(obj).length;
+  };
+
+  // Array Functions
+  // ---------------
+
+  // Get the first element of an array. Passing **n** will return the first N
+  // values in the array. Aliased as `head`. The **guard** check allows it to work
+  // with `_.map`.
+  _.first = _.head = function(array, n, guard) {
+    return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
+  };
+
+  // Returns everything but the first entry of the array. Aliased as `tail`.
+  // Especially useful on the arguments object. Passing an **index** will return
+  // the rest of the values in the array from that index onward. The **guard**
+  // check allows it to work with `_.map`.
+  _.rest = _.tail = function(array, index, guard) {
+    return slice.call(array, (index == null) || guard ? 1 : index);
+  };
+
+  // Get the last element of an array.
+  _.last = function(array) {
+    return array[array.length - 1];
+  };
+
+  // Trim out all falsy values from an array.
+  _.compact = function(array) {
+    return _.filter(array, function(value){ return !!value; });
+  };
+
+  // Return a completely flattened version of an array.
+  _.flatten = function(array) {
+    return _.reduce(array, function(memo, value) {
+      if (_.isArray(value)) return memo.concat(_.flatten(value));
+      memo[memo.length] = value;
+      return memo;
+    }, []);
+  };
+
+  // Return a version of the array that does not contain the specified value(s).
+  _.without = function(array) {
+    return _.difference(array, slice.call(arguments, 1));
+  };
+
+  // Produce a duplicate-free version of the array. If the array has already
+  // been sorted, you have the option of using a faster algorithm.
+  // Aliased as `unique`.
+  _.uniq = _.unique = function(array, isSorted) {
+    return _.reduce(array, function(memo, el, i) {
+      if (0 == i || (isSorted === true ? _.last(memo) != el : !_.include(memo, el))) memo[memo.length] = el;
+      return memo;
+    }, []);
+  };
+
+  // Produce an array that contains the union: each distinct element from all of
+  // the passed-in arrays.
+  _.union = function() {
+    return _.uniq(_.flatten(arguments));
+  };
+
+  // Produce an array that contains every item shared between all the
+  // passed-in arrays. (Aliased as "intersect" for back-compat.)
+  _.intersection = _.intersect = function(array) {
+    var rest = slice.call(arguments, 1);
+    return _.filter(_.uniq(array), function(item) {
+      return _.every(rest, function(other) {
+        return _.indexOf(other, item) >= 0;
+      });
+    });
+  };
+
+  // Take the difference between one array and another.
+  // Only the elements present in just the first array will remain.
+  _.difference = function(array, other) {
+    return _.filter(array, function(value){ return !_.include(other, value); });
+  };
+
+  // Zip together multiple lists into a single array -- elements that share
+  // an index go together.
+  _.zip = function() {
+    var args = slice.call(arguments);
+    var length = _.max(_.pluck(args, 'length'));
+    var results = new Array(length);
+    for (var i = 0; i < length; i++) results[i] = _.pluck(args, "" + i);
+    return results;
+  };
+
+  // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
+  // we need this function. Return the position of the first occurrence of an
+  // item in an array, or -1 if the item is not included in the array.
+  // Delegates to **ECMAScript 5**'s native `indexOf` if available.
+  // If the array is large and already in sort order, pass `true`
+  // for **isSorted** to use binary search.
+  _.indexOf = function(array, item, isSorted) {
+    if (array == null) return -1;
+    var i, l;
+    if (isSorted) {
+      i = _.sortedIndex(array, item);
+      return array[i] === item ? i : -1;
+    }
+    if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);
+    for (i = 0, l = array.length; i < l; i++) if (array[i] === item) return i;
+    return -1;
+  };
+
+
+  // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
+  _.lastIndexOf = function(array, item) {
+    if (array == null) return -1;
+    if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item);
+    var i = array.length;
+    while (i--) if (array[i] === item) return i;
+    return -1;
+  };
+
+  // Generate an integer Array containing an arithmetic progression. A port of
+  // the native Python `range()` function. See
+  // [the Python documentation](http://docs.python.org/library/functions.html#range).
+  _.range = function(start, stop, step) {
+    if (arguments.length <= 1) {
+      stop = start || 0;
+      start = 0;
+    }
+    step = arguments[2] || 1;
+
+    var len = Math.max(Math.ceil((stop - start) / step), 0);
+    var idx = 0;
+    var range = new Array(len);
+
+    while(idx < len) {
+      range[idx++] = start;
+      start += step;
+    }
+
+    return range;
+  };
+
+  // Function (ahem) Functions
+  // ------------------
+
+  // Create a function bound to a given object (assigning `this`, and arguments,
+  // optionally). Binding with arguments is also known as `curry`.
+  // Delegates to **ECMAScript 5**'s native `Function.bind` if available.
+  // We check for `func.bind` first, to fail fast when `func` is undefined.
+  _.bind = function(func, obj) {
+    if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
+    var args = slice.call(arguments, 2);
+    return function() {
+      return func.apply(obj, args.concat(slice.call(arguments)));
+    };
+  };
+
+  // Bind all of an object's methods to that object. Useful for ensuring that
+  // all callbacks defined on an object belong to it.
+  _.bindAll = function(obj) {
+    var funcs = slice.call(arguments, 1);
+    if (funcs.length == 0) funcs = _.functions(obj);
+    each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
+    return obj;
+  };
+
+  // Memoize an expensive function by storing its results.
+  _.memoize = function(func, hasher) {
+    var memo = {};
+    hasher || (hasher = _.identity);
+    return function() {
+      var key = hasher.apply(this, arguments);
+      return hasOwnProperty.call(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
+    };
+  };
+
+  // Delays a function for the given number of milliseconds, and then calls
+  // it with the arguments supplied.
+  _.delay = function(func, wait) {
+    var args = slice.call(arguments, 2);
+    return setTimeout(function(){ return func.apply(func, args); }, wait);
+  };
+
+  // Defers a function, scheduling it to run after the current call stack has
+  // cleared.
+  _.defer = function(func) {
+    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
+  };
+
+  // Internal function used to implement `_.throttle` and `_.debounce`.
+  var limit = function(func, wait, debounce) {
+    var timeout;
+    return function() {
+      var context = this, args = arguments;
+      var throttler = function() {
+        timeout = null;
+        func.apply(context, args);
+      };
+      if (debounce) clearTimeout(timeout);
+      if (debounce || !timeout) timeout = setTimeout(throttler, wait);
+    };
+  };
+
+  // Returns a function, that, when invoked, will only be triggered at most once
+  // during a given window of time.
+  _.throttle = function(func, wait) {
+    return limit(func, wait, false);
+  };
+
+  // Returns a function, that, as long as it continues to be invoked, will not
+  // be triggered. The function will be called after it stops being called for
+  // N milliseconds.
+  _.debounce = function(func, wait) {
+    return limit(func, wait, true);
+  };
+
+  // Returns a function that will be executed at most one time, no matter how
+  // often you call it. Useful for lazy initialization.
+  _.once = function(func) {
+    var ran = false, memo;
+    return function() {
+      if (ran) return memo;
+      ran = true;
+      return memo = func.apply(this, arguments);
+    };
+  };
+
+  // Returns the first function passed as an argument to the second,
+  // allowing you to adjust arguments, run code before and after, and
+  // conditionally execute the original function.
+  _.wrap = function(func, wrapper) {
+    return function() {
+      var args = [func].concat(slice.call(arguments));
+      return wrapper.apply(this, args);
+    };
+  };
+
+  // Returns a function that is the composition of a list of functions, each
+  // consuming the return value of the function that follows.
+  _.compose = function() {
+    var funcs = slice.call(arguments);
+    return function() {
+      var args = slice.call(arguments);
+      for (var i = funcs.length - 1; i >= 0; i--) {
+        args = [funcs[i].apply(this, args)];
+      }
+      return args[0];
+    };
+  };
+
+  // Returns a function that will only be executed after being called N times.
+  _.after = function(times, func) {
+    return function() {
+      if (--times < 1) { return func.apply(this, arguments); }
+    };
+  };
+
+
+  // Object Functions
+  // ----------------
+
+  // Retrieve the names of an object's properties.
+  // Delegates to **ECMAScript 5**'s native `Object.keys`
+  _.keys = nativeKeys || function(obj) {
+    if (obj !== Object(obj)) throw new TypeError('Invalid object');
+    var keys = [];
+    for (var key in obj) if (hasOwnProperty.call(obj, key)) keys[keys.length] = key;
+    return keys;
+  };
+
+  // Retrieve the values of an object's properties.
+  _.values = function(obj) {
+    return _.map(obj, _.identity);
+  };
+
+  // Return a sorted list of the function names available on the object.
+  // Aliased as `methods`
+  _.functions = _.methods = function(obj) {
+    var names = [];
+    for (var key in obj) {
+      if (_.isFunction(obj[key])) names.push(key);
+    }
+    return names.sort();
+  };
+
+  // Extend a given object with all the properties in passed-in object(s).
+  _.extend = function(obj) {
+    each(slice.call(arguments, 1), function(source) {
+      for (var prop in source) {
+        if (source[prop] !== void 0) obj[prop] = source[prop];
+      }
+    });
+    return obj;
+  };
+
+  // Fill in a given object with default properties.
+  _.defaults = function(obj) {
+    each(slice.call(arguments, 1), function(source) {
+      for (var prop in source) {
+        if (obj[prop] == null) obj[prop] = source[prop];
+      }
+    });
+    return obj;
+  };
+
+  // Create a (shallow-cloned) duplicate of an object.
+  _.clone = function(obj) {
+    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
+  };
+
+  // Invokes interceptor with the obj, and then returns obj.
+  // The primary purpose of this method is to "tap into" a method chain, in
+  // order to perform operations on intermediate results within the chain.
+  _.tap = function(obj, interceptor) {
+    interceptor(obj);
+    return obj;
+  };
+
+  // Perform a deep comparison to check if two objects are equal.
+  _.isEqual = function(a, b) {
+    // Check object identity.
+    if (a === b) return true;
+    // Different types?
+    var atype = typeof(a), btype = typeof(b);
+    if (atype != btype) return false;
+    // Basic equality test (watch out for coercions).
+    if (a == b) return true;
+    // One is falsy and the other truthy.
+    if ((!a && b) || (a && !b)) return false;
+    // Unwrap any wrapped objects.
+    if (a._chain) a = a._wrapped;
+    if (b._chain) b = b._wrapped;
+    // One of them implements an isEqual()?
+    if (a.isEqual) return a.isEqual(b);
+    if (b.isEqual) return b.isEqual(a);
+    // Check dates' integer values.
+    if (_.isDate(a) && _.isDate(b)) return a.getTime() === b.getTime();
+    // Both are NaN?
+    if (_.isNaN(a) && _.isNaN(b)) return false;
+    // Compare regular expressions.
+    if (_.isRegExp(a) && _.isRegExp(b))
+      return a.source     === b.source &&
+             a.global     === b.global &&
+             a.ignoreCase === b.ignoreCase &&
+             a.multiline  === b.multiline;
+    // If a is not an object by this point, we can't handle it.
+    if (atype !== 'object') return false;
+    // Check for different array lengths before comparing contents.
+    if (a.length && (a.length !== b.length)) return false;
+    // Nothing else worked, deep compare the contents.
+    var aKeys = _.keys(a), bKeys = _.keys(b);
+    // Different object sizes?
+    if (aKeys.length != bKeys.length) return false;
+    // Recursive comparison of contents.
+    for (var key in a) if (!(key in b) || !_.isEqual(a[key], b[key])) return false;
+    return true;
+  };
+
+  // Is a given array or object empty?
+  _.isEmpty = function(obj) {
+    if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
+    for (var key in obj) if (hasOwnProperty.call(obj, key)) return false;
+    return true;
+  };
+
+  // Is a given value a DOM element?
+  _.isElement = function(obj) {
+    return !!(obj && obj.nodeType == 1);
+  };
+
+  // Is a given value an array?
+  // Delegates to ECMA5's native Array.isArray
+  _.isArray = nativeIsArray || function(obj) {
+    return toString.call(obj) === '[object Array]';
+  };
+
+  // Is a given variable an object?
+  _.isObject = function(obj) {
+    return obj === Object(obj);
+  };
+
+  // Is a given variable an arguments object?
+  _.isArguments = function(obj) {
+    return !!(obj && hasOwnProperty.call(obj, 'callee'));
+  };
+
+  // Is a given value a function?
+  _.isFunction = function(obj) {
+    return !!(obj && obj.constructor && obj.call && obj.apply);
+  };
+
+  // Is a given value a string?
+  _.isString = function(obj) {
+    return !!(obj === '' || (obj && obj.charCodeAt && obj.substr));
+  };
+
+  // Is a given value a number?
+  _.isNumber = function(obj) {
+    return !!(obj === 0 || (obj && obj.toExponential && obj.toFixed));
+  };
+
+  // Is the given value `NaN`? `NaN` happens to be the only value in JavaScript
+  // that does not equal itself.
+  _.isNaN = function(obj) {
+    return obj !== obj;
+  };
+
+  // Is a given value a boolean?
+  _.isBoolean = function(obj) {
+    return obj === true || obj === false;
+  };
+
+  // Is a given value a date?
+  _.isDate = function(obj) {
+    return !!(obj && obj.getTimezoneOffset && obj.setUTCFullYear);
+  };
+
+  // Is the given value a regular expression?
+  _.isRegExp = function(obj) {
+    return !!(obj && obj.test && obj.exec && (obj.ignoreCase || obj.ignoreCase === false));
+  };
+
+  // Is a given value equal to null?
+  _.isNull = function(obj) {
+    return obj === null;
+  };
+
+  // Is a given variable undefined?
+  _.isUndefined = function(obj) {
+    return obj === void 0;
+  };
+
+  // Utility Functions
+  // -----------------
+
+  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
+  // previous owner. Returns a reference to the Underscore object.
+  _.noConflict = function() {
+    root._ = previousUnderscore;
+    return this;
+  };
+
+  // Keep the identity function around for default iterators.
+  _.identity = function(value) {
+    return value;
+  };
+
+  // Run a function **n** times.
+  _.times = function (n, iterator, context) {
+    for (var i = 0; i < n; i++) iterator.call(context, i);
+  };
+
+  // Add your own custom functions to the Underscore object, ensuring that
+  // they're correctly added to the OOP wrapper as well.
+  _.mixin = function(obj) {
+    each(_.functions(obj), function(name){
+      addToWrapper(name, _[name] = obj[name]);
+    });
+  };
+
+  // Generate a unique integer id (unique within the entire client session).
+  // Useful for temporary DOM ids.
+  var idCounter = 0;
+  _.uniqueId = function(prefix) {
+    var id = idCounter++;
+    return prefix ? prefix + id : id;
+  };
+
+  // By default, Underscore uses ERB-style template delimiters, change the
+  // following template settings to use alternative delimiters.
+  _.templateSettings = {
+    evaluate    : /<%([\s\S]+?)%>/g,
+    interpolate : /<%=([\s\S]+?)%>/g
+  };
+
+  // JavaScript micro-templating, similar to John Resig's implementation.
+  // Underscore templating handles arbitrary delimiters, preserves whitespace,
+  // and correctly escapes quotes within interpolated code.
+  _.template = function(str, data) {
+    var c  = _.templateSettings;
+    var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' +
+      'with(obj||{}){__p.push(\'' +
+      str.replace(/\\/g, '\\\\')
+         .replace(/'/g, "\\'")
+         .replace(c.interpolate, function(match, code) {
+           return "'," + code.replace(/\\'/g, "'") + ",'";
+         })
+         .replace(c.evaluate || null, function(match, code) {
+           return "');" + code.replace(/\\'/g, "'")
+                              .replace(/[\r\n\t]/g, ' ') + "__p.push('";
+         })
+         .replace(/\r/g, '\\r')
+         .replace(/\n/g, '\\n')
+         .replace(/\t/g, '\\t')
+         + "');}return __p.join('');";
+    var func = new Function('obj', tmpl);
+    return data ? func(data) : func;
+  };
+
+  // The OOP Wrapper
+  // ---------------
+
+  // If Underscore is called as a function, it returns a wrapped object that
+  // can be used OO-style. This wrapper holds altered versions of all the
+  // underscore functions. Wrapped objects may be chained.
+  var wrapper = function(obj) { this._wrapped = obj; };
+
+  // Expose `wrapper.prototype` as `_.prototype`
+  _.prototype = wrapper.prototype;
+
+  // Helper function to continue chaining intermediate results.
+  var result = function(obj, chain) {
+    return chain ? _(obj).chain() : obj;
+  };
+
+  // A method to easily add functions to the OOP wrapper.
+  var addToWrapper = function(name, func) {
+    wrapper.prototype[name] = function() {
+      var args = slice.call(arguments);
+      unshift.call(args, this._wrapped);
+      return result(func.apply(_, args), this._chain);
+    };
+  };
+
+  // Add all of the Underscore functions to the wrapper object.
+  _.mixin(_);
+
+  // Add all mutator Array functions to the wrapper.
+  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
+    var method = ArrayProto[name];
+    wrapper.prototype[name] = function() {
+      method.apply(this._wrapped, arguments);
+      return result(this._wrapped, this._chain);
+    };
+  });
+
+  // Add all accessor Array functions to the wrapper.
+  each(['concat', 'join', 'slice'], function(name) {
+    var method = ArrayProto[name];
+    wrapper.prototype[name] = function() {
+      return result(method.apply(this._wrapped, arguments), this._chain);
+    };
+  });
+
+  // Start chaining a wrapped Underscore object.
+  wrapper.prototype.chain = function() {
+    this._chain = true;
+    return this;
+  };
+
+  // Extracts the result from a wrapped and chained object.
+  wrapper.prototype.value = function() {
+    return this._wrapped;
+  };
+
+})();
diff --git a/debian/node_modules/bones/package.json b/debian/node_modules/bones/package.json
new file mode 100644
index 0000000..06b0da3
--- /dev/null
+++ b/debian/node_modules/bones/package.json
@@ -0,0 +1,30 @@
+{
+  "name": "bones",
+  "description": "Framework for using backbone.js on the client and server.",
+  "version": "1.3.28",
+  "author": {
+    "name": "Development Seed",
+    "email": "info at developmentseed.org",
+    "url": "http://developmentseed.org/"
+  },
+  "main": "./bones.js",
+  "dependencies": {
+    "underscore": "~1.1.7",
+    "express": "~2.5.11",
+    "backbone": "0.3.3",
+    "jquery": "~1.6.3",
+    "optimist": "~0.4.0",
+    "mirror": "~0.3.3"
+  },
+  "scripts": {
+    "test": "expresso -I ..",
+    "coverage": "./test/coverage.sh"
+  },
+  "engines": {
+    "node": "0.4 || 0.6 || 0.8 || 0.10"
+  },
+  "readme": "# Bones\n\nBones provides conventions for [Backbone](http://documentcloud.github.com/backbone/) applications. It allows most code to be shared on the server and the client. Bones exposes your Backbone controller routes as regular paths on the server so they can be accessed by non-JavaScript agents, while capable clients can enjoy the normal client-side Backbone experience.\n\n## Getting started\n\nThe [wiki](https://github.com/developmentseed/bones/wiki) contains more inform [...]
+  "readmeFilename": "README.md",
+  "_id": "bones at 1.3.28",
+  "_from": "bones@~1.3.28"
+}
diff --git a/debian/node_modules/bones/server/backbone.js b/debian/node_modules/bones/server/backbone.js
new file mode 100644
index 0000000..cff832e
--- /dev/null
+++ b/debian/node_modules/bones/server/backbone.js
@@ -0,0 +1,5 @@
+var Backbone = module.exports = require('../shared/backbone');
+
+Backbone.sync = function() {
+    throw new Error('No default sync method');
+};
diff --git a/debian/node_modules/bones/server/collection.js b/debian/node_modules/bones/server/collection.js
new file mode 100644
index 0000000..f023ca6
--- /dev/null
+++ b/debian/node_modules/bones/server/collection.js
@@ -0,0 +1,23 @@
+var Backbone = require('./backbone');
+var _ = require('underscore');
+
+module.exports = Backbone.Collection;
+
+Backbone.Collection.toString = function() {
+    return '<Collection ' + this.title + '>';
+};
+
+Backbone.Collection.register = function(app) {
+    // Add the controller if it's not a server-only controller.
+    this.files.forEach(function(filename) {
+        if (!(/\.server\.bones$/).test(filename) && app.assets) {
+            app.assets.models.push(filename);
+        }
+    });
+
+    app.models[this.title] = this;
+};
+
+Backbone.Collection.prototype.toString = function() {
+    return '[Collection ' + this.constructor.title + ']';
+};
diff --git a/debian/node_modules/bones/server/command.js b/debian/node_modules/bones/server/command.js
new file mode 100644
index 0000000..fdd8d40
--- /dev/null
+++ b/debian/node_modules/bones/server/command.js
@@ -0,0 +1,40 @@
+var Backbone = require('./backbone');
+var _ = require('underscore');
+
+module.exports = Command;
+
+function Command(plugin, callback) {
+    this.bootstrap(plugin, function() {
+        this.initialize(plugin, callback);
+    }.bind(this));
+};
+
+Command.prototype.bootstrap = function(plugin, callback) {
+    callback();
+};
+
+Command.prototype.initialize = function(plugin, callback) {};
+
+Command.prototype.toString = function() {
+    return '[Command ' + this.constructor.title + ']';
+};
+
+Command.augment = Backbone.Controller.augment;
+Command.extend = Backbone.Controller.extend;
+
+Command.extend = _.wrap(Command.extend, function(parent, props, staticProps) {
+    var result = parent.call(this, props, staticProps);
+    result.options = Object.create(this.options);
+    return result;
+});
+
+Command.toString = function() {
+    return '<Command ' + this.title + '>';
+};
+
+Command.options = {
+    'host': {
+        'description': 'Hostnames allowed for requests. Wildcards are allowed.',
+        'default': [ '127.0.0.1', 'localhost', require('os').hostname() ]
+    }
+};
diff --git a/debian/node_modules/bones/server/command.prefix.js b/debian/node_modules/bones/server/command.prefix.js
new file mode 100644
index 0000000..d2e5fc8
--- /dev/null
+++ b/debian/node_modules/bones/server/command.prefix.js
@@ -0,0 +1,14 @@
+var Bones = require(global.__BonesPath__ || 'bones');
+
+var $ = Bones.$, jQuery = $;
+var _ = Bones._;
+var Backbone = Bones.Backbone;
+
+var models = Bones.plugin.models;
+var views = Bones.plugin.views;
+var controllers = Bones.plugin.controllers;
+var templates = Bones.plugin.templates;
+var servers = Bones.plugin.servers;
+var commands = Bones.plugin.commands;
+
+var command;
diff --git a/debian/node_modules/bones/server/command.suffix.js b/debian/node_modules/bones/server/command.suffix.js
new file mode 100644
index 0000000..8af5c01
--- /dev/null
+++ b/debian/node_modules/bones/server/command.suffix.js
@@ -0,0 +1,5 @@
+if (command && !command.title) {
+    command.title = require('path').basename(__filename).replace(/\..+$/, '');
+}
+
+module.exports = command;
diff --git a/debian/node_modules/bones/server/controller.js b/debian/node_modules/bones/server/controller.js
new file mode 100644
index 0000000..c7f769d
--- /dev/null
+++ b/debian/node_modules/bones/server/controller.js
@@ -0,0 +1,62 @@
+var Backbone = require('./backbone');
+var _ = require('underscore');
+
+module.exports = Backbone.Controller;
+
+Backbone.Controller.register = function(server) {
+    // Add the controller if it's not a server-only controller.
+    this.files.forEach(function(filename) {
+        if (!(/\.server\.bones$/).test(filename) && server.assets &&
+            server.assets.controllers.indexOf(filename) < 0) {
+            server.assets.controllers.push(filename);
+        }
+    });
+
+    // TODO push the order of the controllers to the client
+
+    return server.controllers[this.title] = new this({ server: server });
+};
+
+Backbone.Controller.toString = function() {
+    return '<Controller ' + this.title + '>';
+};
+
+Backbone.Controller.prototype.initialize = function(options) {
+    if (!options.server) {
+        throw new Error("Can't initialize controller without server.");
+    }
+    this.server = options.server;
+
+    // Bind routes.
+    if (this.routes) {
+        var controller = this, routes = this.routes;
+        // Add the last routes first.
+        _(this.routes).keys().reverse().forEach(function(route) {
+            var name = routes[route];
+            controller.route(route, name, controller[name]);
+        });
+    }
+};
+
+Backbone.Controller.prototype.toString = function() {
+    return '[Controller ' + this.constructor.title + ']';
+};
+
+Backbone.Controller.prototype._bindRoutes = function() {
+    // Noop. Routes are bound in initialize();
+};
+
+Backbone.Controller.prototype.route = function(route, name, callback) {
+    if (!_.isRegExp(route)) route = this._routeToRegExp(route);
+    if (!_.isFunction(callback)) throw new Error("'" + name + "' is not a function in " + this);
+
+    // Add route to express server.
+    var controller = this;
+    this.server.get(route, function(req, res, next) {
+        var fragment = (req.query && req.query['_escaped_fragment_']) || req.url.replace(/[#?].*$/, '');
+        var args = controller._extractParameters(route, fragment);
+        var context = Object.create(controller, { req: { value: req }, res: { value: res } });
+        callback.apply(context, args);
+        controller.trigger.apply(controller, ['route:' + name].concat(args));
+    });
+};
diff --git a/debian/node_modules/bones/server/controller.prefix.js b/debian/node_modules/bones/server/controller.prefix.js
new file mode 100644
index 0000000..13b8393
--- /dev/null
+++ b/debian/node_modules/bones/server/controller.prefix.js
@@ -0,0 +1,11 @@
+var Bones = require(global.__BonesPath__ || 'bones');
+
+var $ = Bones.$, jQuery = $;
+var _ = Bones._;
+var Backbone = Bones.Backbone;
+
+var models = Bones.plugin.models;
+var views = Bones.plugin.views;
+var controllers = Bones.plugin.controllers;
+
+var controller;
diff --git a/debian/node_modules/bones/server/controller.suffix.js b/debian/node_modules/bones/server/controller.suffix.js
new file mode 100644
index 0000000..e490e5b
--- /dev/null
+++ b/debian/node_modules/bones/server/controller.suffix.js
@@ -0,0 +1 @@
+module.exports = controller;
diff --git a/debian/node_modules/bones/server/middleware.js b/debian/node_modules/bones/server/middleware.js
new file mode 100644
index 0000000..f9f53af
--- /dev/null
+++ b/debian/node_modules/bones/server/middleware.js
@@ -0,0 +1,101 @@
+var env = process.env.NODE_ENV || 'development';
+var host = require('os').hostname();
+
+exports = module.exports = require('express');
+
+exports['sanitizeHost'] = function sanitizeHost(app) {
+    var hosts = app.config.host;
+    if (!hosts) {
+        hosts = app.config.host = [];
+    } else if (!Array.isArray(hosts)) {
+        hosts = app.config.host = [ hosts ];
+    }
+    hosts.forEach(function(host, i) {
+        if (typeof host === 'string') {
+            hosts[i] = new RegExp('^' + hosts[i].replace(/\./g, '\\.').replace(/\*/g, '[a-z0-9_-]+') + '(:\\d+)?$', 'i');
+            // Make sure we get the original host names when stringifying the host name matcher.
+            hosts[i].toJSON = function() { return host; };
+        }
+    });
+
+    return function(req, res, next) {
+        if (!req.headers.host) {
+            return next();
+        } else if (!hosts.length) {
+            // Check that the supplied hostname is harmless. If not, we'll
+            // substitute it with the hostname reported by the machine.
+            if (/^\w([\w-]*\w)?(\.\w([\w-]*\w)?)*(:\d+)?$/.test(req.headers.host)) {
+                return next();
+            }
+        } else {
+            for (var i = 0; i < hosts.length; i++) {
+                if (hosts[i].test(req.headers.host)) {
+                    return next();
+                }
+            }
+        }
+
+        res.send(400);
+    };
+};
+
+exports['validateCSRFToken'] = function validateCSRFToken() {
+    return function(req, res, next) {
+        if (req.method === 'GET' || req.method === 'HEAD') {
+            next();
+        } else if (req.body && req.cookies['bones.token'] && req.body['bones.token'] === req.cookies['bones.token']) {
+            delete req.body['bones.token'];
+            next();
+        } else {
+            next(new Error.HTTP(403));
+        }
+    };
+};
+
+exports['fragmentRedirect'] = function fragmentRedirect() {
+    return function(req, res, next) {
+        // @see https://code.google.com/web/ajaxcrawling/docs/specification.html
+        if (req.query._escaped_fragment_ === undefined) {
+            next();
+        } else {
+            // Force the first char of the path to be a slash to prevent
+            // foreign redirects.
+            var path = '/' + req.query._escaped_fragment_.substr(1);
+            res.redirect(path, 301);
+        }
+    };
+};
+
+exports['showError'] = function showError() {
+    return function showError(err, req, res, next) {
+        if (!err.status) err.status = 500;
+
+        // Output unexpected errors to console but hide them from public eyes.
+        if (err.status >= 500) {
+            if (process.env.NODE_ENV != 'test') console.error(err.stack || err.toString());
+            if (process.env.NODE_ENV == 'production') err.message = 'Internal Server Error';
+        }
+
+        if ((req.headers.accept + '' || '').indexOf('json') >= 0) {
+            res.writeHead(err.status, { 'Content-Type': 'application/json' });
+            if (env === 'development') {
+                res.end('HEAD' == req.method ? null : JSON.stringify(err));
+            } else {
+                res.end('HEAD' == req.method ? null : JSON.stringify({ message: err.message }));
+            }
+        } else {
+            res.writeHead(err.status, { 'Content-Type': 'text/plain' });
+            if (env === 'development') {
+                res.end('HEAD' == req.method ? null : err.stack);
+            } else {
+                res.end('HEAD' == req.method ? null : err.message);
+            }
+        }
+    };
+};
+
+exports['notFound'] = function notFound() {
+    return function notFound(req, res, next) {
+        next(new Error.HTTP(404));
+    };
+};
diff --git a/debian/node_modules/bones/server/model.js b/debian/node_modules/bones/server/model.js
new file mode 100644
index 0000000..a48256b
--- /dev/null
+++ b/debian/node_modules/bones/server/model.js
@@ -0,0 +1,24 @@
+var Backbone = require('./backbone');
+var _ = require('underscore');
+
+module.exports = Backbone.Model;
+
+Backbone.Model.toString = function() {
+    return '<Model ' + this.title + '>';
+};
+
+Backbone.Model.register = function(server) {
+    // Add the controller if it's not a server-only controller.
+    this.files.forEach(function(filename) {
+        if (!(/\.server\.bones$/).test(filename) && server.assets &&
+            server.assets.models.indexOf(filename) < 0) {
+            server.assets.models.push(filename);
+        }
+    });
+
+    server.models[this.title] = this;
+};
+
+Backbone.Model.prototype.toString = function() {
+    return '[Model ' + this.constructor.title + ']';
+};
diff --git a/debian/node_modules/bones/server/model.prefix.js b/debian/node_modules/bones/server/model.prefix.js
new file mode 100644
index 0000000..35772b1
--- /dev/null
+++ b/debian/node_modules/bones/server/model.prefix.js
@@ -0,0 +1,9 @@
+var Bones = require(global.__BonesPath__ || 'bones');
+
+var $ = Bones.$, jQuery = $;
+var _ = Bones._;
+var Backbone = Bones.Backbone;
+
+var models = Bones.plugin.models;
+
+var model;
diff --git a/debian/node_modules/bones/server/model.suffix.js b/debian/node_modules/bones/server/model.suffix.js
new file mode 100644
index 0000000..ec37bdd
--- /dev/null
+++ b/debian/node_modules/bones/server/model.suffix.js
@@ -0,0 +1 @@
+module.exports = model;
diff --git a/debian/node_modules/bones/server/plugin.js b/debian/node_modules/bones/server/plugin.js
new file mode 100644
index 0000000..e3fa7ed
--- /dev/null
+++ b/debian/node_modules/bones/server/plugin.js
@@ -0,0 +1,293 @@
+var path = require('path');
+var fs = require('fs');
+var util = require('util');
+var assert = require('assert');
+var Module = require('module');
+var _ = require('underscore');
+var Bones = require('bones');
+
+var utils = Bones.utils;
+
+// Load wrappers
+var wrappers = {};
+fs.readdirSync(__dirname).forEach(function(name) {
+    var match = name.match(/^(.+)\.(prefix|suffix)\.js$/);
+    if (match) {
+        wrappers[match[1]] = wrappers[match[1]] || {};
+        wrappers[match[1]][match[2]] =
+            fs.readFileSync(path.join(__dirname, name), 'utf8')
+                .split('\n').join('');
+    }
+});
+
+require.extensions['.bones'] = function(module, filename) {
+    var content = fs.readFileSync(filename, 'utf8');
+    var kind = utils.singularize(path.basename(path.dirname(filename)));
+
+    wrappers[kind] = wrappers[kind] || {};
+    wrappers[kind].prefix = wrappers[kind].prefix || '';
+    wrappers[kind].suffix = wrappers[kind].suffix || '';
+
+    content = wrappers[kind].prefix + ';' + content + '\n;' + wrappers[kind].suffix;
+    module._compile(content, filename);
+
+    if (module.exports) {
+        Bones.plugin.add(module.exports, filename);
+    }
+};
+
+
+// Default template engine.
+require.extensions['._'] = function(module, filename) {
+    var content = fs.readFileSync(filename, 'utf8');
+    var name = path.basename(filename).replace(/\..+$/, '');
+
+    try {
+        module.exports = _.template(content);
+        Bones.plugin.add(module.exports, filename);
+    } catch (err) {
+        var lines = err.message.split('\n');
+        lines.splice(1, 0, '    in template ' + filename);
+        err.message = lines.join('\n');
+        throw err;
+    }
+
+    module.exports.register = function(app) {
+        if (app.assets && !(/\.server\._$/.test(filename))) {
+            app.assets.templates.push({
+                filename: filename,
+                content: 'template = ' + module.exports + ';'
+            });
+        }
+    };
+};
+
+
+module.exports = Plugin;
+function Plugin() {
+    this.directories = [];
+    this.order = [];
+    this.config = {};
+    this.controllers = {};
+    this.models = {};
+    this.templates = {};
+    this.views = {};
+    this.servers = {};
+    this.commands = {};
+};
+
+function alphabetical(a, b) {
+    return a.toLowerCase().localeCompare(b.toLowerCase());
+}
+
+Plugin.prototype.load = function(dir) {
+    if (this.directories.indexOf(dir) < 0) {
+        this.directories.push(dir);
+        this.require(dir, 'controllers');
+        this.require(dir, 'models');
+        this.require(dir, 'templates');
+        this.require(dir, 'views');
+        this.require(dir, 'servers');
+        this.require(dir, 'commands');
+    }
+    return this;
+};
+
+Plugin.prototype.require = function(dir, kind) {
+    dir = path.join(dir, kind);
+    try {
+        fs.readdirSync(dir).sort(alphabetical).forEach(function(name) {
+            var file = path.join(dir, name);
+            if (path.extname(file) in require.extensions &&
+                path.basename(file)[0] !== '.' &&
+                fs.statSync(file).isFile()) {
+                require(file);
+            }
+        });
+    } catch(err) {
+        if (err.code !== 'ENOENT') throw err;
+    }
+
+    return this;
+};
+
+Plugin.prototype.add = function(component, filename) {
+    if (!component.files) component.files = [];
+    component.files.push(filename);
+
+    if (!component.title) {
+        component.title = path.basename(filename).replace(/\..+$/, '');
+    }
+
+    var kind = path.basename(path.dirname(filename));
+    Bones.plugin[kind][component.title] = component;
+    Bones.plugin.order.push(filename);
+};
+
+Plugin.prototype.start = function(callback) {
+    this.argv = require('optimist').argv;
+
+    var command = this.argv._.length ? this.argv._[0] : 'start';
+    if (this.argv.help || !(command in this.commands)) {
+        this.help(callback);
+    } else {
+        var command = this.commands[command];
+        if (this.loadConfig(command)) {
+            return new command(this, callback);
+        } else if (callback) {
+            callback();
+        }
+    }
+};
+
+Plugin.prototype.loadConfig = function(command) {
+    var config = this.config;
+    command.options = command.options || {};
+
+    if (this.argv.config) {
+        try {
+            _.extend(config, JSON.parse(fs.readFileSync(this.argv.config, 'utf8')));
+        } catch(e) {
+            console.error(utils.colorize('Invalid JSON config file: ' +
+                this.argv.config, 'red'));
+            process.exit(2);
+        }
+    }
+
+    for (var key in command.options) {
+        if (!(key in config)) {
+            config[key] = command.options[key]['default'];
+        }
+        if (command.options[key]['shortcut'] in this.argv) {
+            config[key] = this.argv[command.options[key]['shortcut']];
+            delete this.argv[command.options[key]['shortcut']];
+        }
+        if (key in this.argv) {
+            config[key] = this.argv[key];
+            delete this.argv[key];
+        }
+    }
+
+    _.defaults(config, this.argv);
+
+    var showConfig = false;
+    for (var key in config) {
+        if (key === 'config' || key === '_' || key[0] === '$') {
+            delete config[key];
+        }
+        else if (key === 'show-config') {
+            showConfig = config[key];
+            delete config[key];
+        }
+        else {
+            if (!(key in command.options)) {
+                if (key in this.argv) {
+                    // It was specified on the command line.
+                     console.warn(utils.colorize('Note: Unknown option "' + key + '".', 'yellow'));
+                } else {
+                    // It's from the config file.
+                    console.warn(utils.colorize('Note: Unknown option "' + key + '" in config file.', 'yellow'));
+                }
+            } else if (command.options[key].required && typeof config[key] === 'undefined') {
+                console.warn(utils.colorize('Error: "' + key + '" is required.', 'red'));
+                process.exit(2);
+            }
+        }
+    }
+
+    for (var key in config) {
+        if (typeof config[key] === 'function') {
+            config[key] = config[key](this, config);
+        }
+    }
+
+    if (showConfig) {
+        console.warn(utils.colorize('Using configuration:', 'green'));
+        console.warn(JSON.stringify(config, false, 4));
+        return false;
+    } else {
+        return true;
+    }
+};
+
+Plugin.prototype.help = function(callback) {
+    var output = [];
+    var command = this.argv._.length ? this.argv._[0] : false;
+    if (command !== false && command in this.commands) {
+        // Display information about this command.
+        var command = this.commands[command];
+
+        output.push(['Usage: %s', utils.colorize(this.argv['$0'] + ' <command> [options...]', 'green')]);
+
+        output.push(['Commands: ' + command.description]);
+
+        var usage = command.usage || [''];
+        _(_.isArray(usage) ? usage : [usage]).each(function(item) {
+            output.push([
+                '  %s %s',
+                utils.colorize(command.title, 'yellow', 'bold'),
+                utils.colorize(item, 'yellow')
+            ]);
+        });
+
+        output.push(['\nOptions:']);
+        var options = [];
+        for (var key in command.options) {
+            var option = command.options[key];
+            var required = '';
+            if (option.required) {
+                required = utils.colorize('(Required)', 'default', 'bold');
+            } else {
+                var value = option['default'];
+                if (typeof value === 'function') value = value(this);
+                required = '(Default: ' + JSON.stringify(value) +')';
+            }
+
+            options.push([
+                option.shortcut ? '-' + option.shortcut : '',
+                '--' + (option.title || key),
+                (option.description ? option.description + ' ' : '') + required
+            ]);
+        }
+        options.push([ '', '--config=[path]', 'Path to JSON configuration file.' ]);
+
+        table(options).forEach(function(line) { output.push(line); });
+    } else {
+        // Display information about all available commands.
+        output.push(['Usage: %s for a list of options.', utils.colorize(this.argv['$0'] + ' ' + (command || '[command]') + ' --help', 'green')]);
+        output.push(['Available commands are:']);
+        var commands = [];
+        for (var key in this.commands) {
+            commands.push([ this.commands[key].title + ':', this.commands[key].description || '']);
+        }
+        table(commands).forEach(function(line) { output.push(line); });
+    }
+
+    if (callback) {
+        callback(output);
+    } else {
+        output.forEach(function(params) {
+            console.warn.apply(console, params);
+        });
+        process.exit(1);
+    }
+};
+
+function table(fields) {
+    var output = [];
+    if (!fields[0]) return output;
+    var lengths = fields[0].map(function(val, i) {
+        return Math.max.apply(Math, fields.map(function(field) {
+            return field[i].length;
+        }));
+    });
+    fields.forEach(function(field) {
+        output.push([
+            '  ' + field.map(function(val, i) {
+                if (i >= lengths.length - 1) return val;
+                return val + Array(lengths[i] - val.length + 1).join(' ');
+            }).join('  ')
+        ]);
+    });
+    return output;
+};
diff --git a/debian/node_modules/bones/server/server.js b/debian/node_modules/bones/server/server.js
new file mode 100644
index 0000000..aaa14f5
--- /dev/null
+++ b/debian/node_modules/bones/server/server.js
@@ -0,0 +1,51 @@
+var Backbone = require('./backbone');
+var _ = require('underscore');
+var HTTPServer = require('express').HTTPServer;
+var middleware = require('..').middleware;
+
+module.exports = Server;
+function Server(plugin) {
+    HTTPServer.call(this, []);
+    this.plugin = plugin;
+    this.initialize.apply(this, arguments);
+    this.conclude.apply(this, arguments);
+};
+
+Server.prototype.__proto__ = HTTPServer.prototype;
+
+_.extend(Server.prototype, Backbone.Events, {
+    initialize : function(plugin) {},
+
+    conclude: function(plugin) {
+        // Add catchall 404 middleware and error handler for root servers.
+        if (this.port) {
+            this.use(middleware.notFound());
+            this.error(middleware.showError());
+        // Remove redundant frontmost middleware from each server that will not
+        // be a root server. See `express/lib/http.js`.
+        } else {
+            this.stack.shift();
+        }
+    },
+
+    port: null,
+
+    start: function(callback) {
+        this.port && this.listen(this.port, callback);
+        return this;
+    },
+
+    toString: function() {
+        if (this.port) {
+            return '[Server ' + this.constructor.title + ':' + this.address().port + ']';
+        } else {
+            return '[Server ' + this.constructor.title + ']';
+        }
+    }
+});
+
+Server.augment = Backbone.Controller.augment;
+Server.extend = Backbone.Controller.extend;
+Server.toString = function() {
+    return '<Server ' + this.title + '>';
+};
diff --git a/debian/node_modules/bones/server/server.prefix.js b/debian/node_modules/bones/server/server.prefix.js
new file mode 100644
index 0000000..a26ad78
--- /dev/null
+++ b/debian/node_modules/bones/server/server.prefix.js
@@ -0,0 +1,15 @@
+var Bones = require(global.__BonesPath__ || 'bones');
+
+var $ = Bones.$, jQuery = $;
+var _ = Bones._;
+var Backbone = Bones.Backbone;
+var middleware = Bones.middleware;
+var mirror = Bones.mirror;
+
+var models = Bones.plugin.models;
+var views = Bones.plugin.views;
+var controllers = Bones.plugin.controllers;
+var templates = Bones.plugin.templates;
+var servers = Bones.plugin.servers;
+
+var server;
diff --git a/debian/node_modules/bones/server/server.suffix.js b/debian/node_modules/bones/server/server.suffix.js
new file mode 100644
index 0000000..e9d0133
--- /dev/null
+++ b/debian/node_modules/bones/server/server.suffix.js
@@ -0,0 +1 @@
+module.exports = server;
diff --git a/debian/node_modules/bones/server/utils.js b/debian/node_modules/bones/server/utils.js
new file mode 100644
index 0000000..cb52ac2
--- /dev/null
+++ b/debian/node_modules/bones/server/utils.js
@@ -0,0 +1,102 @@
+var utils = module.exports = require('../shared/utils');
+var fs = require('fs');
+var http = require('http');
+var path = require('path');
+var tty = require('tty');
+
+var bones = require('..');
+
+var colors = {
+    'default': 1,
+    black: 30,
+    red: 31,
+    green: 32,
+    yellow: 33,
+    blue: 34,
+    purple: 35,
+    cyan: 36,
+    white: 37
+};
+
+var styles = {
+    regular: 0,
+    bold: 1,
+    underline: 4
+};
+
+if (tty.isatty(process.stdout.fd) && tty.isatty(process.stderr.fd)) {
+    utils.colorize = function(text, color, style) {
+        color = color || 'red';
+        style = style || 'regular';
+        return "\033[" + styles[style] + ";" + colors[color] + "m" + text + "\033[0m";
+    };
+} else {
+    utils.colorize = function(text) { return text; };
+}
+
+
+// Load client-side wrappers
+var wrappers = {};
+var wrapperDir = path.join(__dirname, '../client');
+fs.readdirSync(wrapperDir).forEach(function(name) {
+    var match = name.match(/^(.+)\.(prefix|suffix)\.js$/);
+    if (match) {
+        wrappers[match[1]] = wrappers[match[1]] || {};
+        wrappers[match[1]][match[2]] =
+            fs.readFileSync(path.join(wrapperDir, name), 'utf8');
+    }
+});
+
+// Remove common prefix between the working directory and filename so that we don't
+// leak information about the directory structure.
+utils.removePrefix = function(str) {
+    var prefix = process.cwd().split('/');
+    str = str.split('/');
+    while (prefix.length && str[0] === prefix[0]) {
+        str.shift();
+        prefix.shift();
+    }
+    return str.join('/');
+};
+
+
+utils.wrapClientFile = function(content, filename) {
+    var kind = utils.singularize(path.basename(path.dirname(filename)));
+    var name = path.basename(filename).replace(/\..+$/, '');
+    var file = utils.removePrefix(filename);
+
+    wrappers[kind] = wrappers[kind] || {};
+    wrappers[kind].prefix = wrappers[kind].prefix || '';
+    wrappers[kind].suffix = wrappers[kind].suffix || '';
+
+    return wrappers[kind].prefix.replace(/__NAME__/g, name).replace(/__FILE__/g, file) +
+           "\n" + content + "\n" +
+           wrappers[kind].suffix.replace(/__NAME__/g, name).replace(/__FILE__/g, file);
+};
+
+utils.sortByLoadOrder = function(assets) {
+    var reference = bones.plugin.order;
+    assets.sort(function loadOrderSort(a, b) {
+        a = reference.indexOf(a);
+        b = reference.indexOf(b);
+        return (a < 0 || b < 0) ? b - a : a - b;
+    });
+};
+
+
+Error.HTTP = function(message, status) {
+    if (typeof message === 'number') {
+        status = message;
+        message = null;
+    }
+    if (!message) {
+        message = http.STATUS_CODES[status] || 'Unknown';
+    }
+
+    Error.call(this, message);
+    Error.captureStackTrace(this, arguments.callee);
+    this.message = message;
+    this.status = status;
+};
+
+Error.HTTP.prototype.__proto__ = Error.prototype;
diff --git a/debian/node_modules/bones/server/view.js b/debian/node_modules/bones/server/view.js
new file mode 100644
index 0000000..0314dd3
--- /dev/null
+++ b/debian/node_modules/bones/server/view.js
@@ -0,0 +1,38 @@
+var Backbone = require('./backbone');
+var $ = require('jquery');
+var _ = require('underscore');
+
+module.exports = Backbone.View;
+
+Backbone.View.toString = function() {
+    return '<View ' + this.title + '>';
+};
+
+Backbone.View.prototype.toString = function() {
+    return '[View ' + this.constructor.title + ']';
+};
+
+Backbone.View.register = function(server) {
+    // Add the views if it's not a server-only view.
+    this.files.forEach(function(filename) {
+        if (!(/\.server\.bones$/).test(filename) && server.assets &&
+            server.assets.views.indexOf(filename) < 0) {
+            server.assets.views.push(filename);
+        }
+    });
+
+    server.views[this.title] = this;
+};
+
+Backbone.View.prototype.delegateEvents = function() {};
+
+Backbone.View.prototype.template = function(template, data) {
+    throw new Error('not supported');
+};
+
+Backbone.View.prototype.make = function(tagName, attributes, content) {
+    var el = $('<' + tagName + '>');
+    if (attributes) $(el).attr(attributes);
+    if (content) $(el).html(content);
+    return el;
+};
diff --git a/debian/node_modules/bones/server/view.prefix.js b/debian/node_modules/bones/server/view.prefix.js
new file mode 100644
index 0000000..fb747fa
--- /dev/null
+++ b/debian/node_modules/bones/server/view.prefix.js
@@ -0,0 +1,11 @@
+var Bones = require(global.__BonesPath__ || 'bones');
+
+var $ = Bones.$, jQuery = $;
+var _ = Bones._;
+var Backbone = Bones.Backbone;
+
+var models = Bones.plugin.models;
+var views = Bones.plugin.views;
+var templates = Bones.plugin.templates;
+
+var view;
diff --git a/debian/node_modules/bones/server/view.suffix.js b/debian/node_modules/bones/server/view.suffix.js
new file mode 100644
index 0000000..4fe776f
--- /dev/null
+++ b/debian/node_modules/bones/server/view.suffix.js
@@ -0,0 +1 @@
+module.exports = view;
diff --git a/debian/node_modules/bones/servers/Asset.bones b/debian/node_modules/bones/servers/Asset.bones
new file mode 100644
index 0000000..e15dc8b
--- /dev/null
+++ b/debian/node_modules/bones/servers/Asset.bones
@@ -0,0 +1,16 @@
+var fs = require('fs'),
+    path = require('path'),
+    middleware = require('express'),
+    env = process.env.NODE_ENV || 'development';
+
+server = Bones.Server.extend({});
+
+server.prototype.initialize = function(app) {
+    app.directories.forEach(function(dir) {
+        var pkg = JSON.parse(fs.readFileSync(path.join(dir, 'package.json'), 'utf8'));
+        this.use('/assets/' + pkg.name, middleware['static'](
+            path.join(dir, 'assets'),
+            { maxAge: env === 'production' ? 3600 * 1000 : 0 } // 1 hour
+        ));
+    }, this);
+};
diff --git a/debian/node_modules/bones/servers/Core.bones b/debian/node_modules/bones/servers/Core.bones
new file mode 100644
index 0000000..c3e2c1a
--- /dev/null
+++ b/debian/node_modules/bones/servers/Core.bones
@@ -0,0 +1,27 @@
+var env = process.env.NODE_ENV || 'development';
+var middleware = require('..').middleware;
+
+server = Bones.Server.extend({});
+
+server.prototype.port = 3000;
+
+server.prototype.initialize = function(app) {
+    this.port = app.config.port || this.port;
+
+    // Middleware provides body decoding, CSRF validation et al.
+    // Place other servers before this one ONLY when you intend to circumvent
+    // these safeguards.
+    this.use(new servers['Middleware'](app));
+
+    // Debugging server provides facilities for easier client side debugging.
+    if (env === 'development') {
+        this.use(new servers['Debug'](app));
+    }
+
+    // The Route server provides default routes for /api/Model as well as
+    // the /assets/bones routes.
+    this.use(new servers['Route'](app));
+
+    // The Asset server provides each plugin's asset folder at /asset/pluginname.
+    this.use(new servers['Asset'](app));
+};
diff --git a/debian/node_modules/bones/servers/Debug.bones b/debian/node_modules/bones/servers/Debug.bones
new file mode 100644
index 0000000..bddba93
--- /dev/null
+++ b/debian/node_modules/bones/servers/Debug.bones
@@ -0,0 +1,16 @@
+var env = process.env.NODE_ENV || 'development';
+
+server = Bones.Server.extend({
+    initialize: function(app) {
+        _.bindAll(this, 'logError');
+        if (env === 'development') {
+            this.get('/api/Error', this.logError);
+        }
+    },
+
+    logError: function(req, res, next) {
+        console.error("Client Error: %s\n    at %s:%d",
+            req.query.message, req.query.url, req.query.line);
+        res.send();
+    }
+});
diff --git a/debian/node_modules/bones/servers/Middleware.bones b/debian/node_modules/bones/servers/Middleware.bones
new file mode 100644
index 0000000..59c4cf4
--- /dev/null
+++ b/debian/node_modules/bones/servers/Middleware.bones
@@ -0,0 +1,11 @@
+var middleware = require('..').middleware;
+
+server = Bones.Server.extend({});
+
+server.prototype.initialize = function(app) {
+    this.use(middleware.sanitizeHost(app));
+    this.use(middleware.bodyParser());
+    this.use(middleware.cookieParser());
+    this.use(middleware.validateCSRFToken());
+    this.use(middleware.fragmentRedirect());
+};
diff --git a/debian/node_modules/bones/servers/Route.bones b/debian/node_modules/bones/servers/Route.bones
new file mode 100644
index 0000000..606e544
--- /dev/null
+++ b/debian/node_modules/bones/servers/Route.bones
@@ -0,0 +1,155 @@
+var env = process.env.NODE_ENV || 'development';
+var headers = { 'Content-Type': 'application/json' };
+
+server = Bones.Server.extend({});
+
+var options = {
+    type: '.js',
+    wrapper: Bones.utils.wrapClientFile,
+    sort: Bones.utils.sortByLoadOrder
+};
+
+// TODO for Bones 1.4: This should be moved to the initialize method!
+server.prototype.assets = {
+    vendor: new mirror([
+        require.resolve('bones/assets/jquery'),
+        require.resolve('underscore'),
+        require.resolve('backbone')
+    ], { type: '.js' }),
+    core: new mirror([
+        require.resolve('bones/shared/utils'),
+        require.resolve('bones/client/utils'),
+        require.resolve('bones/shared/backbone'),
+        require.resolve('bones/client/backbone')
+    ], { type: '.js' }),
+    models: new mirror([], options),
+    views: new mirror([], options),
+    controllers: new mirror([], options),
+    templates: new mirror([], options)
+};
+
+if (env === 'development') {
+    server.prototype.assets.core.unshift(require.resolve('bones/assets/debug'));
+}
+
+// TODO for Bones 1.4: This should be moved to the initialize method!
+server.prototype.assets.all = new mirror([
+    server.prototype.assets.vendor,
+    server.prototype.assets.core,
+    server.prototype.assets.controllers,
+    server.prototype.assets.models,
+    server.prototype.assets.views,
+    server.prototype.assets.templates
+], { type: '.js' });
+
+// Stores models, views served by this server.
+// TODO for Bones 1.4: This should be moved to the initialize method!
+server.prototype.models = {};
+server.prototype.views = {};
+
+// Stores instances of controllers registered with this server.
+// TODO for Bones 1.4: This should be moved to the initialize method!
+server.prototype.controllers = {};
+
+server.prototype.initialize = function(app) {
+    this.registerComponents(app);
+    this.initializeAssets(app);
+    this.initializeModels(app);
+};
+
+server.prototype.registerComponents = function(app) {
+    var components = ['controllers', 'models', 'views', 'templates'];
+    components.forEach(function(kind) {
+        for (var name in app[kind]) {
+            app[kind][name].register(this);
+        }
+    }, this);
+};
+
+server.prototype.initializeAssets = function(app) {
+    this.get('/assets/bones/vendor.js', this.assets.vendor.handler);
+    this.get('/assets/bones/core.js', this.assets.core.handler);
+    this.get('/assets/bones/controllers.js', this.assets.controllers.handler);
+    this.get('/assets/bones/models.js', this.assets.models.handler);
+    this.get('/assets/bones/views.js', this.assets.views.handler);
+    this.get('/assets/bones/templates.js', this.assets.templates.handler);
+
+    this.get('/assets/bones/all.js', this.assets.all.handler);
+};
+
+server.prototype.initializeModels = function(app) {
+    this.models = app.models;
+    _.bindAll(this, 'loadModel', 'getModel', 'saveModel', 'delModel', 'loadCollection');
+    this.get('/api/:model/:id', [this.loadModel, this.getModel]);
+    this.post('/api/:model', [this.loadModel, this.saveModel]);
+    this.put('/api/:model/:id', [this.loadModel, this.saveModel]);
+    this.del('/api/:model/:id', [this.loadModel, this.delModel]);
+    this.get('/api/:collection', this.loadCollection.bind(this));
+};
+
+server.prototype.loadCollection = function(req, res, next) {
+    var name = Bones.utils.pluralize(req.params.collection);
+    if (name in this.models) {
+        // Pass any querystring paramaters to the collection.
+        req.collection = new this.models[name]([], req.query);
+        req.collection.fetch({
+            success: function(collection, resp) {
+                res.send(resp, headers);
+            },
+            error: function(collection, err) {
+                var error = err instanceof Object ? err.message : err;
+                next(new Error.HTTP(error, err && err.status || 500));
+            }
+        });
+    } else {
+        next();
+    }
+};
+
+server.prototype.loadModel = function(req, res, next) {
+    var name = req.params.model;
+    if (name in this.models) {
+        // Pass any querystring paramaters to the model.
+        req.model = new this.models[name]({ id: req.params.id }, req.query);
+    }
+    next();
+};
+
+server.prototype.getModel = function(req, res, next) {
+    if (!req.model) return next();
+    req.model.fetch({
+        success: function(model, resp) {
+            res.send(resp, headers);
+        },
+        error: function(model, err) {
+            var error = err instanceof Object ? err.message : err;
+            next(new Error.HTTP(error, err && err.status || 404));
+        }
+    });
+};
+
+server.prototype.saveModel = function(req, res, next) {
+    if (!req.model) return next();
+    req.model.save(req.body, {
+        success: function(model, resp) {
+            res.send(resp, headers);
+        },
+        error: function(model, err) {
+            var error = err instanceof Object ? err.message : err;
+            next(new Error.HTTP(error, err && err.status || 409));
+        }
+    });
+};
+
+server.prototype.delModel = function(req, res, next) {
+    if (!req.model) return next();
+    req.model.destroy({
+        success: function(model, resp) {
+            res.send({}, headers);
+        },
+        error: function(model, err) {
+            var error = err instanceof Object ? err.message : err;
+            next(new Error.HTTP(error, err && err.status || 409));
+        }
+    });
+};
diff --git a/debian/node_modules/bones/shared/backbone.js b/debian/node_modules/bones/shared/backbone.js
new file mode 100644
index 0000000..970f30c
--- /dev/null
+++ b/debian/node_modules/bones/shared/backbone.js
@@ -0,0 +1,38 @@
+if (typeof process !== 'undefined' && process.versions && process.versions.node) {
+    module.exports = Backbone = require('backbone');
+    _ = require('underscore');
+    $ = require('jquery');
+}
+
+Backbone.Model.augment = Backbone.Collection.augment =
+Backbone.Controller.augment = Backbone.View.augment = function(props) {
+    var obj = this.prototype;
+    for (var key in props) {
+        if (typeof props[key] === 'function') {
+            obj[key] = _.wrap(obj[key], props[key]);
+        } else if (_.isArray(props[key])) {
+            obj[key] = _.isArray(obj[key]) ? obj[key].concat(props[key]) : props[key];
+        } else if (typeof props[key] === 'object') {
+            obj[key] = _.extend({}, obj[key], props[key]);
+        } else {
+            obj[key] = props[key];
+        }
+    }
+
+    return this;
+};
+
+var extend = Backbone.Controller.extend;
+Backbone.Model.extend = Backbone.Collection.extend =
+Backbone.Controller.extend = Backbone.View.extend = function() {
+    var child = extend.apply(this, arguments);
+    for (var key in this) {
+        if (key === '__super__' || key === 'prototype' || key === 'title') continue;
+        child[key] = this[key];
+    }
+    return child;
+};
+
+Backbone.View.prototype.html = function() {
+    return $(this.el).html();
+};
diff --git a/debian/node_modules/bones/shared/utils.js b/debian/node_modules/bones/shared/utils.js
new file mode 100644
index 0000000..5a5ab13
--- /dev/null
+++ b/debian/node_modules/bones/shared/utils.js
@@ -0,0 +1,118 @@
+var Bones = Bones || {};
+Bones.utils = Bones.utils || {};
+
+if (typeof process !== 'undefined' && process.versions && process.versions.node) {
+    module.exports = Bones.utils;
+}
+
+Bones.utils.callback = function(callback) {
+    return {
+        success: function(model, response) { callback(null, response); },
+        error: function(model, err) { callback(err); }
+    };
+};
+
+// Multifetch. Pass a hash of models and fetch each in parallel.
+Bones.utils.fetch = function(models, callback) {
+    var remaining = _(models).size();
+    var error = null;
+    _(models).each(function(model) {
+        model.fetch({
+            success: function() {
+                if (--remaining === 0) callback(error, models);
+            },
+            error: function(m, err) {
+                if (!error) error = err;
+                model.error = err;
+                if (--remaining === 0) callback(error, models);
+            }
+        });
+    });
+};
+
+// From https://github.com/visionmedia/lingo/blob/master/lib/languages/en.js
+Bones.utils.uncountable = [ 'advice', 'enegery', 'excretion', 'digestion',
+    'cooperation', 'health', 'justice', 'jeans', 'labour', 'machinery',
+    'equipment', 'information', 'pollution', 'sewage', 'paper', 'money',
+    'species', 'series', 'rain', 'rice', 'fish', 'sheep', 'moose', 'deer',
+    'bison', 'proceedings', 'shears', 'pincers', 'breeches', 'hijinks',
+    'clippers', 'chassis', 'innings', 'elk', 'rhinoceros', 'swine', 'you',
+    'news' ];
+
+Bones.utils.singularize = function(text) {
+    if (Bones.utils.uncountable.indexOf(text.toLowerCase()) >= 0) return text;
+    for (var i = Bones.utils.singularize.rules.length - 1; i >= 0; i--) {
+        var rule = Bones.utils.singularize.rules[i];
+        if (rule[0].test(text)) {
+            return text.replace(rule[0], rule[1]);
+        }
+    }
+    return text;
+};
+
+// From https://github.com/visionmedia/lingo/blob/master/lib/languages/en.js
+Bones.utils.singularize.rules = [
+    [ (/s$/i), "" ],
+    [ (/(bu|mis|kis)s$/i), "$1s" ],
+    [ (/([ti])a$/i), "$1um" ],
+    [ (/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i), "$1$2sis" ],
+    [ (/(^analy)ses$/i), "$1sis" ],
+    [ (/([^f])ves$/i), "$1fe" ],
+    [ (/([lr])ves$/i), "$1f" ],
+    [ (/([^aeiouy]|qu)ies$/i), "$1y" ],
+    [ (/ies$/i), "ie" ],
+    [ (/(x|ch|ss|sh)es$/i), "$1" ],
+    [ (/([m|l])ice$/i), "$1ouse" ],
+    [ (/(bus)es$/i), "$1" ],
+    [ (/(o)es$/i), "$1" ],
+    [ (/(shoe)s$/i), "$1" ],
+    [ (/(cris|ax|test)es$/i), "$1is" ],
+    [ (/(octop|vir)i$/i), "$1us" ],
+    [ (/(alias|status)es$/i), "$1" ],
+    [ (/^(ox)en/i), "$1" ],
+    [ (/(vert|ind)ices$/i), "$1ex" ],
+    [ (/(matr)ices$/i), "$1ix" ],
+    [ (/(quiz)zes$/i), "$1" ],
+    [ (/^(p)eople$/i), "$erson" ],
+    [ (/^(m)en$/i), "$1an" ],
+    [ (/^(child)ren$/i), "$1" ],
+    [ (/^(move)s$/i), "$1" ],
+    [ (/^(sex)$es/i), "$1" ]
+];
+
+
+Bones.utils.pluralize = function(text) {
+    if (Bones.utils.uncountable.indexOf(text.toLowerCase()) >= 0) return text;
+    for (var i = Bones.utils.pluralize.rules.length - 1; i >= 0; i--) {
+        var rule = Bones.utils.pluralize.rules[i];
+        if (rule[0].test(text)) {
+            return text.replace(rule[0], rule[1]);
+        }
+    }
+    return text;
+
+};
+
+// From https://github.com/visionmedia/lingo/blob/master/lib/languages/en.js
+Bones.utils.pluralize.rules = [
+    [ (/$/), "s" ],
+    [ (/(s|ss|sh|ch|x|o)$/i), "$1es" ],
+    [ (/y$/i), "ies" ],
+    [ (/(o|e)y$/i), "$1ys" ],
+    [ (/(octop|vir)us$/i), "$1i" ],
+    [ (/(alias|status)$/i), "$1es" ],
+    [ (/(bu)s$/i), "$1ses" ],
+    [ (/([ti])um$/i), "$1a" ],
+    [ (/sis$/i), "ses" ],
+    [ (/(?:([^f])fe|([lr])f)$/i), "$1$2ves" ],
+    [ (/([^aeiouy]|qu)y$/i), "$1ies" ],
+    [ (/(matr|vert|ind)(?:ix|ex)$/i), "$1ices" ],
+    [ (/([m|l])ouse$/i), "$1ice" ],
+    [ (/^(ox)$/i), "$1en" ],
+    [ (/(quiz)$/i), "$1zes" ],
+    [ (/^(p)erson$/i), "$1eople" ],
+    [ (/^(m)an$/i), "$1en" ],
+    [ (/^(child)$/i), "$1ren" ],
+    [ (/^(move)$/i), "$1s" ],
+    [ (/^(sex)$/i), "$1es" ]
+];

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/tilemill.git



More information about the Pkg-grass-devel mailing list